Render helper
This commit is contained in:
parent
68930672a4
commit
1b73eea70a
287
src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java
Normal file
287
src/main/java/ru/dbotthepony/mc/otm/screen/RenderHelper.java
Normal file
@ -0,0 +1,287 @@
|
||||
package ru.dbotthepony.mc.otm.screen;
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.*;
|
||||
import com.mojang.math.Matrix4f;
|
||||
import net.minecraft.client.renderer.GameRenderer;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
||||
|
||||
/**
|
||||
* I am too lazy to learn how Mojang's API works
|
||||
* so I just recreate part of GMod's API in here
|
||||
*/
|
||||
public class RenderHelper {
|
||||
private static final Matrix4f identity = new Matrix4f();
|
||||
public static final ResourceLocation WIDGETS = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets.png");
|
||||
|
||||
static {
|
||||
identity.setIdentity();
|
||||
}
|
||||
|
||||
// Regular functions
|
||||
|
||||
/**
|
||||
* Draws a textured rectangle on screen
|
||||
* translated by a given matrix
|
||||
*
|
||||
* @param matrix Matrix translation to use
|
||||
* @param x screen X position (with matrix transformation)
|
||||
* @param y screen Y position (with matrix transformation)
|
||||
* @param width width of drawn rectangle
|
||||
* @param height height of drawn rectangle
|
||||
* @param u0 initial U position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param v0 initial V position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param u1 final U position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param v1 final V position ranging from 0-1 (single) or beyond (repetitive)
|
||||
*/
|
||||
public static void drawTexturedRectUV(
|
||||
Matrix4f matrix,
|
||||
float x,
|
||||
float y,
|
||||
float width,
|
||||
float height,
|
||||
float u0,
|
||||
float v0,
|
||||
float u1,
|
||||
float v1
|
||||
) {
|
||||
RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||
|
||||
var builder = Tesselator.getInstance().getBuilder();
|
||||
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
|
||||
builder.vertex(matrix, x, y + height, 0).uv(u0, v1).endVertex();
|
||||
builder.vertex(matrix, x + width, y + height, 0).uv(u1, v1).endVertex();
|
||||
builder.vertex(matrix, x + width, y, 0).uv(u1, v0).endVertex();
|
||||
builder.vertex(matrix, x, y, 0).uv(u0, v0).endVertex();
|
||||
builder.end();
|
||||
BufferUploader.end(builder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a textured rectangle on screen
|
||||
*
|
||||
* @param x screen X position (with matrix transformation)
|
||||
* @param y screen Y position (with matrix transformation)
|
||||
* @param width width of drawn rectangle
|
||||
* @param height height of drawn rectangle
|
||||
* @param u0 initial U position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param v0 initial V position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param u1 final U position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param v1 final V position ranging from 0-1 (single) or beyond (repetitive)
|
||||
*/
|
||||
public static void drawTexturedRectUV(
|
||||
float x,
|
||||
float y,
|
||||
float width,
|
||||
float height,
|
||||
float u0,
|
||||
float v0,
|
||||
float u1,
|
||||
float v1
|
||||
) {
|
||||
drawTexturedRectUV(identity, x, y, width, height, u0, v0, u1, v1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a textured rectangle on screen
|
||||
* with matrix from pose
|
||||
*
|
||||
* @param stack PoseStack containing translation matrix
|
||||
* @param x screen X position (with matrix transformation)
|
||||
* @param y screen Y position (with matrix transformation)
|
||||
* @param width width of drawn rectangle
|
||||
* @param height height of drawn rectangle
|
||||
* @param u0 initial U position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param v0 initial V position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param u1 final U position ranging from 0-1 (single) or beyond (repetitive)
|
||||
* @param v1 final V position ranging from 0-1 (single) or beyond (repetitive)
|
||||
*/
|
||||
public static void drawTexturedRectUV(
|
||||
PoseStack stack,
|
||||
float x,
|
||||
float y,
|
||||
float width,
|
||||
float height,
|
||||
float u0,
|
||||
float v0,
|
||||
float u1,
|
||||
float v1
|
||||
) {
|
||||
drawTexturedRectUV(stack.last().pose(), x, y, width, height, u0, v0, u1, v1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a textured rectangle on screen
|
||||
* with matrix from pose
|
||||
* UVs are 0-1
|
||||
*
|
||||
* @param stack PoseStack containing translation matrix
|
||||
* @param x screen X position (with matrix transformation)
|
||||
* @param y screen Y position (with matrix transformation)
|
||||
* @param width width of drawn rectangle
|
||||
* @param height height of drawn rectangle
|
||||
*/
|
||||
public static void drawTexturedRect(
|
||||
PoseStack stack,
|
||||
float x,
|
||||
float y,
|
||||
float width,
|
||||
float height
|
||||
) {
|
||||
drawTexturedRectUV(stack, x, y, width, height, 0, 0, 1, 1);
|
||||
}
|
||||
|
||||
public record SkinElement(ResourceLocation texture, float image_x, float image_y, float rect_w, float rect_h, float defined_width, float defined_height) {
|
||||
public void render(PoseStack stack, float x, float y, float width, float height) {
|
||||
RenderSystem.setShaderTexture(0, texture);
|
||||
|
||||
drawTexturedRectUV(
|
||||
stack,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
image_x / defined_width,
|
||||
image_y / defined_height,
|
||||
(image_x + rect_w) / defined_width,
|
||||
(image_y + rect_h) / defined_height);
|
||||
}
|
||||
|
||||
public void renderRaw(PoseStack stack, float x, float y, float width, float height) {
|
||||
// RenderSystem.setShader(GameRenderer::getPositionTexShader);
|
||||
// RenderSystem.setShaderTexture(0, texture);
|
||||
|
||||
drawTexturedRectUV(
|
||||
stack,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
image_x / defined_width,
|
||||
image_y / defined_height,
|
||||
(image_x + rect_w) / defined_width,
|
||||
(image_y + rect_h) / defined_height);
|
||||
}
|
||||
}
|
||||
|
||||
public static final SkinElement upper_left_window_corner = new SkinElement(
|
||||
WIDGETS,
|
||||
18,
|
||||
0,
|
||||
6,
|
||||
6,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement upper_right_window_corner = new SkinElement(
|
||||
WIDGETS,
|
||||
24,
|
||||
0,
|
||||
6,
|
||||
6,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement bottom_left_window_corner = new SkinElement(
|
||||
WIDGETS,
|
||||
18,
|
||||
6,
|
||||
6,
|
||||
6,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement bottom_right_window_corner = new SkinElement(
|
||||
WIDGETS,
|
||||
24,
|
||||
6,
|
||||
6,
|
||||
6,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement left_window_border = new SkinElement(
|
||||
WIDGETS,
|
||||
18,
|
||||
4,
|
||||
3,
|
||||
5,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement right_window_border = new SkinElement(
|
||||
WIDGETS,
|
||||
27,
|
||||
3,
|
||||
3,
|
||||
5,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement top_window_border = new SkinElement(
|
||||
WIDGETS,
|
||||
22,
|
||||
0,
|
||||
5,
|
||||
3,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement bottom_window_border = new SkinElement(
|
||||
WIDGETS,
|
||||
21,
|
||||
9,
|
||||
5,
|
||||
3,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static final SkinElement window_background = new SkinElement(
|
||||
WIDGETS,
|
||||
22,
|
||||
4,
|
||||
4,
|
||||
4,
|
||||
256,
|
||||
256
|
||||
);
|
||||
|
||||
public static void drawWindowBackground(
|
||||
PoseStack stack,
|
||||
float x,
|
||||
float y,
|
||||
float width,
|
||||
float height
|
||||
) {
|
||||
float bg_width = width - 4;
|
||||
float bg_height = height - 4;
|
||||
|
||||
// background
|
||||
if (bg_width > 0 && bg_height > 0) {
|
||||
window_background.render(stack, x + 3, y + 3, bg_width, bg_height);
|
||||
}
|
||||
|
||||
// borders
|
||||
left_window_border.render(stack, x, y + 4, 3, height - 8);
|
||||
right_window_border.renderRaw(stack, x + width - 3, y + 4, 3, height - 6);
|
||||
|
||||
top_window_border.renderRaw(stack, x + 4, y, width - 8, 3);
|
||||
bottom_window_border.renderRaw(stack, x + 4, y + height - 3, width - 8, 3);
|
||||
|
||||
// corners
|
||||
upper_left_window_corner.renderRaw(stack, x, y, 6, 6);
|
||||
upper_right_window_corner.renderRaw(stack, x + width - 6, y, 6, 6);
|
||||
|
||||
bottom_left_window_corner.renderRaw(stack, x, y + height - 6, 6, 6);
|
||||
bottom_right_window_corner.renderRaw(stack, x + width - 6, y + height - 6, 6, 6);
|
||||
}
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.9 KiB |
BIN
src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.xcf
(Stored with Git LFS)
BIN
src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.xcf
(Stored with Git LFS)
Binary file not shown.
Loading…
Reference in New Issue
Block a user