Renderer/src/main/java/electrosphere/renderer/ui/elements/BitmapCharacter.java
austin d84a993739
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
font loading update
2024-11-20 18:14:26 -05:00

132 lines
4.5 KiB
Java

package electrosphere.renderer.ui.elements;
import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.Font;
import org.joml.Vector3f;
/**
* A single character
*/
public class BitmapCharacter extends StandardElement implements DrawableElement {
String text;
Vector3f color = new Vector3f(1.0f);
Font font;
float fontSize = 1.0f;
/**
* Constructor
* @param font
* @param posX
* @param posY
* @param width
* @param height
* @param toDraw
*/
public BitmapCharacter(Font font, int width, int height, float fontSize, char toDraw){
super();
setWidth(width);
setHeight(height);
this.text = "" + toDraw;
this.font = font;
this.fontSize = fontSize;
}
/**
* Creates a bitmap character that will be positioned by Yoga
* @param font The font of the character
* @param toDraw The glyph to draw
*/
public BitmapCharacter(Font font, char toDraw){
super();
this.text = "" + toDraw;
this.font = font;
Vector3f discreteDims = this.font.getDimensionOfCharacterDiscrete(toDraw);
setMinWidth((int)discreteDims.x);
setMinHeight((int)Math.max(discreteDims.y,this.font.getFontHeight()));
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public void setColor(Vector3f color) {
this.color = color;
}
@Override
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
Framebuffer framebuffer,
int framebufferPosX,
int framebufferPosY
){
framebuffer.bind(openGLState);
openGLState.glViewport(framebuffer.getWidth(), framebuffer.getHeight());
float ndcX = (float)this.absoluteToFramebuffer(getAbsoluteX(),framebufferPosX)/framebuffer.getWidth();
float ndcY = (float)this.absoluteToFramebuffer(getAbsoluteYPlacement(),framebufferPosY)/framebuffer.getHeight();
float ndcWidth = (float)getWidth()/framebuffer.getWidth();
float ndcHeight = (float)getHeightPlacement()/framebuffer.getHeight();
char toDraw = text.charAt(0);
Vector3f characterPosition = new Vector3f(ndcX,ndcY,0);
Vector3f characterDimensions = new Vector3f(ndcWidth,ndcHeight,0);
Vector3f bitMapPosition = this.font.getPositionOfCharacter(toDraw);
Vector3f bitMapDimension = this.font.getDimensionOfCharacter(toDraw);
//load model and try overwriting with font material
Model charModel = Globals.assetManager.fetchModel(AssetDataStrings.BITMAP_CHARACTER_MODEL);
Material mat = this.font.getMaterial();
charModel.tryOverwriteMaterial(mat);
if(charModel != null && toDraw != ' '){
charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "mPosition", characterPosition);
charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "mDimension", characterDimensions);
charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "tPosition", bitMapPosition);
charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "tDimension", bitMapDimension);
charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "color", color);
charModel.drawUI();
}
}
/**
* Gets the absolute y to use for placement
* @return The absolute y to use for placement
*/
public int getAbsoluteYPlacement(){
return super.getAbsoluteY() + (int)Math.ceil(this.font.getOffsetY(text.charAt(0)) * this.fontSize);
}
/**
* Gets the height to use for placement
* @return The height to use for placement
*/
public int getHeightPlacement(){
return (int)(Math.ceil(super.getHeight() * this.font.getQuadScalingY(text.charAt(0))));
}
public boolean handleEvent(Event event){
return true;
}
}