Renderer/src/main/java/electrosphere/renderer/ui/frame/UIFrameUtils.java
austin ff44e78078
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
image-based frames for backing elements
2025-04-01 15:38:54 -04:00

301 lines
11 KiB
Java

package electrosphere.renderer.ui.frame;
import org.joml.Vector3f;
import electrosphere.engine.Globals;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.texture.Texture;
/**
* Utilities to draw frames behind elements
*/
public class UIFrameUtils {
/**
* The material used for drawing the texture for the frame
*/
private static final Material customMat = new Material();
/**
* Stores the position of the box to draw
*/
private static final Vector3f boxPosition = new Vector3f();
/**
* Stores the dimensions of the box to draw
*/
private static final Vector3f boxDimensions = new Vector3f();
/**
* Stores the position of the texture to draw on the box
*/
private static final Vector3f texPosition = new Vector3f();
/**
* Stores the dimensions of the texture to draw on the box
*/
private static final Vector3f texScale = new Vector3f();
/**
* Draws a frame
* @param frame The texture of the frame to draw
* @param color The color to draw
* @param frameCornerDim The dimensions of a corner of the frame texture
* @param posX The absolute x position to draw the frame
* @param posY The absolute y position to draw the frame
* @param width The width of the frame
* @param height The height of the frame
* @param framebuffer The framebuffer to draw to
* @param framebufferPosX The x position of the framebuffer
* @param framebufferPosY The y position of the framebuffer
*/
public static void drawFrame(
String frame, Vector3f color, int frameTexDim, int frameCornerDim,
int posX, int posY, int width, int height,
Framebuffer framebuffer, int framebufferPosX, int framebufferPosY
){
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
Texture windowFrame = Globals.assetManager.fetchTexture(frame);
//render background of window
if(planeModel != null && windowFrame != null){
//set materials + uniforms
customMat.setTexturePointer(windowFrame.getTexturePointer());
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.pushUniformToMesh(planeModel.getMeshes().get(0).getMeshName(), "color", color);
//top left corner
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer(posX,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer(posY,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)frameCornerDim/framebuffer.getWidth(),
(float)frameCornerDim/framebuffer.getHeight(),
0
);
texPosition.set(
0,
((frameTexDim - frameCornerDim) / (float)frameTexDim),
0
);
texScale.set(
(frameCornerDim / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//top center side
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer(posX + frameCornerDim,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer(posY,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)(width - (frameCornerDim * 2))/framebuffer.getWidth(),
(float)frameCornerDim/framebuffer.getHeight(),
0
);
texPosition.set(
(frameCornerDim / (float)frameTexDim),
((frameTexDim - frameCornerDim) / (float)frameTexDim),
0
);
texScale.set(
((frameTexDim - (frameCornerDim * 2)) / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//top right corner
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer((posX + width) - frameCornerDim,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer(posY,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)frameCornerDim/framebuffer.getWidth(),
(float)frameCornerDim/framebuffer.getHeight(),
0
);
texPosition.set(
((frameTexDim - frameCornerDim) / (float)frameTexDim),
((frameTexDim - frameCornerDim) / (float)frameTexDim),
0
);
texScale.set(
(frameCornerDim / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//center left side
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer(posX,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer(posY + frameCornerDim,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)frameCornerDim/framebuffer.getWidth(),
(float)(height - (frameCornerDim * 2))/framebuffer.getHeight(),
0
);
texPosition.set(
0,
(frameCornerDim / (float)frameTexDim),
0
);
texScale.set(
(frameCornerDim / (float)frameTexDim),
((frameTexDim - (frameCornerDim * 2)) / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//center point
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer(posX + frameCornerDim,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer(posY + frameCornerDim,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)(width - (frameCornerDim * 2))/framebuffer.getWidth(),
(float)(height - (frameCornerDim * 2))/framebuffer.getHeight(),
0
);
texPosition.set(
(frameCornerDim / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
texScale.set(
((frameTexDim - (frameCornerDim * 2)) / (float)frameTexDim),
((frameTexDim - (frameCornerDim * 2)) / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//center right side
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer((posX + width) - frameCornerDim,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer(posY + frameCornerDim,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)frameCornerDim/framebuffer.getWidth(),
(float)(height - (frameCornerDim * 2))/framebuffer.getHeight(),
0
);
texPosition.set(
((frameTexDim - frameCornerDim) / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
texScale.set(
(frameCornerDim / (float)frameTexDim),
((frameTexDim - (frameCornerDim * 2)) / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//bottom left corner
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer(posX,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer((posY + height) - frameCornerDim,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)frameCornerDim/framebuffer.getWidth(),
(float)frameCornerDim/framebuffer.getHeight(),
0
);
texPosition.set(
0,
0,
0
);
texScale.set(
(frameCornerDim / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//bottom center side
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer(posX + frameCornerDim,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer((posY + height) - frameCornerDim,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)(width - (frameCornerDim * 2))/framebuffer.getWidth(),
(float)frameCornerDim/framebuffer.getHeight(),
0
);
texPosition.set(
(frameCornerDim / (float)frameTexDim),
0,
0
);
texScale.set(
((frameTexDim - (frameCornerDim * 2)) / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
//bottom right corner
boxPosition.set(
(float)UIFrameUtils.absoluteToFramebuffer((posX + width) - frameCornerDim,framebufferPosX)/framebuffer.getWidth(),
(float)UIFrameUtils.absoluteToFramebuffer((posY + height) - frameCornerDim,framebufferPosY)/framebuffer.getHeight(),
0
);
boxDimensions.set(
(float)frameCornerDim/framebuffer.getWidth(),
(float)frameCornerDim/framebuffer.getHeight(),
0
);
texPosition.set(
((frameTexDim - frameCornerDim) / (float)frameTexDim),
0,
0
);
texScale.set(
(frameCornerDim / (float)frameTexDim),
(frameCornerDim / (float)frameTexDim),
0
);
UIFrameUtils.drawBox(planeModel);
}
}
/**
* Draws a box for the frame
* @param planeModel The model to use
*/
private static void drawBox(Model planeModel){
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
planeModel.drawUI();
}
/**
* Converts an absolute (to the screen) position to a position within a framebuffer
* @param absolutePos The absolute position
* @param framebufferPos The position of the framebuffer on the screen
* @return The position within the framebuffer
*/
public static int absoluteToFramebuffer(int absolutePos, int framebufferPos){
return absolutePos - framebufferPos;
}
}