Move render helper to kotlin
This commit is contained in:
parent
c24176374c
commit
03f62b2d0e
@ -1,455 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.client.render;
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
|
||||||
import com.mojang.blaze3d.vertex.*;
|
|
||||||
import com.mojang.math.Matrix4f;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.renderer.GameRenderer;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
|
|
||||||
import ru.dbotthepony.mc.otm.core.RGBAColor;
|
|
||||||
|
|
||||||
import java.util.Stack;
|
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.GL_ALWAYS;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* I am too lazy to learn how Mojang's API works
|
|
||||||
* so I just recreate part of GMod's API in here
|
|
||||||
*
|
|
||||||
* also contains texture widgets
|
|
||||||
*/
|
|
||||||
public class RenderHelper {
|
|
||||||
private static final Matrix4f identity = new Matrix4f();
|
|
||||||
public static final ResourceLocation WIDGETS = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets.png");
|
|
||||||
public static final ResourceLocation WIDGETS_18 = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets_18.png");
|
|
||||||
public static final ResourceLocation WIDGETS_8 = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets_8.png");
|
|
||||||
public static final ResourceLocation SCROLL = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/scroll.png");
|
|
||||||
|
|
||||||
static {
|
|
||||||
identity.setIdentity();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float depth_z = 0;
|
|
||||||
|
|
||||||
public static void setUpcomingDepth(float depth) {
|
|
||||||
depth_z = depth;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void clearUpcomingDepth() {
|
|
||||||
depth_z = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
RenderSystem.enableTexture();
|
|
||||||
RenderSystem.enableBlend();
|
|
||||||
RenderSystem.defaultBlendFunc();
|
|
||||||
|
|
||||||
RenderSystem.depthFunc(GL_ALWAYS);
|
|
||||||
|
|
||||||
var builder = Tesselator.getInstance().getBuilder();
|
|
||||||
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
|
|
||||||
builder.vertex(matrix, x, y + height, depth_z).uv(u0, v1).endVertex();
|
|
||||||
builder.vertex(matrix, x + width, y + height, depth_z).uv(u1, v1).endVertex();
|
|
||||||
builder.vertex(matrix, x + width, y, depth_z).uv(u1, v0).endVertex();
|
|
||||||
builder.vertex(matrix, x, y, depth_z).uv(u0, v0).endVertex();
|
|
||||||
|
|
||||||
BufferUploader.drawWithShader(builder.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void drawTexturedRectUV(
|
|
||||||
Matrix4f matrix,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height,
|
|
||||||
UVCoords uv
|
|
||||||
) {
|
|
||||||
drawTexturedRectUV(matrix, x, y, width, height, uv.u0(), uv.v0(), uv.u1(), uv.v1());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void colorSphere(Matrix4f matrix, float radius) {
|
|
||||||
final int fragments = 32;
|
|
||||||
|
|
||||||
RenderSystem.enableBlend();
|
|
||||||
RenderSystem.defaultBlendFunc();
|
|
||||||
|
|
||||||
var builder = Tesselator.getInstance().getBuilder();
|
|
||||||
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
|
|
||||||
|
|
||||||
final double turn_step = Math.PI * (1 / (double) fragments) * 2;
|
|
||||||
final double stripe_step = Math.PI * (1 / (double) fragments);
|
|
||||||
|
|
||||||
for (int turn = 0; turn < fragments; turn++) {
|
|
||||||
final double turn_pre = turn_step * turn;
|
|
||||||
final double turn_post = turn_step * (turn + 1);
|
|
||||||
|
|
||||||
for (int sector = 0; sector < fragments; sector++) {
|
|
||||||
final double tilt_pre = Math.PI / 2 - stripe_step * (sector);
|
|
||||||
final double tilt_post = Math.PI / 2 - stripe_step * (sector + 1);
|
|
||||||
|
|
||||||
final float x_pre = (float) Math.sin(turn_pre) * radius;
|
|
||||||
final float x_post = (float) Math.sin(turn_post) * radius;
|
|
||||||
|
|
||||||
final float z_pre = (float) Math.cos(turn_pre) * radius;
|
|
||||||
final float z_post = (float) Math.cos(turn_post) * radius;
|
|
||||||
|
|
||||||
final float y_pre = (float) (Math.sin(tilt_pre) + 0.5) * radius;
|
|
||||||
final float y_post = (float) (Math.sin(tilt_post) + 0.5) * radius;
|
|
||||||
|
|
||||||
builder.vertex(matrix, x_pre * (float) Math.cos(tilt_post), y_post, z_pre * (float) Math.cos(tilt_post))
|
|
||||||
.color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha())
|
|
||||||
.endVertex();
|
|
||||||
|
|
||||||
builder.vertex(matrix, x_post * (float) Math.cos(tilt_post), y_post, z_post * (float) Math.cos(tilt_post))
|
|
||||||
.color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha())
|
|
||||||
.endVertex();
|
|
||||||
|
|
||||||
builder.vertex(matrix, x_post * (float) Math.cos(tilt_pre), y_pre, z_post * (float) Math.cos(tilt_pre))
|
|
||||||
.color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha())
|
|
||||||
.endVertex();
|
|
||||||
|
|
||||||
builder.vertex(matrix, x_pre * (float) Math.cos(tilt_pre), y_pre, z_pre * (float) Math.cos(tilt_pre))
|
|
||||||
.color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha())
|
|
||||||
.endVertex();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BufferUploader.drawWithShader(builder.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void colorSphere(PoseStack stack, float radius) {
|
|
||||||
colorSphere(stack.last().pose(), radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void drawTexturedRectUV(
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height,
|
|
||||||
UVCoords uv
|
|
||||||
) {
|
|
||||||
drawTexturedRectUV(identity, x, y, width, height, uv.u0(), uv.v0(), uv.u1(), uv.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);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void drawTexturedRectUV(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height,
|
|
||||||
UVCoords uv
|
|
||||||
) {
|
|
||||||
drawTexturedRectUV(stack.last().pose(), x, y, width, height, uv.u0(), uv.v0(), uv.u1(), uv.v1());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param stack stack to take transformation matrix from
|
|
||||||
* @param x position x on screen
|
|
||||||
* @param y position y on screen
|
|
||||||
* @param width drawn rectangle width
|
|
||||||
* @param height drawn rectangle height
|
|
||||||
* @param image_x absolute asset x, to compute U0 coordinate from
|
|
||||||
* @param image_y absolute asset y, to compute V0 coordinate from
|
|
||||||
* @param mapped_width absolute asset width, to compute U1 coordinate from
|
|
||||||
* @param mapped_height absolute asset height, to compute V1 coordinate from
|
|
||||||
*/
|
|
||||||
public static void drawTexturedRectAuto(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height,
|
|
||||||
float image_x,
|
|
||||||
float image_y,
|
|
||||||
float mapped_width,
|
|
||||||
float mapped_height
|
|
||||||
) {
|
|
||||||
drawTexturedRectUV(stack.last().pose(), x, y, width, height, image_x / mapped_width, image_y / mapped_height, (image_x + width) / mapped_width, (image_y + height) / mapped_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void drawTexturedRectAuto(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height,
|
|
||||||
float image_x,
|
|
||||||
float image_y,
|
|
||||||
float mapped_width,
|
|
||||||
float mapped_height,
|
|
||||||
UVWindingOrder order
|
|
||||||
) {
|
|
||||||
drawTexturedRectUV(stack.last().pose(), x, y, width, height, order.translate(image_x / mapped_width, image_y / mapped_height, (image_x + width) / mapped_width, (image_y + height) / mapped_height));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void drawTexturedRectAuto(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height,
|
|
||||||
float image_x,
|
|
||||||
float image_y
|
|
||||||
) {
|
|
||||||
drawTexturedRectAuto(stack, x, y, width, height, image_x, image_y, 256, 256);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void drawTexturedRectAuto(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height,
|
|
||||||
float image_x,
|
|
||||||
float image_y,
|
|
||||||
UVWindingOrder order
|
|
||||||
) {
|
|
||||||
drawTexturedRectAuto(stack, x, y, width, height, image_x, image_y, 256, 256, order);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 static void drawRegularSlot(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y
|
|
||||||
) {
|
|
||||||
RenderSystem.setShaderTexture(0, WIDGETS);
|
|
||||||
drawTexturedRectAuto(stack, x, y, 18, 18, 0, 96, 256, 256);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void drawBigSlot(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y
|
|
||||||
) {
|
|
||||||
RenderSystem.setShaderTexture(0, WIDGETS);
|
|
||||||
drawTexturedRectAuto(stack, x, y, 26, 26, 18, 96, 256, 256);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RGBAColor getDrawColor() {
|
|
||||||
return draw_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setDrawColor(RGBAColor rect_color) {
|
|
||||||
RenderHelper.draw_color = rect_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setShaderColor(RGBAColor rect_color) {
|
|
||||||
RenderSystem.setShaderColor(rect_color.getRed(), rect_color.getGreen(), rect_color.getBlue(), rect_color.getAlpha());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RGBAColor draw_color = new RGBAColor(255, 255, 255, 255);
|
|
||||||
|
|
||||||
public static boolean forwardWinding = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws a solid color rectangle on screen, defined by last setDrawColor(RGBColor rect_color) call
|
|
||||||
*
|
|
||||||
* @param matrix matrix to translate by
|
|
||||||
* @param x x screen coordinate
|
|
||||||
* @param y y screen coordinate
|
|
||||||
* @param width rectangle width
|
|
||||||
* @param height rectangle height
|
|
||||||
*/
|
|
||||||
public static void drawRect(
|
|
||||||
Matrix4f matrix,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height
|
|
||||||
) {
|
|
||||||
RenderSystem.disableTexture();
|
|
||||||
RenderSystem.enableBlend();
|
|
||||||
RenderSystem.defaultBlendFunc();
|
|
||||||
RenderSystem.setShader(GameRenderer::getPositionColorShader);
|
|
||||||
|
|
||||||
RenderSystem.depthFunc(GL_ALWAYS);
|
|
||||||
|
|
||||||
var tess = Tesselator.getInstance();
|
|
||||||
BufferBuilder builder = tess.getBuilder();
|
|
||||||
|
|
||||||
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
|
|
||||||
|
|
||||||
if (forwardWinding) {
|
|
||||||
builder.vertex(matrix, x, y + height, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
builder.vertex(matrix, x + width, y + height, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
builder.vertex(matrix, x + width, y, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
builder.vertex(matrix, x, y, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
} else {
|
|
||||||
builder.vertex(matrix, x, y, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
builder.vertex(matrix, x + width, y, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
builder.vertex(matrix, x + width, y + height, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
builder.vertex(matrix, x, y + height, depth_z).color(draw_color.getRed(), draw_color.getGreen(), draw_color.getBlue(), draw_color.getAlpha()).endVertex();
|
|
||||||
}
|
|
||||||
|
|
||||||
tess.end();
|
|
||||||
|
|
||||||
RenderSystem.enableTexture();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws a solid color rectangle on screen, defined by last setDrawColor(RGBColor rect_color) call
|
|
||||||
*
|
|
||||||
* @param stack stack to translate by
|
|
||||||
* @param x x screen coordinate
|
|
||||||
* @param y y screen coordinate
|
|
||||||
* @param width rectangle width
|
|
||||||
* @param height rectangle height
|
|
||||||
*/
|
|
||||||
public static void drawRect(
|
|
||||||
PoseStack stack,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float width,
|
|
||||||
float height
|
|
||||||
) {
|
|
||||||
drawRect(stack.last().pose(), x, y, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
record ScissorRect(int x, int y, int width, int height) {}
|
|
||||||
|
|
||||||
private static final Stack<ScissorRect> SCISSOR = new Stack<>();
|
|
||||||
|
|
||||||
public static void ensureScissorStackEmpty() {
|
|
||||||
if (!SCISSOR.empty()) {
|
|
||||||
throw new IllegalStateException("Unbalanced scissor rects: Popping less than pushing");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void pushScissorRect(int x, int y, int width, int height) {
|
|
||||||
if (!SCISSOR.empty()) {
|
|
||||||
final var peek = SCISSOR.peek();
|
|
||||||
x = Math.max(x, peek.x);
|
|
||||||
y = Math.max(y, peek.y);
|
|
||||||
width = Math.min(width, peek.width);
|
|
||||||
height = Math.min(height, peek.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
SCISSOR.push(new ScissorRect(x, y, width, height));
|
|
||||||
|
|
||||||
final var window = Minecraft.getInstance().getWindow();
|
|
||||||
y = window.getHeight() - y - height;
|
|
||||||
|
|
||||||
RenderSystem.enableScissor(x, y, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void popScissorRect() {
|
|
||||||
if (SCISSOR.empty()) {
|
|
||||||
throw new IllegalStateException("Unbalanced scissor rects: Popping more than pushing");
|
|
||||||
}
|
|
||||||
|
|
||||||
SCISSOR.pop();
|
|
||||||
|
|
||||||
if (SCISSOR.empty()) {
|
|
||||||
RenderSystem.disableScissor();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final var value = SCISSOR.peek();
|
|
||||||
final var window = Minecraft.getInstance().getWindow();
|
|
||||||
final var y = window.getHeight() - value.y - value.height;
|
|
||||||
RenderSystem.enableScissor(value.x, y, value.width, value.height);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.client.render;
|
|
||||||
|
|
||||||
public record UVCoords(float u0, float v0, float u1, float v1) {
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
package ru.dbotthepony.mc.otm.client.render;
|
|
||||||
|
|
||||||
public enum UVWindingOrder {
|
|
||||||
NORMAL(0, 1, 2, 3), // normal operation
|
|
||||||
U0_V0_U1_V1(0, 1, 2, 3), // normal operation
|
|
||||||
U0_V1_U1_V0(0, 3, 2, 1), // mirror y
|
|
||||||
FLIP(0, 3, 2, 1), // mirror y
|
|
||||||
U1_V0_U0_V1(2, 1, 0, 3), // mirror x
|
|
||||||
FLOP(2, 1, 0, 3), // mirror x
|
|
||||||
U1_V1_U0_V0(2, 3, 0, 1), // mirror both
|
|
||||||
FLIP_FLOP(2, 3, 0, 1); // mirror both
|
|
||||||
|
|
||||||
public static final int U0 = 0;
|
|
||||||
public static final int V0 = 1;
|
|
||||||
public static final int U1 = 2;
|
|
||||||
public static final int V1 = 3;
|
|
||||||
|
|
||||||
public final int u0;
|
|
||||||
public final int v0;
|
|
||||||
public final int u1;
|
|
||||||
public final int v1;
|
|
||||||
|
|
||||||
private final float[] uv_map = new float[4];
|
|
||||||
|
|
||||||
UVWindingOrder(int u0, int v0, int u1, int v1) {
|
|
||||||
this.u0 = u0;
|
|
||||||
this.v0 = v0;
|
|
||||||
this.u1 = u1;
|
|
||||||
this.v1 = v1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UVCoords translate(float u0, float v0, float u1, float v1) {
|
|
||||||
uv_map[0] = u0;
|
|
||||||
uv_map[1] = v0;
|
|
||||||
uv_map[2] = u1;
|
|
||||||
uv_map[3] = v1;
|
|
||||||
|
|
||||||
return new UVCoords(uv_map[this.u0], uv_map[this.v0], uv_map[this.u1], uv_map[this.v1]);
|
|
||||||
}
|
|
||||||
}
|
|
@ -359,7 +359,7 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
|||||||
|
|
||||||
private fun diffTracked(slot: Int, diff: Int) {
|
private fun diffTracked(slot: Int, diff: Int) {
|
||||||
val scannedMap = checkNotNull(scannedMap[slot]) { "Not tracking slot $slot" }
|
val scannedMap = checkNotNull(scannedMap[slot]) { "Not tracking slot $slot" }
|
||||||
val item = scannedMap.children[slot] ?: throw IllegalStateException("${scannedMap.id} does not track $slot")
|
val item = checkNotNull(scannedMap.children[slot]) { "${scannedMap.id} does not track $slot" }
|
||||||
|
|
||||||
val oldCount = scannedMap.stack.count
|
val oldCount = scannedMap.stack.count
|
||||||
item.stack.count += diff
|
item.stack.count += diff
|
||||||
|
@ -91,7 +91,7 @@ class BlackHoleRenderer(private val context: BlockEntityRendererProvider.Context
|
|||||||
i: Int,
|
i: Int,
|
||||||
i1: Int
|
i1: Int
|
||||||
) {
|
) {
|
||||||
RenderHelper.setDrawColor(RGBAColor.BLACK)
|
setDrawColor(RGBAColor.BLACK)
|
||||||
RenderSystem.setShader(GameRenderer::getPositionColorShader)
|
RenderSystem.setShader(GameRenderer::getPositionColorShader)
|
||||||
|
|
||||||
RenderSystem.depthFunc(GL30.GL_LESS)
|
RenderSystem.depthFunc(GL30.GL_LESS)
|
||||||
@ -101,7 +101,7 @@ class BlackHoleRenderer(private val context: BlockEntityRendererProvider.Context
|
|||||||
|
|
||||||
poseStack.pushPose()
|
poseStack.pushPose()
|
||||||
poseStack.translate(0.5, -tile.gravitationStrength / 2 + 0.5, 0.5)
|
poseStack.translate(0.5, -tile.gravitationStrength / 2 + 0.5, 0.5)
|
||||||
RenderHelper.colorSphere(poseStack, tile.gravitationStrength.toFloat())
|
colorSphere(poseStack, tile.gravitationStrength.toFloat())
|
||||||
|
|
||||||
RenderSystem.enableCull()
|
RenderSystem.enableCull()
|
||||||
RenderSystem.enableTexture()
|
RenderSystem.enableTexture()
|
||||||
|
@ -0,0 +1,373 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.client.render
|
||||||
|
|
||||||
|
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 org.lwjgl.opengl.GL11
|
||||||
|
import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
||||||
|
import ru.dbotthepony.mc.otm.client.minecraft
|
||||||
|
import ru.dbotthepony.mc.otm.core.RGBAColor
|
||||||
|
import kotlin.math.cos
|
||||||
|
import kotlin.math.sin
|
||||||
|
|
||||||
|
private val identity = Matrix4f().also { it.setIdentity() }
|
||||||
|
|
||||||
|
object WidgetLocation {
|
||||||
|
val WIDGETS = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets.png")
|
||||||
|
val WIDGETS_18 = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets_18.png")
|
||||||
|
val WIDGETS_8 = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets_8.png")
|
||||||
|
val SCROLL = ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/scroll.png")
|
||||||
|
}
|
||||||
|
|
||||||
|
var zLevel = 0f
|
||||||
|
var drawColor = RGBAColor(255, 255, 255, 255)
|
||||||
|
|
||||||
|
@JvmName("setDrawColor\$JVM")
|
||||||
|
fun setDrawColor(color: RGBAColor) {
|
||||||
|
drawColor = color
|
||||||
|
}
|
||||||
|
|
||||||
|
// Regular functions
|
||||||
|
fun drawTexturedRect(
|
||||||
|
matrix: Matrix4f,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
u0: Float = 0f,
|
||||||
|
v0: Float = 0f,
|
||||||
|
u1: Float = 1f,
|
||||||
|
v1: Float = 1f
|
||||||
|
) {
|
||||||
|
RenderSystem.setShader { GameRenderer.getPositionTexShader() }
|
||||||
|
RenderSystem.enableTexture()
|
||||||
|
RenderSystem.enableBlend()
|
||||||
|
RenderSystem.defaultBlendFunc()
|
||||||
|
RenderSystem.depthFunc(GL11.GL_ALWAYS)
|
||||||
|
|
||||||
|
val builder = Tesselator.getInstance().builder
|
||||||
|
|
||||||
|
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX)
|
||||||
|
builder.vertex(matrix, x, y + height, zLevel).uv(u0, v1).endVertex()
|
||||||
|
builder.vertex(matrix, x + width, y + height, zLevel).uv(u1, v1).endVertex()
|
||||||
|
builder.vertex(matrix, x + width, y, zLevel).uv(u1, v0).endVertex()
|
||||||
|
builder.vertex(matrix, x, y, zLevel).uv(u0, v0).endVertex()
|
||||||
|
|
||||||
|
BufferUploader.drawWithShader(builder.end())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun drawTexturedRect(
|
||||||
|
matrix: Matrix4f,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
uv: IUVCoords
|
||||||
|
) = drawTexturedRect(matrix, x, y, width, height, uv.u0, uv.v0, uv.u1, uv.v1)
|
||||||
|
|
||||||
|
fun drawTexturedRect(
|
||||||
|
stack: PoseStack,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
uv: IUVCoords
|
||||||
|
) = drawTexturedRect(stack.last().pose(), x, y, width, height, uv.u0, uv.v0, uv.u1, uv.v1)
|
||||||
|
|
||||||
|
fun drawTexturedRect(
|
||||||
|
stack: PoseStack,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
u0: Float,
|
||||||
|
v0: Float,
|
||||||
|
u1: Float,
|
||||||
|
v1: Float
|
||||||
|
) = drawTexturedRect(stack.last().pose(), x, y, width, height, u0, v0, u1, v1)
|
||||||
|
|
||||||
|
fun drawTexturedRect(
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
uv: IUVCoords
|
||||||
|
) = drawTexturedRect(identity, x, y, width, height, uv.u0, uv.v0, uv.u1, uv.v1)
|
||||||
|
|
||||||
|
fun drawTexturedRect(
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
u0: Float,
|
||||||
|
v0: Float,
|
||||||
|
u1: Float,
|
||||||
|
v1: Float
|
||||||
|
) = drawTexturedRect(identity, x, y, width, height, u0, v0, u1, v1)
|
||||||
|
|
||||||
|
fun colorSphere(matrix: Matrix4f, radius: Float) {
|
||||||
|
val fragments = 32
|
||||||
|
RenderSystem.enableBlend()
|
||||||
|
RenderSystem.defaultBlendFunc()
|
||||||
|
|
||||||
|
val builder = Tesselator.getInstance().builder
|
||||||
|
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR)
|
||||||
|
|
||||||
|
val turnStep = Math.PI * (1 / fragments.toDouble()) * 2
|
||||||
|
val stripeStep = Math.PI * (1 / fragments.toDouble())
|
||||||
|
|
||||||
|
for (turn in 0 until fragments) {
|
||||||
|
val turnPre = turnStep * turn
|
||||||
|
val turnPost = turnStep * (turn + 1)
|
||||||
|
|
||||||
|
for (sector in 0 until fragments) {
|
||||||
|
val tiltPre = Math.PI / 2 - stripeStep * sector
|
||||||
|
val tiltPost = Math.PI / 2 - stripeStep * (sector + 1)
|
||||||
|
val xPre = sin(turnPre).toFloat() * radius
|
||||||
|
val xPost = sin(turnPost).toFloat() * radius
|
||||||
|
val zPre = cos(turnPre).toFloat() * radius
|
||||||
|
val zPost = cos(turnPost).toFloat() * radius
|
||||||
|
val yPre = (sin(tiltPre) + 0.5).toFloat() * radius
|
||||||
|
val yPost = (sin(tiltPost) + 0.5).toFloat() * radius
|
||||||
|
|
||||||
|
builder.vertex(matrix, xPre * cos(tiltPost).toFloat(), yPost, zPre * cos(tiltPost).toFloat())
|
||||||
|
.color(drawColor)
|
||||||
|
.endVertex()
|
||||||
|
|
||||||
|
builder.vertex(matrix, xPost * cos(tiltPost).toFloat(), yPost, zPost * cos(tiltPost).toFloat())
|
||||||
|
.color(drawColor)
|
||||||
|
.endVertex()
|
||||||
|
|
||||||
|
builder.vertex(matrix, xPost * cos(tiltPre).toFloat(), yPre, zPost * cos(tiltPre).toFloat())
|
||||||
|
.color(drawColor)
|
||||||
|
.endVertex()
|
||||||
|
|
||||||
|
builder.vertex(matrix, xPre * cos(tiltPre).toFloat(), yPre, zPre * cos(tiltPre).toFloat())
|
||||||
|
.color(drawColor)
|
||||||
|
.endVertex()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferUploader.drawWithShader(builder.end())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun colorSphere(pose: PoseStack, radius: Float) = colorSphere(pose.last().pose(), radius)
|
||||||
|
|
||||||
|
fun drawTexturedRectAuto(
|
||||||
|
stack: PoseStack,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
image_x: Float,
|
||||||
|
image_y: Float,
|
||||||
|
mapped_width: Float,
|
||||||
|
mapped_height: Float
|
||||||
|
) = drawTexturedRect(
|
||||||
|
stack,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
image_x / mapped_width,
|
||||||
|
image_y / mapped_height,
|
||||||
|
(image_x + width) / mapped_width,
|
||||||
|
(image_y + height) / mapped_height
|
||||||
|
)
|
||||||
|
|
||||||
|
fun drawTexturedRectAuto(
|
||||||
|
stack: PoseStack,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
image_x: Float,
|
||||||
|
image_y: Float,
|
||||||
|
mapped_width: Float,
|
||||||
|
mapped_height: Float,
|
||||||
|
order: UVWindingOrder
|
||||||
|
) = drawTexturedRect(
|
||||||
|
stack,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
order.translate(
|
||||||
|
image_x / mapped_width,
|
||||||
|
image_y / mapped_height,
|
||||||
|
(image_x + width) / mapped_width,
|
||||||
|
(image_y + height) / mapped_height
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
fun drawTexturedRectAuto(
|
||||||
|
matrix: Matrix4f,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
image_x: Float,
|
||||||
|
image_y: Float,
|
||||||
|
mapped_width: Float,
|
||||||
|
mapped_height: Float
|
||||||
|
) = drawTexturedRect(
|
||||||
|
matrix,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
image_x / mapped_width,
|
||||||
|
image_y / mapped_height,
|
||||||
|
(image_x + width) / mapped_width,
|
||||||
|
(image_y + height) / mapped_height
|
||||||
|
)
|
||||||
|
|
||||||
|
fun drawTexturedRectAuto(
|
||||||
|
matrix: Matrix4f,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
image_x: Float,
|
||||||
|
image_y: Float,
|
||||||
|
mapped_width: Float,
|
||||||
|
mapped_height: Float,
|
||||||
|
order: UVWindingOrder
|
||||||
|
) = drawTexturedRect(
|
||||||
|
matrix,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
order.translate(
|
||||||
|
image_x / mapped_width,
|
||||||
|
image_y / mapped_height,
|
||||||
|
(image_x + width) / mapped_width,
|
||||||
|
(image_y + height) / mapped_height
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
fun drawTexturedRectAuto(
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
image_x: Float,
|
||||||
|
image_y: Float,
|
||||||
|
mapped_width: Float,
|
||||||
|
mapped_height: Float
|
||||||
|
) = drawTexturedRect(
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
image_x / mapped_width,
|
||||||
|
image_y / mapped_height,
|
||||||
|
(image_x + width) / mapped_width,
|
||||||
|
(image_y + height) / mapped_height
|
||||||
|
)
|
||||||
|
|
||||||
|
fun drawTexturedRectAuto(
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float,
|
||||||
|
image_x: Float,
|
||||||
|
image_y: Float,
|
||||||
|
mapped_width: Float,
|
||||||
|
mapped_height: Float,
|
||||||
|
order: UVWindingOrder
|
||||||
|
) = drawTexturedRect(
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
order.translate(
|
||||||
|
image_x / mapped_width,
|
||||||
|
image_y / mapped_height,
|
||||||
|
(image_x + width) / mapped_width,
|
||||||
|
(image_y + height) / mapped_height
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
fun drawRect(
|
||||||
|
matrix: Matrix4f,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float
|
||||||
|
) {
|
||||||
|
RenderSystem.disableTexture()
|
||||||
|
RenderSystem.enableBlend()
|
||||||
|
RenderSystem.defaultBlendFunc()
|
||||||
|
RenderSystem.setShader(GameRenderer::getPositionColorShader)
|
||||||
|
RenderSystem.depthFunc(GL11.GL_ALWAYS)
|
||||||
|
|
||||||
|
val tess = Tesselator.getInstance()
|
||||||
|
val builder = tess.builder
|
||||||
|
|
||||||
|
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR)
|
||||||
|
|
||||||
|
builder.vertex(matrix, x, y + height, zLevel).color(drawColor).endVertex()
|
||||||
|
builder.vertex(matrix, x + width, y + height, zLevel).color(drawColor).endVertex()
|
||||||
|
builder.vertex(matrix, x + width, y, zLevel).color(drawColor).endVertex()
|
||||||
|
builder.vertex(matrix, x, y, zLevel).color(drawColor).endVertex()
|
||||||
|
|
||||||
|
tess.end()
|
||||||
|
RenderSystem.enableTexture()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun drawRect(
|
||||||
|
pose: PoseStack,
|
||||||
|
x: Float,
|
||||||
|
y: Float,
|
||||||
|
width: Float,
|
||||||
|
height: Float
|
||||||
|
) = drawRect(pose.last().pose(), x, y, width, height)
|
||||||
|
|
||||||
|
private data class ScissorRect(val x: Int, val y: Int, val width: Int, val height: Int)
|
||||||
|
private val scissorStack = ArrayDeque<ScissorRect>()
|
||||||
|
|
||||||
|
@Suppress("NAME_SHADOWING")
|
||||||
|
fun pushScissorRect(x: Int, y: Int, width: Int, height: Int) {
|
||||||
|
var x = x
|
||||||
|
var y = y
|
||||||
|
var width = width
|
||||||
|
var height = height
|
||||||
|
|
||||||
|
val peek = scissorStack.lastOrNull()
|
||||||
|
|
||||||
|
if (peek != null) {
|
||||||
|
x = x.coerceAtLeast(peek.x)
|
||||||
|
y = y.coerceAtLeast(peek.y)
|
||||||
|
width = width.coerceAtMost(peek.width)
|
||||||
|
height = height.coerceAtMost(peek.height)
|
||||||
|
|
||||||
|
if (peek.x == x && peek.y == y && peek.width == width && peek.height == height) {
|
||||||
|
scissorStack.add(peek)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scissorStack.add(ScissorRect(x, y, width, height))
|
||||||
|
y = minecraft.window.height - y - height
|
||||||
|
RenderSystem.enableScissor(x, y, width, height)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun popScissorRect() {
|
||||||
|
scissorStack.removeLast()
|
||||||
|
|
||||||
|
val peek = scissorStack.lastOrNull()
|
||||||
|
|
||||||
|
if (peek == null) {
|
||||||
|
RenderSystem.disableScissor()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val y = minecraft.window.height - peek.y - peek.height
|
||||||
|
RenderSystem.enableScissor(peek.x, y, peek.width, peek.height)
|
||||||
|
}
|
||||||
|
|
@ -54,8 +54,8 @@ class SkinGrid(
|
|||||||
operator fun get(column: Int, row: Int) = SkinElement(texture, column * width, row * height, width, height, imageWidth, imageHeight)
|
operator fun get(column: Int, row: Int) = SkinElement(texture, column * width, row * height, width, height, imageWidth, imageHeight)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val WIDGETS_18 = SkinGrid(RenderHelper.WIDGETS_18, 18f, 18f)
|
val WIDGETS_18 = SkinGrid(WidgetLocation.WIDGETS_18, 18f, 18f)
|
||||||
val WIDGETS_8 = SkinGrid(RenderHelper.WIDGETS_8, 8f, 8f)
|
val WIDGETS_8 = SkinGrid(WidgetLocation.WIDGETS_8, 8f, 8f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,16 +185,13 @@ class SkinElement @JvmOverloads constructor(
|
|||||||
) {
|
) {
|
||||||
val winded = winding.translate(u0, v0, u1, v1)
|
val winded = winding.translate(u0, v0, u1, v1)
|
||||||
|
|
||||||
RenderHelper.drawTexturedRectUV(
|
drawTexturedRect(
|
||||||
stack,
|
stack,
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
winded.u0,
|
winded,
|
||||||
winded.v0,
|
|
||||||
winded.u1,
|
|
||||||
winded.v1,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,16 +219,13 @@ class SkinElement @JvmOverloads constructor(
|
|||||||
|
|
||||||
val winded = winding.translate(u0, v0, u1, v1)
|
val winded = winding.translate(u0, v0, u1, v1)
|
||||||
|
|
||||||
RenderHelper.drawTexturedRectUV(
|
drawTexturedRect(
|
||||||
stack,
|
stack,
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
winded.u0,
|
winded,
|
||||||
winded.v0,
|
|
||||||
winded.u1,
|
|
||||||
winded.v1,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
136
src/main/kotlin/ru/dbotthepony/mc/otm/client/render/UVStuff.kt
Normal file
136
src/main/kotlin/ru/dbotthepony/mc/otm/client/render/UVStuff.kt
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.client.render
|
||||||
|
|
||||||
|
sealed interface IUVCoords {
|
||||||
|
val u0: Float
|
||||||
|
val v0: Float
|
||||||
|
val u1: Float
|
||||||
|
val v1: Float
|
||||||
|
operator fun get(index: Int): Float
|
||||||
|
}
|
||||||
|
|
||||||
|
private val mapImmutable = ArrayList<(input: UVCoords) -> Float>()
|
||||||
|
.also { it.add { it.u0 } }
|
||||||
|
.also { it.add { it.v0 } }
|
||||||
|
.also { it.add { it.u1 } }
|
||||||
|
.also { it.add { it.v1 } }
|
||||||
|
.toTypedArray()
|
||||||
|
|
||||||
|
private val mapMutable = ArrayList<(input: MutableUVCoords) -> Float>()
|
||||||
|
.also { it.add { it.u0 } }
|
||||||
|
.also { it.add { it.v0 } }
|
||||||
|
.also { it.add { it.u1 } }
|
||||||
|
.also { it.add { it.v1 } }
|
||||||
|
.toTypedArray()
|
||||||
|
|
||||||
|
private val mapSetMutable = ArrayList<(input: MutableUVCoords, value: Float) -> Unit>()
|
||||||
|
.also { it.add { input, value -> input.u0 = value } }
|
||||||
|
.also { it.add { input, value -> input.v0 = value } }
|
||||||
|
.also { it.add { input, value -> input.u1 = value } }
|
||||||
|
.also { it.add { input, value -> input.v1 = value } }
|
||||||
|
.toTypedArray()
|
||||||
|
|
||||||
|
data class UVCoords(
|
||||||
|
override val u0: Float,
|
||||||
|
override val v0: Float,
|
||||||
|
override val u1: Float,
|
||||||
|
override val v1: Float,
|
||||||
|
) : IUVCoords {
|
||||||
|
override fun get(index: Int): Float {
|
||||||
|
return mapImmutable[index].invoke(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class MutableUVCoords(
|
||||||
|
override var u0: Float,
|
||||||
|
override var v0: Float,
|
||||||
|
override var u1: Float,
|
||||||
|
override var v1: Float,
|
||||||
|
) : IUVCoords {
|
||||||
|
override fun get(index: Int): Float {
|
||||||
|
return mapMutable[index].invoke(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun set(index: Int, value: Float) {
|
||||||
|
mapSetMutable[index].invoke(this, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val pickers = ArrayList<(u0: Float,
|
||||||
|
v0: Float,
|
||||||
|
u1: Float,
|
||||||
|
v1: Float) -> Float>()
|
||||||
|
.also { it.add { u0, v0, u1, v1 -> u0 } }
|
||||||
|
.also { it.add { u0, v0, u1, v1 -> v0 } }
|
||||||
|
.also { it.add { u0, v0, u1, v1 -> u1 } }
|
||||||
|
.also { it.add { u0, v0, u1, v1 -> v1 } }
|
||||||
|
.toTypedArray()
|
||||||
|
|
||||||
|
enum class UVWindingOrder(
|
||||||
|
val u0: Int,
|
||||||
|
val v0: Int,
|
||||||
|
val u1: Int,
|
||||||
|
val v1: Int,
|
||||||
|
) {
|
||||||
|
NORMAL(0, 1, 2, 3), // normal operation
|
||||||
|
U0_V0_U1_V1(0, 1, 2, 3), // normal operation
|
||||||
|
U0_V1_U1_V0(0, 3, 2, 1), // mirror y
|
||||||
|
FLIP(0, 3, 2, 1), // mirror y
|
||||||
|
U1_V0_U0_V1(2, 1, 0, 3), // mirror x
|
||||||
|
FLOP(2, 1, 0, 3), // mirror x
|
||||||
|
U1_V1_U0_V0(2, 3, 0, 1), // mirror both
|
||||||
|
FLIP_FLOP(2, 3, 0, 1); // mirror both
|
||||||
|
|
||||||
|
val u0Picker = pickers[u0]
|
||||||
|
val v0Picker = pickers[v0]
|
||||||
|
val u1Picker = pickers[u1]
|
||||||
|
val v1Picker = pickers[v1]
|
||||||
|
|
||||||
|
private val buffer = FloatArray(4)
|
||||||
|
|
||||||
|
fun translate(
|
||||||
|
u0: Float,
|
||||||
|
v0: Float,
|
||||||
|
u1: Float,
|
||||||
|
v1: Float,
|
||||||
|
): UVCoords {
|
||||||
|
synchronized(buffer) {
|
||||||
|
buffer[0] = u0
|
||||||
|
buffer[1] = v0
|
||||||
|
buffer[2] = u1
|
||||||
|
buffer[3] = v1
|
||||||
|
|
||||||
|
return UVCoords(buffer[this.u0], buffer[this.v0], buffer[this.u1], buffer[this.v1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun translate(
|
||||||
|
input: UVCoords
|
||||||
|
): UVCoords {
|
||||||
|
synchronized(buffer) {
|
||||||
|
buffer[0] = input.u0
|
||||||
|
buffer[1] = input.v0
|
||||||
|
buffer[2] = input.u1
|
||||||
|
buffer[3] = input.v1
|
||||||
|
|
||||||
|
return UVCoords(buffer[this.u0], buffer[this.v0], buffer[this.u1], buffer[this.v1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun translate(
|
||||||
|
input: MutableUVCoords
|
||||||
|
): MutableUVCoords {
|
||||||
|
synchronized(buffer) {
|
||||||
|
buffer[0] = input.u0
|
||||||
|
buffer[1] = input.v0
|
||||||
|
buffer[2] = input.u1
|
||||||
|
buffer[3] = input.v1
|
||||||
|
|
||||||
|
input[0] = buffer[this.u0]
|
||||||
|
input[1] = buffer[this.v0]
|
||||||
|
input[2] = buffer[this.u1]
|
||||||
|
input[3] = buffer[this.v1]
|
||||||
|
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -8,9 +8,12 @@ import net.minecraft.world.item.ItemStack
|
|||||||
import net.minecraftforge.client.extensions.common.IClientItemExtensions
|
import net.minecraftforge.client.extensions.common.IClientItemExtensions
|
||||||
import org.lwjgl.opengl.GL11
|
import org.lwjgl.opengl.GL11
|
||||||
import ru.dbotthepony.mc.otm.client.minecraft
|
import ru.dbotthepony.mc.otm.client.minecraft
|
||||||
import ru.dbotthepony.mc.otm.core.RGBAColor
|
import ru.dbotthepony.mc.otm.client.render.WidgetLocation
|
||||||
import ru.dbotthepony.mc.otm.client.render.RenderHelper
|
import ru.dbotthepony.mc.otm.client.render.drawColor
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.drawRect
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.drawTexturedRectAuto
|
||||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||||
|
import ru.dbotthepony.mc.otm.core.RGBAColor
|
||||||
|
|
||||||
abstract class AbstractSlotPanel @JvmOverloads constructor(
|
abstract class AbstractSlotPanel @JvmOverloads constructor(
|
||||||
screen: MatteryScreen<*>,
|
screen: MatteryScreen<*>,
|
||||||
@ -23,7 +26,8 @@ abstract class AbstractSlotPanel @JvmOverloads constructor(
|
|||||||
screen, parent, x, y, width, height
|
screen, parent, x, y, width, height
|
||||||
) {
|
) {
|
||||||
protected open fun renderSlotBackground(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) {
|
protected open fun renderSlotBackground(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) {
|
||||||
RenderHelper.drawRegularSlot(stack, 0f, 0f)
|
RenderSystem.setShaderTexture(0, WidgetLocation.WIDGETS)
|
||||||
|
drawTexturedRectAuto(stack, 0f, 0f, 18f, 18f, 0f, 96f, 256f, 256f)
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun renderRegular(stack: PoseStack, itemstack: ItemStack, count_override: String? = null) {
|
protected open fun renderRegular(stack: PoseStack, itemstack: ItemStack, count_override: String? = null) {
|
||||||
@ -68,8 +72,8 @@ abstract class AbstractSlotPanel @JvmOverloads constructor(
|
|||||||
if (isHovered) {
|
if (isHovered) {
|
||||||
stack.pushPose()
|
stack.pushPose()
|
||||||
stack.translate(0.0, 0.0, zHeight)
|
stack.translate(0.0, 0.0, zHeight)
|
||||||
RenderHelper.setDrawColor(SLOT_HIGHLIGHT)
|
drawColor = SLOT_HIGHLIGHT
|
||||||
RenderHelper.drawRect(stack, 1f, 1f, width - 1, height - 1)
|
drawRect(stack, 1f, 1f, width - 1, height - 1)
|
||||||
stack.popPose()
|
stack.popPose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import net.minecraft.client.resources.sounds.SimpleSoundInstance
|
|||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
import net.minecraft.sounds.SoundEvents
|
import net.minecraft.sounds.SoundEvents
|
||||||
import ru.dbotthepony.mc.otm.client.minecraft
|
import ru.dbotthepony.mc.otm.client.minecraft
|
||||||
import ru.dbotthepony.mc.otm.client.render.RenderHelper
|
|
||||||
import ru.dbotthepony.mc.otm.client.render.SkinElement
|
import ru.dbotthepony.mc.otm.client.render.SkinElement
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.WidgetLocation
|
||||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||||
import ru.dbotthepony.mc.otm.client.screen.panels.CheckBoxPanel.Companion.REGULAR_DIMENSIONS
|
import ru.dbotthepony.mc.otm.client.screen.panels.CheckBoxPanel.Companion.REGULAR_DIMENSIONS
|
||||||
import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputWidget
|
import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputWidget
|
||||||
@ -41,7 +41,7 @@ open class CheckBoxPanel(
|
|||||||
const val REGULAR_DIMENSIONS = 15f
|
const val REGULAR_DIMENSIONS = 15f
|
||||||
|
|
||||||
val CHECKBOX_UNCHECKED = SkinElement(
|
val CHECKBOX_UNCHECKED = SkinElement(
|
||||||
RenderHelper.WIDGETS,
|
WidgetLocation.WIDGETS,
|
||||||
x = 18f,
|
x = 18f,
|
||||||
y = 65f,
|
y = 65f,
|
||||||
w = REGULAR_DIMENSIONS,
|
w = REGULAR_DIMENSIONS,
|
||||||
@ -49,7 +49,7 @@ open class CheckBoxPanel(
|
|||||||
)
|
)
|
||||||
|
|
||||||
val CHECKBOX_CHECKED = SkinElement(
|
val CHECKBOX_CHECKED = SkinElement(
|
||||||
RenderHelper.WIDGETS,
|
WidgetLocation.WIDGETS,
|
||||||
x = 18f,
|
x = 18f,
|
||||||
y = 80f,
|
y = 80f,
|
||||||
w = REGULAR_DIMENSIONS,
|
w = REGULAR_DIMENSIONS,
|
||||||
|
@ -7,7 +7,8 @@ import net.minecraft.client.Minecraft
|
|||||||
import net.minecraft.client.gui.Font
|
import net.minecraft.client.gui.Font
|
||||||
import net.minecraft.client.gui.components.events.GuiEventListener
|
import net.minecraft.client.gui.components.events.GuiEventListener
|
||||||
import org.apache.logging.log4j.LogManager
|
import org.apache.logging.log4j.LogManager
|
||||||
import ru.dbotthepony.mc.otm.client.render.RenderHelper
|
import ru.dbotthepony.mc.otm.client.render.popScissorRect
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.pushScissorRect
|
||||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
|
|
||||||
@ -280,7 +281,7 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
if (scissor) {
|
if (scissor) {
|
||||||
val scale = Minecraft.getInstance().window.guiScale
|
val scale = Minecraft.getInstance().window.guiScale
|
||||||
|
|
||||||
RenderHelper.pushScissorRect(
|
pushScissorRect(
|
||||||
(absoluteX * scale).toInt(),
|
(absoluteX * scale).toInt(),
|
||||||
(absoluteY * scale).toInt(),
|
(absoluteY * scale).toInt(),
|
||||||
(width * scale).toInt() + 1,
|
(width * scale).toInt() + 1,
|
||||||
@ -305,7 +306,7 @@ open class EditablePanel @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (scissor) {
|
if (scissor) {
|
||||||
RenderHelper.popScissorRect()
|
popScissorRect()
|
||||||
}
|
}
|
||||||
|
|
||||||
return depth
|
return depth
|
||||||
|
@ -293,17 +293,17 @@ open class FramePanel(
|
|||||||
const val PADDING = 8f
|
const val PADDING = 8f
|
||||||
const val PADDING_TOP = 14f
|
const val PADDING_TOP = 14f
|
||||||
|
|
||||||
val top_left_window_corner = SkinElement(RenderHelper.WIDGETS, x = 18f, y = 0f, w = 6f, h = 6f)
|
val top_left_window_corner = WidgetLocation.WIDGETS.element(x = 18f, y = 0f, w = 6f, h = 6f)
|
||||||
val top_right_window_corner = SkinElement(RenderHelper.WIDGETS, x = 24f, y = 0f, w = 6f, h = 6f)
|
val top_right_window_corner = WidgetLocation.WIDGETS.element(x = 24f, y = 0f, w = 6f, h = 6f)
|
||||||
val left_window_border = SkinElement(RenderHelper.WIDGETS, x = 18f, y = 4f, w = 3f, h = 5f)
|
val left_window_border = WidgetLocation.WIDGETS.element(x = 18f, y = 4f, w = 3f, h = 5f)
|
||||||
val right_window_border = SkinElement(RenderHelper.WIDGETS, x = 27f, y = 3f, w = 3f, h = 5f)
|
val right_window_border = WidgetLocation.WIDGETS.element(x = 27f, y = 3f, w = 3f, h = 5f)
|
||||||
val top_window_border = SkinElement(RenderHelper.WIDGETS, x = 22f, y = 0f, w = 5f, h = 3f)
|
val top_window_border = WidgetLocation.WIDGETS.element(x = 22f, y = 0f, w = 5f, h = 3f)
|
||||||
val window_background = SkinElement(RenderHelper.WIDGETS, x = 30f, y = 12f, w = 6f, h = 6f)
|
val window_background = WidgetLocation.WIDGETS.element(x = 30f, y = 12f, w = 6f, h = 6f)
|
||||||
val tab_right_connection = SkinElement(RenderHelper.WIDGETS, x = 30f, y = 0f, w = 3f, h = 5f)
|
val tab_right_connection = WidgetLocation.WIDGETS.element(x = 30f, y = 0f, w = 3f, h = 5f)
|
||||||
val tab_left_connection = SkinElement(RenderHelper.WIDGETS, x = 33f, y = 0f, w = 3f, h = 5f)
|
val tab_left_connection = WidgetLocation.WIDGETS.element(x = 33f, y = 0f, w = 3f, h = 5f)
|
||||||
val tab_background = SkinElement(RenderHelper.WIDGETS, x = 30f, y = 6f, w = 6f, h = 6f)
|
val tab_background = WidgetLocation.WIDGETS.element(x = 30f, y = 6f, w = 6f, h = 6f)
|
||||||
val bottom_left_window_corner = SkinElement(RenderHelper.WIDGETS, x = 18f, y = 6f, w = 6f, h = 6f)
|
val bottom_left_window_corner = WidgetLocation.WIDGETS.element(x = 18f, y = 6f, w = 6f, h = 6f)
|
||||||
val bottom_right_window_corner = SkinElement(RenderHelper.WIDGETS, x = 24f, y = 6f, w = 6f, h = 6f)
|
val bottom_right_window_corner = WidgetLocation.WIDGETS.element(x = 24f, y = 6f, w = 6f, h = 6f)
|
||||||
val bottom_window_border = SkinElement(RenderHelper.WIDGETS, x = 21f, y = 9f, w = 5f, h = 3f)
|
val bottom_window_border = WidgetLocation.WIDGETS.element(x = 21f, y = 9f, w = 5f, h = 3f)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -140,12 +140,12 @@ open class ScrollBarPanel(screen: MatteryScreen<*>, parent: EditablePanel?, x: F
|
|||||||
companion object {
|
companion object {
|
||||||
const val WIDTH = 14f
|
const val WIDTH = 14f
|
||||||
|
|
||||||
val scroll_bar_top = RenderHelper.SCROLL.element(0f, 45f, 14f, 2f, 14f, 53f)
|
val scroll_bar_top = WidgetLocation.SCROLL.element(0f, 45f, 14f, 2f, 14f, 53f)
|
||||||
val scroll_bar_body = RenderHelper.SCROLL.element(0f, 46f, 14f, 6f, 14f, 53f)
|
val scroll_bar_body = WidgetLocation.SCROLL.element(0f, 46f, 14f, 6f, 14f, 53f)
|
||||||
val scroll_bar_bottom = RenderHelper.SCROLL.element(0f, 51f, 14f, 2f, 14f, 53f)
|
val scroll_bar_bottom = WidgetLocation.SCROLL.element(0f, 51f, 14f, 2f, 14f, 53f)
|
||||||
|
|
||||||
val scroll_bar_button = RenderHelper.SCROLL.element(0f, 0f, 12f, 15f, 14f, 53f)
|
val scroll_bar_button = WidgetLocation.SCROLL.element(0f, 0f, 12f, 15f, 14f, 53f)
|
||||||
val scroll_bar_button_hover = RenderHelper.SCROLL.element(0f, 15f, 12f, 15f, 14f, 53f)
|
val scroll_bar_button_hover = WidgetLocation.SCROLL.element(0f, 15f, 12f, 15f, 14f, 53f)
|
||||||
val scroll_bar_button_press = RenderHelper.SCROLL.element(0f, 30f, 12f, 15f, 14f, 53f)
|
val scroll_bar_button_press = WidgetLocation.SCROLL.element(0f, 30f, 12f, 15f, 14f, 53f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,8 @@ import net.minecraft.ChatFormatting
|
|||||||
import net.minecraft.client.renderer.GameRenderer
|
import net.minecraft.client.renderer.GameRenderer
|
||||||
import net.minecraft.world.inventory.AbstractContainerMenu
|
import net.minecraft.world.inventory.AbstractContainerMenu
|
||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
import ru.dbotthepony.mc.otm.client.render.RenderHelper
|
import ru.dbotthepony.mc.otm.client.render.drawRect
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.setDrawColor
|
||||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||||
import ru.dbotthepony.mc.otm.menu.MatterySlot
|
import ru.dbotthepony.mc.otm.menu.MatterySlot
|
||||||
import javax.annotation.Nonnull
|
import javax.annotation.Nonnull
|
||||||
@ -83,8 +84,8 @@ class SlotPanel<T : MatterySlot>(
|
|||||||
RenderSystem.setShader(GameRenderer::getPositionTexShader)
|
RenderSystem.setShader(GameRenderer::getPositionTexShader)
|
||||||
|
|
||||||
if (dragHit) {
|
if (dragHit) {
|
||||||
RenderHelper.setDrawColor(SLOT_HIGHLIGHT_DRAG)
|
setDrawColor(SLOT_HIGHLIGHT_DRAG)
|
||||||
RenderHelper.drawRect(stack, 1f, 1f, width - 1, height - 1)
|
drawRect(stack, 1f, 1f, width - 1, height - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
renderRegular(stack, itemstack, countOverride)
|
renderRegular(stack, itemstack, countOverride)
|
||||||
|
@ -5,10 +5,11 @@ import com.mojang.blaze3d.vertex.PoseStack
|
|||||||
import net.minecraft.ChatFormatting
|
import net.minecraft.ChatFormatting
|
||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
import ru.dbotthepony.mc.otm.TranslatableComponent
|
import ru.dbotthepony.mc.otm.TranslatableComponent
|
||||||
import ru.dbotthepony.mc.otm.client.render.RenderHelper
|
|
||||||
import ru.dbotthepony.mc.otm.client.render.SkinElement
|
import ru.dbotthepony.mc.otm.client.render.SkinElement
|
||||||
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
|
||||||
import ru.dbotthepony.mc.otm.client.render.UVWindingOrder
|
import ru.dbotthepony.mc.otm.client.render.UVWindingOrder
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.WidgetLocation
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.element
|
||||||
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel
|
||||||
import ru.dbotthepony.mc.otm.core.formatMatterLevel
|
import ru.dbotthepony.mc.otm.core.formatMatterLevel
|
||||||
import ru.dbotthepony.mc.otm.core.formatPowerLevel
|
import ru.dbotthepony.mc.otm.core.formatPowerLevel
|
||||||
@ -49,8 +50,8 @@ open class PowerGaugePanel @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val GAUGE_BACKGROUND = SkinElement(RenderHelper.WIDGETS, x = 0f, y = 48f, w = 9f, h = 48f)
|
val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 48f, w = 9f, h = 48f)
|
||||||
val GAUGE_FOREGROUND = SkinElement(RenderHelper.WIDGETS, x = 9f, y = 48f, w = 9f, h = 48f)
|
val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 9f, y = 48f, w = 9f, h = 48f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,8 +89,8 @@ open class MatterGaugePanel @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val GAUGE_BACKGROUND = SkinElement(RenderHelper.WIDGETS, x = 0f, y = 0f, w = 9f, h = 48f)
|
val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 0f, w = 9f, h = 48f)
|
||||||
val GAUGE_FOREGROUND = SkinElement(RenderHelper.WIDGETS, x = 9f, y = 0f, w = 9f, h = 48f)
|
val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 9f, y = 0f, w = 9f, h = 48f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,8 +128,8 @@ open class PatternGaugePanel @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val GAUGE_BACKGROUND = SkinElement(RenderHelper.WIDGETS, x = 0f, y = 148f, w = 9f, h = 48f)
|
val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 148f, w = 9f, h = 48f)
|
||||||
val GAUGE_FOREGROUND = SkinElement(RenderHelper.WIDGETS, x = 9f, y = 148f, w = 9f, h = 48f)
|
val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 9f, y = 148f, w = 9f, h = 48f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,7 +199,7 @@ open class ProgressGaugePanel @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val GAUGE_BACKGROUND = SkinElement(RenderHelper.WIDGETS, x = 0f, y = 132f, w = 22f, h = 16f)
|
val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 132f, w = 22f, h = 16f)
|
||||||
val GAUGE_FOREGROUND = SkinElement(RenderHelper.WIDGETS, x = 22f, y = 132f, w = 22f, h = 16f)
|
val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 22f, y = 132f, w = 22f, h = 16f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package ru.dbotthepony.mc.otm.core
|
package ru.dbotthepony.mc.otm.core
|
||||||
|
|
||||||
import com.mojang.blaze3d.systems.RenderSystem
|
import com.mojang.blaze3d.systems.RenderSystem
|
||||||
import ru.dbotthepony.mc.otm.client.render.RenderHelper
|
|
||||||
|
|
||||||
data class RGBAColor(val red: Float, val green: Float, val blue: Float, val alpha: Float = 1f) {
|
data class RGBAColor(val red: Float, val green: Float, val blue: Float, val alpha: Float = 1f) {
|
||||||
constructor(r: Int, g: Int, b: Int) : this((r / 255f), (g / 255f), (b / 255f), 1f)
|
constructor(r: Int, g: Int, b: Int) : this((r / 255f), (g / 255f), (b / 255f), 1f)
|
||||||
@ -38,7 +37,7 @@ data class RGBAColor(val red: Float, val green: Float, val blue: Float, val alph
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setDrawColor() {
|
fun setDrawColor() {
|
||||||
RenderHelper.setDrawColor(this)
|
ru.dbotthepony.mc.otm.client.render.setDrawColor(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun linearInterpolation(t: Float, other: RGBAColor): RGBAColor {
|
fun linearInterpolation(t: Float, other: RGBAColor): RGBAColor {
|
||||||
|
@ -27,7 +27,8 @@ import net.minecraftforge.network.NetworkEvent
|
|||||||
import ru.dbotthepony.mc.otm.*
|
import ru.dbotthepony.mc.otm.*
|
||||||
import ru.dbotthepony.mc.otm.capability.matteryEnergy
|
import ru.dbotthepony.mc.otm.capability.matteryEnergy
|
||||||
import ru.dbotthepony.mc.otm.client.font
|
import ru.dbotthepony.mc.otm.client.font
|
||||||
import ru.dbotthepony.mc.otm.client.render.RenderHelper
|
import ru.dbotthepony.mc.otm.client.render.drawRect
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.setDrawColor
|
||||||
import ru.dbotthepony.mc.otm.core.*
|
import ru.dbotthepony.mc.otm.core.*
|
||||||
import ru.dbotthepony.mc.otm.core.Vector
|
import ru.dbotthepony.mc.otm.core.Vector
|
||||||
import ru.dbotthepony.mc.otm.network.MatteryNetworking
|
import ru.dbotthepony.mc.otm.network.MatteryNetworking
|
||||||
@ -450,8 +451,8 @@ abstract class AbstractWeaponItem<D : WeaponDataTable>(val tables: KClass<D>, ra
|
|||||||
pose.mulPose(Vector3f.YP.rotationDegrees(180f))
|
pose.mulPose(Vector3f.YP.rotationDegrees(180f))
|
||||||
pose.scale(0.01f, 0.01f, 0.01f)
|
pose.scale(0.01f, 0.01f, 0.01f)
|
||||||
|
|
||||||
RenderHelper.setDrawColor(holoHudBackground)
|
setDrawColor(holoHudBackground)
|
||||||
RenderHelper.drawRect(pose, -2f, -2f, 72f, 34f)
|
drawRect(pose, -2f, -2f, 72f, 34f)
|
||||||
|
|
||||||
stack.matteryEnergy?.let {
|
stack.matteryEnergy?.let {
|
||||||
pose.pushPose()
|
pose.pushPose()
|
||||||
@ -464,12 +465,12 @@ abstract class AbstractWeaponItem<D : WeaponDataTable>(val tables: KClass<D>, ra
|
|||||||
|
|
||||||
pose.translate(60.0, 0.0, 0.0)
|
pose.translate(60.0, 0.0, 0.0)
|
||||||
|
|
||||||
RenderHelper.setDrawColor(heatBackground)
|
setDrawColor(heatBackground)
|
||||||
RenderHelper.drawRect(pose, -1f, -1f, 9f, 32f)
|
drawRect(pose, -1f, -1f, 9f, 32f)
|
||||||
|
|
||||||
val heat = item.heatProgress(stack, event.partialTick.toDouble()).toFloat()
|
val heat = item.heatProgress(stack, event.partialTick.toDouble()).toFloat()
|
||||||
RenderHelper.setDrawColor(linearInterpolation(heat, initialHeatColor, finalHeatColor))
|
setDrawColor(linearInterpolation(heat, initialHeatColor, finalHeatColor))
|
||||||
RenderHelper.drawRect(pose, 0f, 30f * (1f - heat), 7f, 30f * heat)
|
drawRect(pose, 0f, 30f * (1f - heat), 7f, 30f * heat)
|
||||||
}
|
}
|
||||||
|
|
||||||
pose.popPose()
|
pose.popPose()
|
||||||
|
@ -12,7 +12,6 @@ import ru.dbotthepony.mc.otm.android.AndroidResearch
|
|||||||
import ru.dbotthepony.mc.otm.android.AndroidResearchType
|
import ru.dbotthepony.mc.otm.android.AndroidResearchType
|
||||||
import ru.dbotthepony.mc.otm.capability.AndroidCapability
|
import ru.dbotthepony.mc.otm.capability.AndroidCapability
|
||||||
import ru.dbotthepony.mc.otm.capability.android
|
import ru.dbotthepony.mc.otm.capability.android
|
||||||
import ru.dbotthepony.mc.otm.capability.android.*
|
|
||||||
import ru.dbotthepony.mc.otm.client.minecraft
|
import ru.dbotthepony.mc.otm.client.minecraft
|
||||||
import ru.dbotthepony.mc.otm.core.ImpreciseFraction
|
import ru.dbotthepony.mc.otm.core.ImpreciseFraction
|
||||||
import ru.dbotthepony.mc.otm.core.readImpreciseFraction
|
import ru.dbotthepony.mc.otm.core.readImpreciseFraction
|
||||||
|
Loading…
Reference in New Issue
Block a user