/*
- * Sixth 3D engine. Author: Svjatoslav Agejenko.
+ * Sixth 3D engine. Author: Svjatoslav Agejenko.
* This project is released under Creative Commons Zero (CC0) license.
*/
package eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.textcanvas;
import static eu.svjatoslav.sixth.e3d.renderer.raster.Color.BLACK;
import static eu.svjatoslav.sixth.e3d.renderer.raster.Color.WHITE;
+import static java.lang.Math.PI;
+import static java.lang.Math.abs;
public class TextCanvas extends TexturedRectangle {
- // character size in world coordinates
+ /**
+ * Font character width in world coordinates.
+ */
public static final int FONT_CHAR_WIDTH = 8;
+
+ /**
+ * Font character height in world coordinates.
+ */
public static final int FONT_CHAR_HEIGHT = 16;
- // character size on texture
+ /**
+ * Font character width in texture pixels.
+ */
public static final int FONT_CHAR_WIDTH_TEXTURE_PIXELS = 16;
+
+ /**
+ * Font character height in texture pixels.
+ */
public static final int FONT_CHAR_HEIGHT_TEXTURE_PIXELS = 32;
- public static final Font FONT = CanvasCharacter.getFont((int)(FONT_CHAR_HEIGHT_TEXTURE_PIXELS / 1.066));
+ public static final Font FONT = CanvasCharacter.getFont((int) (FONT_CHAR_HEIGHT_TEXTURE_PIXELS / 1.066));
private static final String GROUP_TEXTURE = "texture";
private static final String GROUP_CHARACTERS = "characters";
private final TextPointer size;
@Override
public void beforeTransformHook(final TransformsStack transformPipe,
final RenderingContext context) {
+ ensureOptimalRenderMode(context);
+ }
- final double textRelativeSize = context.width
- / getRelativityTracker().getDistanceToUser();
+ private void ensureOptimalRenderMode(RenderingContext context) {
+ // if the text is too far away, use texture
+ final double textRelativeSize = context.width / getRelativityTracker().getDistanceToUser();
if (textRelativeSize < 2d) {
- if (renderMode == RenderMode.CHARACTERS)
- setRenderMode(RenderMode.TEXTURE);
+ setRenderMode(RenderMode.TEXTURE);
return;
}
- final double piHalf = Math.PI / 2;
-
- final double deviation = Math.abs(getRelativityTracker().getAngleXZ()
+ // if user is looking at the text from the side, use texture
+ final double piHalf = PI / 2;
+ final double deviation = abs(getRelativityTracker().getAngleXZ()
+ piHalf)
- + Math.abs(getRelativityTracker().getAngleYZ() + piHalf);
+ + abs(getRelativityTracker().getAngleYZ() + piHalf);
final double maxDeviation = 0.5;
-
- if (deviation > maxDeviation) {
- if (renderMode == RenderMode.CHARACTERS)
- setRenderMode(RenderMode.TEXTURE);
- } else if (renderMode == RenderMode.TEXTURE)
- setRenderMode(RenderMode.CHARACTERS);
+ setRenderMode(deviation > maxDeviation ? RenderMode.TEXTURE : RenderMode.CHARACTERS);
}
public void clear() {
graphics.setColor(foreground.toAwtColor());
graphics.drawChars(
new char[]{character,}, 0, 1,
- (column * FONT_CHAR_WIDTH_TEXTURE_PIXELS) - 0,
- (row * FONT_CHAR_HEIGHT_TEXTURE_PIXELS) + (int)(FONT_CHAR_HEIGHT_TEXTURE_PIXELS / 1.23f));
+ (column * FONT_CHAR_WIDTH_TEXTURE_PIXELS),
+ (row * FONT_CHAR_HEIGHT_TEXTURE_PIXELS) + (int) (FONT_CHAR_HEIGHT_TEXTURE_PIXELS / 1.23f));
getTexture().resetResampledBitmapCache();
}