Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
132 lines
4.5 KiB
Java
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;
|
|
}
|
|
|
|
}
|