Начинающий
- Статус
- Оффлайн
- Регистрация
- 13 Май 2025
- Сообщения
- 186
- Реакции
- 1
- Выберите загрузчик игры
- Fabric
GlUtils:
package wtf.reek.util.impl.render;
import com.mojang.blaze3d.systems.ProjectionType;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.util.Window;
import org.joml.Matrix4f;
import org.lwjgl.opengl.GL11;
import wtf.reek.util.type.Wrapper;
public class GLUtils implements Wrapper {
private static double savedScaleFactor = -1;
private static Matrix4f savedProjectionMatrix = null;
private static ProjectionType savedProjectionType = null;
public static void setupOverlayRendering(int scale) {
savedScaleFactor = sr.getScaleFactor();
savedProjectionMatrix = new Matrix4f(RenderSystem.getProjectionMatrix());
savedProjectionType = RenderSystem.getProjectionType();
sr.setScaleFactor(scale);
GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
Matrix4f projectionMatrix = new Matrix4f();
projectionMatrix.setOrtho(0.0f, (float) sr.getScaledWidth(), (float) sr.getScaledHeight(), 0.0f, 1000.0f, 3000.0f);
RenderSystem.setProjectionMatrix(projectionMatrix, ProjectionType.ORTHOGRAPHIC);
RenderSystem.getModelViewStack().pushMatrix();
RenderSystem.getModelViewStack().identity();
RenderSystem.getModelViewStack().translate(0.0f, 0.0f, -2000.0f);
}
public static void setupOverlayRendering() {
int scale = sr.calculateScaleFactor(mc.options.getGuiScale().getValue(), mc.forcesUnicodeFont());
setupOverlayRendering(scale);
}
public static void restoreRendering() {
if (savedScaleFactor == -1) {
return;
}
sr.setScaleFactor(savedScaleFactor);
savedScaleFactor = -1;
RenderSystem.getModelViewStack().popMatrix();
if (savedProjectionMatrix != null && savedProjectionType != null) {
RenderSystem.setProjectionMatrix(savedProjectionMatrix, savedProjectionType);
savedProjectionMatrix = null;
savedProjectionType = null;
}
}
public static int getScaledWidth() {
return sr.getScaledWidth();
}
public static int getScaledHeight() {
return sr.getScaledHeight();
}
public static double getScaleFactor() {
return sr.getScaleFactor();
}
public static Window getWindow() {
return sr;
}
}
пример как использовать
InGameHudMixin:
package wtf.reek.mixin.client.gui.hud;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.hud.InGameHud;
import net.minecraft.client.render.RenderTickCounter;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import wtf.reek.Reek;
import wtf.reek.events.render.DrawEvent;
import wtf.reek.util.impl.render.GLUtils;
import wtf.reek.util.type.Wrapper;
@Mixin(InGameHud.class)
public class InGameHudMixin implements Wrapper {
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;render(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V", shift = At.Shift.AFTER))
public void onRender(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) {
GLUtils.setupOverlayRendering(2);
DrawEvent event = new DrawEvent(context, tickCounter.getTickDelta(false));
GLUtils.restoreRendering();
Reek.getInstance().getEventBus().post(event);
}
}