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