mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-29 08:27:03 +01:00
Better line breaking
This commit is contained in:
parent
2bf9672d92
commit
0ca388141c
5 changed files with 94 additions and 27 deletions
|
@ -21,6 +21,7 @@ import com.simibubi.create.content.contraptions.components.flywheel.engine.Engin
|
||||||
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
|
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
|
||||||
import com.simibubi.create.content.curiosities.tools.AllToolTiers;
|
import com.simibubi.create.content.curiosities.tools.AllToolTiers;
|
||||||
import com.simibubi.create.foundation.item.ItemDescription.Palette;
|
import com.simibubi.create.foundation.item.ItemDescription.Palette;
|
||||||
|
import com.simibubi.create.foundation.utility.FontHelper;
|
||||||
import com.simibubi.create.foundation.utility.Lang;
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
@ -88,30 +89,8 @@ public class TooltipHelper {
|
||||||
words.add(word);
|
words.add(word);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply hard wrap
|
|
||||||
FontRenderer font = Minecraft.getInstance().fontRenderer;
|
FontRenderer font = Minecraft.getInstance().fontRenderer;
|
||||||
List<String> lines = new LinkedList<>();
|
List<String> lines = FontHelper.cutString(font, markedUp, maxWidthPerLine);
|
||||||
StringBuilder currentLine = new StringBuilder();
|
|
||||||
int width = 0;
|
|
||||||
for (String word : words) {
|
|
||||||
int newWidth = font.getStringWidth(word);
|
|
||||||
if (width + newWidth > maxWidthPerLine) {
|
|
||||||
if (width > 0) {
|
|
||||||
String line = currentLine.toString();
|
|
||||||
lines.add(line);
|
|
||||||
currentLine = new StringBuilder();
|
|
||||||
width = 0;
|
|
||||||
} else {
|
|
||||||
lines.add(word);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
currentLine.append(word);
|
|
||||||
width += newWidth;
|
|
||||||
}
|
|
||||||
if (width > 0) {
|
|
||||||
lines.add(currentLine.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format
|
// Format
|
||||||
String lineStart = Strings.repeat(" ", indent);
|
String lineStart = Strings.repeat(" ", indent);
|
||||||
|
|
|
@ -25,6 +25,7 @@ import com.simibubi.create.foundation.ponder.content.PonderTagScreen;
|
||||||
import com.simibubi.create.foundation.ponder.ui.PonderButton;
|
import com.simibubi.create.foundation.ponder.ui.PonderButton;
|
||||||
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
|
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
|
||||||
import com.simibubi.create.foundation.utility.ColorHelper;
|
import com.simibubi.create.foundation.utility.ColorHelper;
|
||||||
|
import com.simibubi.create.foundation.utility.FontHelper;
|
||||||
import com.simibubi.create.foundation.utility.Iterate;
|
import com.simibubi.create.foundation.utility.Iterate;
|
||||||
import com.simibubi.create.foundation.utility.Lang;
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
|
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
|
||||||
|
@ -486,7 +487,7 @@ public class PonderUI extends AbstractSimiScreen {
|
||||||
RenderSystem.translated(x, y, 0);
|
RenderSystem.translated(x, y, 0);
|
||||||
RenderSystem.rotatef(indexDiff * -75, 1, 0, 0);
|
RenderSystem.rotatef(indexDiff * -75, 1, 0, 0);
|
||||||
RenderSystem.translated(0, 0, 5);
|
RenderSystem.translated(0, 0, 5);
|
||||||
font.drawSplitString(title, 0, 0, left.x - 51, ColorHelper.applyAlpha(textColor, 1 - indexDiff));
|
FontHelper.drawSplitString(font, title, 0, 0, left.x - 51, ColorHelper.applyAlpha(textColor, 1 - indexDiff));
|
||||||
RenderSystem.popMatrix();
|
RenderSystem.popMatrix();
|
||||||
|
|
||||||
if (chapter != null) {
|
if (chapter != null) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import com.simibubi.create.foundation.ponder.PonderUI;
|
||||||
import com.simibubi.create.foundation.ponder.ui.ChapterLabel;
|
import com.simibubi.create.foundation.ponder.ui.ChapterLabel;
|
||||||
import com.simibubi.create.foundation.ponder.ui.LayoutHelper;
|
import com.simibubi.create.foundation.ponder.ui.LayoutHelper;
|
||||||
import com.simibubi.create.foundation.ponder.ui.PonderButton;
|
import com.simibubi.create.foundation.ponder.ui.PonderButton;
|
||||||
|
import com.simibubi.create.foundation.utility.FontHelper;
|
||||||
import com.simibubi.create.foundation.utility.Lang;
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
@ -197,7 +198,7 @@ public class PonderTagScreen extends AbstractSimiScreen {
|
||||||
|
|
||||||
PonderUI.renderBox(x - 3, y - 3, w + 6, h + 6, false);
|
PonderUI.renderBox(x - 3, y - 3, w + 6, h + 6, false);
|
||||||
RenderSystem.translated(0, 0, 100);
|
RenderSystem.translated(0, 0, 100);
|
||||||
font.drawSplitString(desc, x, y, w, 0xeeeeee);
|
FontHelper.drawSplitString(font, desc, x, y, w, 0xeeeeee);
|
||||||
RenderSystem.popMatrix();
|
RenderSystem.popMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ import com.simibubi.create.foundation.ponder.PonderScene;
|
||||||
import com.simibubi.create.foundation.ponder.PonderUI;
|
import com.simibubi.create.foundation.ponder.PonderUI;
|
||||||
import com.simibubi.create.foundation.ponder.content.PonderPalette;
|
import com.simibubi.create.foundation.ponder.content.PonderPalette;
|
||||||
import com.simibubi.create.foundation.utility.ColorHelper;
|
import com.simibubi.create.foundation.utility.ColorHelper;
|
||||||
|
import com.simibubi.create.foundation.utility.FontHelper;
|
||||||
|
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.math.Vec2f;
|
import net.minecraft.util.math.Vec2f;
|
||||||
|
@ -120,8 +121,8 @@ public class TextWindowElement extends AnimatedOverlayElement {
|
||||||
RenderSystem.popMatrix();
|
RenderSystem.popMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
screen.getFontRenderer()
|
FontHelper.drawSplitString(screen.getFontRenderer(), bakedText, targetX - 10, 3, textWidth,
|
||||||
.drawSplitString(bakedText, targetX - 10, 3, textWidth, ColorHelper.applyAlpha(brighterColor, fade));
|
ColorHelper.applyAlpha(brighterColor, fade));
|
||||||
RenderSystem.popMatrix();
|
RenderSystem.popMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
package com.simibubi.create.foundation.utility;
|
||||||
|
|
||||||
|
import java.text.BreakIterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.FontRenderer;
|
||||||
|
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||||
|
import net.minecraft.client.renderer.Matrix4f;
|
||||||
|
import net.minecraft.client.renderer.Tessellator;
|
||||||
|
import net.minecraft.client.renderer.TransformationMatrix;
|
||||||
|
import net.minecraftforge.client.MinecraftForgeClient;
|
||||||
|
|
||||||
|
public final class FontHelper {
|
||||||
|
|
||||||
|
private FontHelper() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<String> cutString(FontRenderer font, String text, int maxWidthPerLine) {
|
||||||
|
// Split words
|
||||||
|
List<String> words = new LinkedList<>();
|
||||||
|
BreakIterator iterator = BreakIterator.getLineInstance(MinecraftForgeClient.getLocale());
|
||||||
|
iterator.setText(text);
|
||||||
|
int start = iterator.first();
|
||||||
|
for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) {
|
||||||
|
String word = text.substring(start, end);
|
||||||
|
words.add(word);
|
||||||
|
}
|
||||||
|
// Apply hard wrap
|
||||||
|
List<String> lines = new LinkedList<>();
|
||||||
|
StringBuilder currentLine = new StringBuilder();
|
||||||
|
int width = 0;
|
||||||
|
for (String word : words) {
|
||||||
|
int newWidth = font.getStringWidth(word);
|
||||||
|
if (width + newWidth > maxWidthPerLine) {
|
||||||
|
if (width > 0) {
|
||||||
|
String line = currentLine.toString();
|
||||||
|
lines.add(line);
|
||||||
|
currentLine = new StringBuilder();
|
||||||
|
width = 0;
|
||||||
|
} else {
|
||||||
|
lines.add(word);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentLine.append(word);
|
||||||
|
width += newWidth;
|
||||||
|
}
|
||||||
|
if (width > 0) {
|
||||||
|
lines.add(currentLine.toString());
|
||||||
|
}
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void drawSplitString(FontRenderer font, String text, int x, int y, int width, int color) {
|
||||||
|
List<String> list = cutString(font, text, width);
|
||||||
|
Matrix4f matrix4f = TransformationMatrix.identity().getMatrix();
|
||||||
|
|
||||||
|
for (String s : list) {
|
||||||
|
float f = (float) x;
|
||||||
|
if (font.getBidiFlag()) {
|
||||||
|
int i = font.getStringWidth(font.bidiReorder(s));
|
||||||
|
f += (float) (width - i);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw(font, s, f, (float) y, color, matrix4f, false);
|
||||||
|
y += 9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int draw(FontRenderer font, String p_228078_1_, float p_228078_2_, float p_228078_3_,
|
||||||
|
int p_228078_4_, Matrix4f p_228078_5_, boolean p_228078_6_) {
|
||||||
|
if (p_228078_1_ == null) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
IRenderTypeBuffer.Impl irendertypebuffer$impl = IRenderTypeBuffer
|
||||||
|
.immediate(Tessellator.getInstance().getBuffer());
|
||||||
|
int i = font.draw(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_,
|
||||||
|
irendertypebuffer$impl, false, 0, 15728880);
|
||||||
|
irendertypebuffer$impl.draw();
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue