Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 23 Окт 2025
- Сообщения
- 21
- Реакции
- 3
FrameBufferHelper:
public class FrameBufferHelper {
public static Framebuffer entitiesFramebuffer;
public static void ensureFramebuffer() {
if (entitiesFramebuffer == null) {
entitiesFramebuffer = new SimpleFramebuffer(mc.getWindow().getFramebufferWidth(), mc.getWindow().getFramebufferHeight(), true);
}
if (entitiesFramebuffer.textureWidth != mc.getWindow().getFramebufferWidth() || entitiesFramebuffer.textureHeight != mc.getWindow().getFramebufferHeight()) {
entitiesFramebuffer.resize(mc.getWindow().getFramebufferWidth(), mc.getWindow().getFramebufferHeight());
}
}
public static void clearFramebuffer() {
ensureFramebuffer();
GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
entitiesFramebuffer.clear();
GL11.glClearColor(1.0F, 1.0F, 1.0F, 1.0F);
}
public static void drawFramebuffer() {
if (entitiesFramebuffer == null) return;
RenderSystem.enableBlend();
RenderSystem.blendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
RenderSystem.disableDepthTest();
entitiesFramebuffer.draw(mc.getWindow().getFramebufferWidth(), mc.getWindow().getFramebufferHeight());
RenderSystem.enableDepthTest();
RenderSystem.defaultBlendFunc();
}
}
EntityRenderDispatcherMixin:
@Mixin(EntityRenderDispatcher.class)
public abstract class EntityRenderDispatcherMixin {
@Shadow
public abstract <E extends Entity, S extends EntityRenderState> void render(E entity, double x, double y, double z, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityRenderer<? super E, S> renderer);
@Unique
private boolean isRenderingChams = false;
@Unique
private long lastPrintTime = 0;
@Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
at = @At("HEAD"))
private <E extends Entity, S extends EntityRenderState> void onRender(E entity, double x, double y, double z, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityRenderer<? super E, S> renderer, CallbackInfo ci) {
if (entity instanceof PlayerEntity && !isRenderingChams) {
long now = System.currentTimeMillis();
boolean doPrint = (now - lastPrintTime > 3000);
if (doPrint) {
System.out.println("========== [DEBUG START] ==========");
System.out.println(" Entity: " + entity.getName().getString());
lastPrintTime = now;
}
try {
MinecraftClient mc = MinecraftClient.getInstance();
Framebuffer mainFramebuffer = mc.getFramebuffer();
if (mainFramebuffer == null) {
if (doPrint) System.out.println("ERROR:Framebuffer нулик ");
return;
}
FrameBufferHelper.ensureFramebuffer();
if (FrameBufferHelper.entitiesFramebuffer == null) {
if (doPrint) System.out.println("ERROR фрейм бафер не тютю");
return;
}
if (doPrint) {
System.out.println("Main FBO ID: " + mainFramebuffer.fbo);
System.out.println("Chams FBO ID: " + FrameBufferHelper.entitiesFramebuffer.fbo);
}
FrameBufferHelper.entitiesFramebuffer.beginWrite(false);
VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers();
isRenderingChams = true;
this.render(entity, x, y, z, tickDelta, matrices, immediate, light, renderer);
immediate.draw();
isRenderingChams = false;
FrameBufferHelper.entitiesFramebuffer.endWrite();
mainFramebuffer.beginWrite(false);
if (doPrint) {
System.out.println("========== [DEBUG END] ==========");
}
} catch (Exception e) {
e.printStackTrace();
isRenderingChams = false;
if (MinecraftClient.getInstance().getFramebuffer() != null) {
MinecraftClient.getInstance().getFramebuffer().beginWrite(false);
}
}
}
}
}