Spaces:
Build error
Build error
package net.minecraft.client.renderer; | |
import com.mojang.blaze3d.ProjectionType; | |
import com.mojang.blaze3d.platform.Lighting; | |
import com.mojang.blaze3d.platform.NativeImage; | |
import com.mojang.blaze3d.platform.Window; | |
import com.mojang.blaze3d.resource.CrossFrameResourcePool; | |
import com.mojang.blaze3d.systems.RenderSystem; | |
import com.mojang.blaze3d.vertex.PoseStack; | |
import com.mojang.logging.LogUtils; | |
import com.mojang.math.Axis; | |
import java.io.IOException; | |
import java.nio.file.Files; | |
import java.nio.file.Path; | |
import java.util.Locale; | |
import javax.annotation.Nullable; | |
import net.minecraft.CrashReport; | |
import net.minecraft.CrashReportCategory; | |
import net.minecraft.ReportedException; | |
import net.minecraft.Util; | |
import net.minecraft.client.Camera; | |
import net.minecraft.client.DeltaTracker; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.Options; | |
import net.minecraft.client.Screenshot; | |
import net.minecraft.client.gui.GuiGraphics; | |
import net.minecraft.client.player.AbstractClientPlayer; | |
import net.minecraft.client.renderer.texture.OverlayTexture; | |
import net.minecraft.client.server.IntegratedServer; | |
import net.minecraft.core.BlockPos; | |
import net.minecraft.core.Direction; | |
import net.minecraft.core.Registry; | |
import net.minecraft.core.registries.Registries; | |
import net.minecraft.resources.ResourceLocation; | |
import net.minecraft.server.packs.resources.ResourceManager; | |
import net.minecraft.server.packs.resources.ResourceProvider; | |
import net.minecraft.util.Mth; | |
import net.minecraft.util.RandomSource; | |
import net.minecraft.util.profiling.Profiler; | |
import net.minecraft.util.profiling.ProfilerFiller; | |
import net.minecraft.util.profiling.Zone; | |
import net.minecraft.world.effect.MobEffectInstance; | |
import net.minecraft.world.effect.MobEffects; | |
import net.minecraft.world.entity.Entity; | |
import net.minecraft.world.entity.EntitySelector; | |
import net.minecraft.world.entity.LivingEntity; | |
import net.minecraft.world.entity.monster.Creeper; | |
import net.minecraft.world.entity.monster.EnderMan; | |
import net.minecraft.world.entity.monster.Spider; | |
import net.minecraft.world.entity.player.Player; | |
import net.minecraft.world.entity.projectile.ProjectileUtil; | |
import net.minecraft.world.item.ItemDisplayContext; | |
import net.minecraft.world.item.ItemStack; | |
import net.minecraft.world.level.GameType; | |
import net.minecraft.world.level.block.Block; | |
import net.minecraft.world.level.block.state.BlockState; | |
import net.minecraft.world.level.block.state.pattern.BlockInWorld; | |
import net.minecraft.world.level.material.FogType; | |
import net.minecraft.world.phys.AABB; | |
import net.minecraft.world.phys.BlockHitResult; | |
import net.minecraft.world.phys.EntityHitResult; | |
import net.minecraft.world.phys.HitResult; | |
import net.minecraft.world.phys.Vec3; | |
import net.minecraftforge.api.distmarker.Dist; | |
import net.minecraftforge.api.distmarker.OnlyIn; | |
import org.joml.Matrix4f; | |
import org.joml.Matrix4fStack; | |
import org.joml.Quaternionf; | |
import org.joml.Vector3f; | |
import org.slf4j.Logger; | |
public class GameRenderer implements AutoCloseable { | |
private static final ResourceLocation BLUR_POST_CHAIN_ID = ResourceLocation.withDefaultNamespace("blur"); | |
public static final int MAX_BLUR_RADIUS = 10; | |
private static final Logger LOGGER = LogUtils.getLogger(); | |
private static final boolean DEPTH_BUFFER_DEBUG = false; | |
public static final float PROJECTION_Z_NEAR = 0.05F; | |
private static final float GUI_Z_NEAR = 1000.0F; | |
private final Minecraft minecraft; | |
private final ResourceManager resourceManager; | |
private final RandomSource random = RandomSource.create(); | |
private float renderDistance; | |
public final ItemInHandRenderer itemInHandRenderer; | |
private final RenderBuffers renderBuffers; | |
private int confusionAnimationTick; | |
private float fovModifier; | |
private float oldFovModifier; | |
private float darkenWorldAmount; | |
private float darkenWorldAmountO; | |
private boolean renderHand = true; | |
private boolean renderBlockOutline = true; | |
private long lastScreenshotAttempt; | |
private boolean hasWorldScreenshot; | |
private long lastActiveTime = Util.getMillis(); | |
private final LightTexture lightTexture; | |
private final OverlayTexture overlayTexture = new OverlayTexture(); | |
private boolean panoramicMode; | |
private float zoom = 1.0F; | |
private float zoomX; | |
private float zoomY; | |
public static final int ITEM_ACTIVATION_ANIMATION_LENGTH = 40; | |
private ItemStack itemActivationItem; | |
private int itemActivationTicks; | |
private float itemActivationOffX; | |
private float itemActivationOffY; | |
private final CrossFrameResourcePool resourcePool = new CrossFrameResourcePool(3); | |
private ResourceLocation postEffectId; | |
private boolean effectActive; | |
private final Camera mainCamera = new Camera(); | |
public GameRenderer(Minecraft p_234219_, ItemInHandRenderer p_234220_, ResourceManager p_234221_, RenderBuffers p_234222_) { | |
this.minecraft = p_234219_; | |
this.resourceManager = p_234221_; | |
this.itemInHandRenderer = p_234220_; | |
this.lightTexture = new LightTexture(this, p_234219_); | |
this.renderBuffers = p_234222_; | |
} | |
public void close() { | |
this.lightTexture.close(); | |
this.overlayTexture.close(); | |
this.resourcePool.close(); | |
} | |
public void setRenderHand(boolean p_172737_) { | |
this.renderHand = p_172737_; | |
} | |
public void setRenderBlockOutline(boolean p_172776_) { | |
this.renderBlockOutline = p_172776_; | |
} | |
public void setPanoramicMode(boolean p_172780_) { | |
this.panoramicMode = p_172780_; | |
} | |
public boolean isPanoramicMode() { | |
return this.panoramicMode; | |
} | |
public void clearPostEffect() { | |
this.postEffectId = null; | |
} | |
public void togglePostEffect() { | |
this.effectActive = !this.effectActive; | |
} | |
public void checkEntityPostEffect( { Entity p_109107_) | |
this.postEffectId = null; | |
if (p_109107_ instanceof Creeper) { | |
this.setPostEffect(ResourceLocation.withDefaultNamespace("creeper")); | |
} else if (p_109107_ instanceof Spider) { | |
this.setPostEffect(ResourceLocation.withDefaultNamespace("spider")); | |
} else if (p_109107_ instanceof EnderMan) { | |
this.setPostEffect(ResourceLocation.withDefaultNamespace("invert")); | |
} | |
} | |
private void setPostEffect(ResourceLocation p_367260_) { | |
this.postEffectId = p_367260_; | |
this.effectActive = true; | |
} | |
public void processBlurEffect() { | |
float f = (float)this.minecraft.options.getMenuBackgroundBlurriness(); | |
if (!(f < 1.0F)) { | |
PostChain postchain = this.minecraft.getShaderManager().getPostChain(BLUR_POST_CHAIN_ID, LevelTargetBundle.MAIN_TARGETS); | |
if (postchain != null) { | |
postchain.setUniform("Radius", f); | |
postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool); | |
} | |
} | |
} | |
public void preloadUiShader(ResourceProvider p_172723_) { | |
try { | |
this.minecraft.getShaderManager().preloadForStartup(p_172723_, CoreShaders.RENDERTYPE_GUI, CoreShaders.RENDERTYPE_GUI_OVERLAY, CoreShaders.POSITION_TEX_COLOR); | |
} catch (ShaderManager.CompilationException | IOException ioexception) { | |
throw new RuntimeException("Could not preload shaders for loading UI", ioexception); | |
} | |
} | |
public void tick() { | |
this.tickFov(); | |
this.lightTexture.tick(); | |
if (this.minecraft.getCameraEntity() == null) { | |
this.minecraft.setCameraEntity(this.minecraft.player); | |
} | |
this.mainCamera.tick(); | |
this.itemInHandRenderer.tick(); | |
this.confusionAnimationTick++; | |
if (this.minecraft.level.tickRateManager().runsNormally()) { | |
this.minecraft.levelRenderer.tickParticles(this.mainCamera); | |
this.darkenWorldAmountO = this.darkenWorldAmount; | |
if (this.minecraft.gui.getBossOverlay().shouldDarkenScreen()) { | |
this.darkenWorldAmount += 0.05F; | |
if (this.darkenWorldAmount > 1.0F) { | |
this.darkenWorldAmount = 1.0F; | |
} | |
} else if (this.darkenWorldAmount > 0.0F) { | |
this.darkenWorldAmount -= 0.0125F; | |
} | |
if (this.itemActivationTicks > 0) { | |
this.itemActivationTicks--; | |
if (this.itemActivationTicks == 0) { | |
this.itemActivationItem = null; | |
} | |
} | |
} | |
} | |
public ResourceLocation currentPostEffect() { | |
return this.postEffectId; | |
} | |
public void resize(int p_109098_, int p_109099_) { | |
this.resourcePool.clear(); | |
this.minecraft.levelRenderer.resize(p_109098_, p_109099_); | |
} | |
public void pick(float p_109088_) { | |
Entity entity = this.minecraft.getCameraEntity(); | |
if (entity != null) { | |
if (this.minecraft.level != null && this.minecraft.player != null) { | |
Profiler.get().push("pick"); | |
double d0 = this.minecraft.player.blockInteractionRange(); | |
double d1 = this.minecraft.player.entityInteractionRange(); | |
HitResult hitresult = this.pick(entity, d0, d1, p_109088_); | |
this.minecraft.hitResult = hitresult; | |
this.minecraft.crosshairPickEntity = hitresult instanceof EntityHitResult entityhitresult ? entityhitresult.getEntity() : null; | |
Profiler.get().pop(); | |
} | |
} | |
} | |
private HitResult pick(Entity p_328026_, double p_328198_, double p_332188_, float p_336363_) { | |
double d0 = Math.max(p_328198_, p_332188_); | |
double d1 = Mth.square(d0); | |
Vec3 vec3 = p_328026_.getEyePosition(p_336363_); | |
HitResult hitresult = p_328026_.pick(d0, p_336363_, false); | |
double d2 = hitresult.getLocation().distanceToSqr(vec3); | |
if (hitresult.getType() != HitResult.Type.MISS) { | |
d1 = d2; | |
d0 = Math.sqrt(d2); | |
} | |
Vec3 vec31 = p_328026_.getViewVector(p_336363_); | |
Vec3 vec32 = vec3.add(vec31.x * d0, vec31.y * d0, vec31.z * d0); | |
float f = 1.0F; | |
AABB aabb = p_328026_.getBoundingBox().expandTowards(vec31.scale(d0)).inflate(1.0, 1.0, 1.0); | |
EntityHitResult entityhitresult = ProjectileUtil.getEntityHitResult(p_328026_, vec3, vec32, aabb, EntitySelector.CAN_BE_PICKED, d1); | |
return entityhitresult != null && entityhitresult.getLocation().distanceToSqr(vec3) < d2 | |
? filterHitResult(entityhitresult, vec3, p_332188_) | |
: filterHitResult(hitresult, vec3, p_328198_); | |
} | |
private static HitResult filterHitResult(HitResult p_333216_, Vec3 p_336005_, double p_334240_) { | |
Vec3 vec3 = p_333216_.getLocation(); | |
if (!vec3.closerThan(p_336005_, p_334240_)) { | |
Vec3 vec31 = p_333216_.getLocation(); | |
Direction direction = Direction.getApproximateNearest( | |
vec31.x - p_336005_.x, vec31.y - p_336005_.y, vec31.z - p_336005_.z | |
); | |
return BlockHitResult.miss(vec31, direction, BlockPos.containing(vec31)); | |
} else { | |
return p_333216_; | |
} | |
} | |
private void tickFov() { | |
float f; | |
if (this.minecraft.getCameraEntity() instanceof AbstractClientPlayer abstractclientplayer) { | |
Options options = this.minecraft.options; | |
boolean flag = options.getCameraType().isFirstPerson(); | |
float f1 = options.fovEffectScale().get().floatValue(); | |
f = abstractclientplayer.getFieldOfViewModifier(flag, f1); | |
} else { | |
f = 1.0F; | |
} | |
this.oldFovModifier = this.fovModifier; | |
this.fovModifier = this.fovModifier + (f - this.fovModifier) * 0.5F; | |
this.fovModifier = Mth.clamp(this.fovModifier, 0.1F, 1.5F); | |
} | |
private float getFov(Camera p_109142_, float p_109143_, boolean p_109144_) { | |
if (this.panoramicMode) { | |
return 90.0F; | |
} else { | |
float f = 70.0F; | |
if (p_109144_) { | |
f = (float)this.minecraft.options.fov().get().intValue(); | |
f *= Mth.lerp(p_109143_, this.oldFovModifier, this.fovModifier); | |
} | |
if (p_109142_.getEntity() instanceof LivingEntity livingentity && livingentity.isDeadOrDying()) { | |
float f1 = Math.min((float)livingentity.deathTime + p_109143_, 20.0F); | |
f /= (1.0F - 500.0F / (f1 + 500.0F)) * 2.0F + 1.0F; | |
} | |
FogType fogtype = p_109142_.getFluidInCamera(); | |
if (fogtype == FogType.LAVA || fogtype == FogType.WATER) { | |
float f2 = this.minecraft.options.fovEffectScale().get().floatValue(); | |
f *= Mth.lerp(f2, 1.0F, 0.85714287F); | |
} | |
return f; | |
} | |
} | |
private void bobHurt(PoseStack p_109118_, float p_109119_) { | |
if (this.minecraft.getCameraEntity() instanceof LivingEntity livingentity) { | |
float f2 = (float)livingentity.hurtTime - p_109119_; | |
if (livingentity.isDeadOrDying()) { | |
float f = Math.min((float)livingentity.deathTime + p_109119_, 20.0F); | |
p_109118_.mulPose(Axis.ZP.rotationDegrees(40.0F - 8000.0F / (f + 200.0F))); | |
} | |
if (f2 < 0.0F) { | |
return; | |
} | |
f2 /= (float)livingentity.hurtDuration; | |
f2 = Mth.sin(f2 * f2 * f2 * f2 * (float) Math.PI); | |
float f3 = livingentity.getHurtDir(); | |
p_109118_.mulPose(Axis.YP.rotationDegrees(-f3)); | |
float f1 = (float)((double)(-f2) * 14.0 * this.minecraft.options.damageTiltStrength().get()); | |
p_109118_.mulPose(Axis.ZP.rotationDegrees(f1)); | |
p_109118_.mulPose(Axis.YP.rotationDegrees(f3)); | |
} | |
} | |
private void bobView(PoseStack p_109139_, float p_109140_) { | |
if (this.minecraft.getCameraEntity() instanceof AbstractClientPlayer abstractclientplayer) { | |
float f2 = abstractclientplayer.walkDist - abstractclientplayer.walkDistO; | |
float $$5 = -(abstractclientplayer.walkDist + f2 * p_109140_); | |
float $$6 = Mth.lerp(p_109140_, abstractclientplayer.oBob, abstractclientplayer.bob); | |
p_109139_.translate(Mth.sin($$5 * (float) Math.PI) * $$6 * 0.5F, -Math.abs(Mth.cos($$5 * (float) Math.PI) * $$6), 0.0F); | |
p_109139_.mulPose(Axis.ZP.rotationDegrees(Mth.sin($$5 * (float) Math.PI) * $$6 * 3.0F)); | |
p_109139_.mulPose(Axis.XP.rotationDegrees(Math.abs(Mth.cos($$5 * (float) Math.PI - 0.2F) * $$6) * 5.0F)); | |
} | |
} | |
public void renderZoomed(float p_172719_, float p_172720_, float p_172721_) { | |
this.zoom = p_172719_; | |
this.zoomX = p_172720_; | |
this.zoomY = p_172721_; | |
this.setRenderBlockOutline(false); | |
this.setRenderHand(false); | |
this.renderLevel(DeltaTracker.ZERO); | |
this.zoom = 1.0F; | |
} | |
private void renderItemInHand(Camera p_109122_, float p_109123_, Matrix4f p_331664_) { | |
if (!this.panoramicMode) { | |
Matrix4f matrix4f = this.getProjectionMatrix(this.getFov(p_109122_, p_109123_, false)); | |
RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.PERSPECTIVE); | |
PoseStack posestack = new PoseStack(); | |
posestack.pushPose(); | |
posestack.mulPose(p_331664_.invert(new Matrix4f())); | |
Matrix4fStack matrix4fstack = RenderSystem.getModelViewStack(); | |
matrix4fstack.pushMatrix().mul(p_331664_); | |
this.bobHurt(posestack, p_109123_); | |
if (this.minecraft.options.bobView().get()) { | |
this.bobView(posestack, p_109123_); | |
} | |
boolean flag = this.minecraft.getCameraEntity() instanceof LivingEntity && ((LivingEntity)this.minecraft.getCameraEntity()).isSleeping(); | |
if (this.minecraft.options.getCameraType().isFirstPerson() | |
&& !flag | |
&& !this.minecraft.options.hideGui | |
&& this.minecraft.gameMode.getPlayerMode() != GameType.SPECTATOR) { | |
this.lightTexture.turnOnLightLayer(); | |
this.itemInHandRenderer | |
.renderHandsWithItems( | |
p_109123_, | |
posestack, | |
this.renderBuffers.bufferSource(), | |
this.minecraft.player, | |
this.minecraft.getEntityRenderDispatcher().getPackedLightCoords(this.minecraft.player, p_109123_) | |
); | |
this.lightTexture.turnOffLightLayer(); | |
} | |
matrix4fstack.popMatrix(); | |
posestack.popPose(); | |
if (this.minecraft.options.getCameraType().isFirstPerson() && !flag) { | |
MultiBufferSource.BufferSource multibuffersource$buffersource = this.renderBuffers.bufferSource(); | |
ScreenEffectRenderer.renderScreenEffect(this.minecraft, posestack, multibuffersource$buffersource); | |
multibuffersource$buffersource.endBatch(); | |
} | |
} | |
} | |
public Matrix4f getProjectionMatrix(float p_364788_) { | |
Matrix4f matrix4f = new Matrix4f(); | |
if (this.zoom != 1.0F) { | |
matrix4f.translate(this.zoomX, -this.zoomY, 0.0F); | |
matrix4f.scale(this.zoom, this.zoom, 1.0F); | |
} | |
return matrix4f.perspective( | |
p_364788_ * (float) (Math.PI / 180.0), | |
(float)this.minecraft.getWindow().getWidth() / (float)this.minecraft.getWindow().getHeight(), | |
0.05F, | |
this.getDepthFar() | |
); | |
} | |
public float getDepthFar() { | |
return this.renderDistance * 4.0F; | |
} | |
public static float getNightVisionScale(LivingEntity p_109109_, float p_109110_) { | |
MobEffectInstance mobeffectinstance = p_109109_.getEffect(MobEffects.NIGHT_VISION); | |
return !mobeffectinstance.endsWithin(200) | |
? 1.0F | |
: 0.7F + Mth.sin(((float)mobeffectinstance.getDuration() - p_109110_) * (float) Math.PI * 0.2F) * 0.3F; | |
} | |
public void render(DeltaTracker p_343467_, boolean p_109096_) { | |
if (!this.minecraft.isWindowActive() | |
&& this.minecraft.options.pauseOnLostFocus | |
&& (!this.minecraft.options.touchscreen().get() || !this.minecraft.mouseHandler.isRightPressed())) { | |
if (Util.getMillis() - this.lastActiveTime > 500L) { | |
this.minecraft.pauseGame(false); | |
} | |
} else { | |
this.lastActiveTime = Util.getMillis(); | |
} | |
if (!this.minecraft.noRender) { | |
ProfilerFiller profilerfiller = Profiler.get(); | |
boolean flag = this.minecraft.isGameLoadFinished(); | |
int i = (int)(this.minecraft.mouseHandler.xpos() * (double)this.minecraft.getWindow().getGuiScaledWidth() / (double)this.minecraft.getWindow().getScreenWidth()); | |
int j = (int)(this.minecraft.mouseHandler.ypos() * (double)this.minecraft.getWindow().getGuiScaledHeight() / (double)this.minecraft.getWindow().getScreenHeight()); | |
RenderSystem.viewport(0, 0, this.minecraft.getWindow().getWidth(), this.minecraft.getWindow().getHeight()); | |
if (flag && p_109096_ && this.minecraft.level != null) { | |
profilerfiller.push("level"); | |
this.renderLevel(p_343467_); | |
this.tryTakeScreenshotIfNeeded(); | |
this.minecraft.levelRenderer.doEntityOutline(); | |
if (this.postEffectId != null && this.effectActive) { | |
RenderSystem.disableBlend(); | |
RenderSystem.disableDepthTest(); | |
RenderSystem.resetTextureMatrix(); | |
PostChain postchain = this.minecraft.getShaderManager().getPostChain(this.postEffectId, LevelTargetBundle.MAIN_TARGETS); | |
if (postchain != null) { | |
postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool); | |
} | |
} | |
this.minecraft.getMainRenderTarget().bindWrite(true); | |
} | |
Window window = this.minecraft.getWindow(); | |
RenderSystem.clear(256); | |
Matrix4f matrix4f = new Matrix4f() | |
.setOrtho( | |
0.0F, | |
(float)((double)window.getWidth() / window.getGuiScale()), | |
(float)((double)window.getHeight() / window.getGuiScale()), | |
0.0F, | |
1000.0F, | |
21000.0F | |
); | |
RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.ORTHOGRAPHIC); | |
Matrix4fStack matrix4fstack = RenderSystem.getModelViewStack(); | |
matrix4fstack.pushMatrix(); | |
matrix4fstack.translation(0.0F, 0.0F, -11000.0F); | |
Lighting.setupFor3DItems(); | |
GuiGraphics guigraphics = new GuiGraphics(this.minecraft, this.renderBuffers.bufferSource()); | |
if (flag && p_109096_ && this.minecraft.level != null) { | |
profilerfiller.popPush("gui"); | |
if (!this.minecraft.options.hideGui) { | |
this.renderItemActivationAnimation(guigraphics, p_343467_.getGameTimeDeltaPartialTick(false)); | |
} | |
this.minecraft.gui.render(guigraphics, p_343467_); | |
guigraphics.flush(); | |
RenderSystem.clear(256); | |
profilerfiller.pop(); | |
} | |
if (this.minecraft.getOverlay() != null) { | |
try { | |
this.minecraft.getOverlay().render(guigraphics, i, j, p_343467_.getGameTimeDeltaTicks()); | |
} catch (Throwable throwable2) { | |
CrashReport crashreport = CrashReport.forThrowable(throwable2, "Rendering overlay"); | |
CrashReportCategory crashreportcategory = crashreport.addCategory("Overlay render details"); | |
crashreportcategory.setDetail("Overlay name", () -> this.minecraft.getOverlay().getClass().getCanonicalName()); | |
throw new ReportedException(crashreport); | |
} | |
} else if (flag && this.minecraft.screen != null) { | |
try { | |
this.minecraft.screen.renderWithTooltip(guigraphics, i, j, p_343467_.getGameTimeDeltaTicks()); | |
} catch (Throwable throwable1) { | |
CrashReport crashreport1 = CrashReport.forThrowable(throwable1, "Rendering screen"); | |
CrashReportCategory crashreportcategory1 = crashreport1.addCategory("Screen render details"); | |
crashreportcategory1.setDetail("Screen name", () -> this.minecraft.screen.getClass().getCanonicalName()); | |
crashreportcategory1.setDetail( | |
"Mouse location", | |
() -> String.format( | |
Locale.ROOT, | |
"Scaled: (%d, %d). Absolute: (%f, %f)", | |
i, | |
j, | |
this.minecraft.mouseHandler.xpos(), | |
this.minecraft.mouseHandler.ypos() | |
) | |
); | |
crashreportcategory1.setDetail( | |
"Screen size", | |
() -> String.format( | |
Locale.ROOT, | |
"Scaled: (%d, %d). Absolute: (%d, %d). Scale factor of %f", | |
this.minecraft.getWindow().getGuiScaledWidth(), | |
this.minecraft.getWindow().getGuiScaledHeight(), | |
this.minecraft.getWindow().getWidth(), | |
this.minecraft.getWindow().getHeight(), | |
this.minecraft.getWindow().getGuiScale() | |
) | |
); | |
throw new ReportedException(crashreport1); | |
} | |
try { | |
if (this.minecraft.screen != null) { | |
this.minecraft.screen.handleDelayedNarration(); | |
} | |
} catch (Throwable throwable) { | |
CrashReport crashreport2 = CrashReport.forThrowable(throwable, "Narrating screen"); | |
CrashReportCategory crashreportcategory2 = crashreport2.addCategory("Screen details"); | |
crashreportcategory2.setDetail("Screen name", () -> this.minecraft.screen.getClass().getCanonicalName()); | |
throw new ReportedException(crashreport2); | |
} | |
} | |
if (flag && p_109096_ && this.minecraft.level != null) { | |
this.minecraft.gui.renderSavingIndicator(guigraphics, p_343467_); | |
} | |
if (flag) { | |
try (Zone zone = profilerfiller.zone("toasts")) { | |
this.minecraft.getToastManager().render(guigraphics); | |
} | |
} | |
guigraphics.flush(); | |
matrix4fstack.popMatrix(); | |
this.resourcePool.endFrame(); | |
} | |
} | |
private void tryTakeScreenshotIfNeeded() { | |
if (!this.hasWorldScreenshot && this.minecraft.isLocalServer()) { | |
long i = Util.getMillis(); | |
if (i - this.lastScreenshotAttempt >= 1000L) { | |
this.lastScreenshotAttempt = i; | |
IntegratedServer integratedserver = this.minecraft.getSingleplayerServer(); | |
if (integratedserver != null && !integratedserver.isStopped()) { | |
integratedserver.getWorldScreenshotFile().ifPresent(p_234239_ -> { | |
if (Files.isRegularFile(p_234239_)) { | |
this.hasWorldScreenshot = true; | |
} else { | |
this.takeAutoScreenshot(p_234239_); | |
} | |
}); | |
} | |
} | |
} | |
} | |
private void takeAutoScreenshot(Path p_182643_) { | |
if (this.minecraft.levelRenderer.countRenderedSections() > 10 && this.minecraft.levelRenderer.hasRenderedAllSections()) { | |
NativeImage nativeimage = Screenshot.takeScreenshot(this.minecraft.getMainRenderTarget()); | |
Util.ioPool().execute(() -> { | |
int i = nativeimage.getWidth(); | |
int j = nativeimage.getHeight(); | |
int k = 0; | |
int l = 0; | |
if (i > j) { | |
k = (i - j) / 2; | |
i = j; | |
} else { | |
l = (j - i) / 2; | |
j = i; | |
} | |
try (NativeImage nativeimage1 = new NativeImage(64, 64, false)) { | |
nativeimage.resizeSubRectTo(k, l, i, j, nativeimage1); | |
nativeimage1.writeToFile(p_182643_); | |
} catch (IOException ioexception) { | |
LOGGER.warn("Couldn't save auto screenshot", (Throwable)ioexception); | |
} finally { | |
nativeimage.close(); | |
} | |
}); | |
} | |
} | |
private boolean shouldRenderBlockOutline() { | |
if (!this.renderBlockOutline) { | |
return false; | |
} else { | |
Entity entity = this.minecraft.getCameraEntity(); | |
boolean flag = entity instanceof Player && !this.minecraft.options.hideGui; | |
if (flag && !((Player)entity).getAbilities().mayBuild) { | |
ItemStack itemstack = ((LivingEntity)entity).getMainHandItem(); | |
HitResult hitresult = this.minecraft.hitResult; | |
if (hitresult != null && hitresult.getType() == HitResult.Type.BLOCK) { | |
BlockPos blockpos = ((BlockHitResult)hitresult).getBlockPos(); | |
BlockState blockstate = this.minecraft.level.getBlockState(blockpos); | |
if (this.minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR) { | |
flag = blockstate.getMenuProvider(this.minecraft.level, blockpos) != null; | |
} else { | |
BlockInWorld blockinworld = new BlockInWorld(this.minecraft.level, blockpos, false); | |
Registry<Block> registry = this.minecraft.level.registryAccess().lookupOrThrow(Registries.BLOCK); | |
flag = !itemstack.isEmpty() && (itemstack.canBreakBlockInAdventureMode(blockinworld) || itemstack.canPlaceOnBlockInAdventureMode(blockinworld)); | |
} | |
} | |
} | |
return flag; | |
} | |
} | |
public void renderLevel(DeltaTracker p_342230_) { | |
float f = p_342230_.getGameTimeDeltaPartialTick(true); | |
this.lightTexture.updateLightTexture(f); | |
if (this.minecraft.getCameraEntity() == null) { | |
this.minecraft.setCameraEntity(this.minecraft.player); | |
} | |
this.pick(f); | |
ProfilerFiller profilerfiller = Profiler.get(); | |
profilerfiller.push("center"); | |
boolean flag = this.shouldRenderBlockOutline(); | |
profilerfiller.popPush("camera"); | |
Camera camera = this.mainCamera; | |
Entity entity = (Entity)(this.minecraft.getCameraEntity() == null ? this.minecraft.player : this.minecraft.getCameraEntity()); | |
float f1 = this.minecraft.level.tickRateManager().isEntityFrozen(entity) ? 1.0F : f; | |
camera.setup(this.minecraft.level, entity, !this.minecraft.options.getCameraType().isFirstPerson(), this.minecraft.options.getCameraType().isMirrored(), f1); | |
this.renderDistance = (float)(this.minecraft.options.getEffectiveRenderDistance() * 16); | |
float f2 = this.getFov(camera, f, true); | |
Matrix4f matrix4f = this.getProjectionMatrix(f2); | |
PoseStack posestack = new PoseStack(); | |
this.bobHurt(posestack, camera.getPartialTickTime()); | |
if (this.minecraft.options.bobView().get()) { | |
this.bobView(posestack, camera.getPartialTickTime()); | |
} | |
matrix4f.mul(posestack.last().pose()); | |
float f3 = this.minecraft.options.screenEffectScale().get().floatValue(); | |
float f4 = Mth.lerp(f, this.minecraft.player.oSpinningEffectIntensity, this.minecraft.player.spinningEffectIntensity) * f3 * f3; | |
if (f4 > 0.0F) { | |
int i = this.minecraft.player.hasEffect(MobEffects.CONFUSION) ? 7 : 20; | |
float f5 = 5.0F / (f4 * f4 + 5.0F) - f4 * 0.04F; | |
f5 *= f5; | |
Vector3f vector3f = new Vector3f(0.0F, Mth.SQRT_OF_TWO / 2.0F, Mth.SQRT_OF_TWO / 2.0F); | |
float f6 = ((float)this.confusionAnimationTick + f) * (float)i * (float) (Math.PI / 180.0); | |
matrix4f.rotate(f6, vector3f); | |
matrix4f.scale(1.0F / f5, 1.0F, 1.0F); | |
matrix4f.rotate(-f6, vector3f); | |
} | |
float f7 = Math.max(f2, (float)this.minecraft.options.fov().get().intValue()); | |
Matrix4f matrix4f1 = this.getProjectionMatrix(f7); | |
RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.PERSPECTIVE); | |
Quaternionf quaternionf = camera.rotation().conjugate(new Quaternionf()); | |
Matrix4f matrix4f2 = new Matrix4f().rotation(quaternionf); | |
this.minecraft.levelRenderer.prepareCullFrustum(camera.getPosition(), matrix4f2, matrix4f1); | |
this.minecraft.getMainRenderTarget().bindWrite(true); | |
this.minecraft.levelRenderer.renderLevel(this.resourcePool, p_342230_, flag, camera, this, matrix4f2, matrix4f); | |
profilerfiller.popPush("hand"); | |
if (this.renderHand) { | |
RenderSystem.clear(256); | |
this.renderItemInHand(camera, f, matrix4f2); | |
} | |
profilerfiller.pop(); | |
} | |
public void resetData() { | |
this.itemActivationItem = null; | |
this.minecraft.getMapTextureManager().resetData(); | |
this.mainCamera.reset(); | |
this.hasWorldScreenshot = false; | |
} | |
public void displayItemActivation(ItemStack p_109114_) { | |
this.itemActivationItem = p_109114_; | |
this.itemActivationTicks = 40; | |
this.itemActivationOffX = this.random.nextFloat() * 2.0F - 1.0F; | |
this.itemActivationOffY = this.random.nextFloat() * 2.0F - 1.0F; | |
} | |
private void renderItemActivationAnimation(GuiGraphics p_342383_, float p_109103_) { | |
if (this.itemActivationItem != null && this.itemActivationTicks > 0) { | |
int i = 40 - this.itemActivationTicks; | |
float f = ((float)i + p_109103_) / 40.0F; | |
float f1 = f * f; | |
float f2 = f * f1; | |
float f3 = 10.25F * f2 * f1 - 24.95F * f1 * f1 + 25.5F * f2 - 13.8F * f1 + 4.0F * f; | |
float f4 = f3 * (float) Math.PI; | |
float f5 = this.itemActivationOffX * (float)(p_342383_.guiWidth() / 4); | |
float f6 = this.itemActivationOffY * (float)(p_342383_.guiHeight() / 4); | |
PoseStack posestack = p_342383_.pose(); | |
posestack.pushPose(); | |
posestack.translate( | |
(float)(p_342383_.guiWidth() / 2) + f5 * Mth.abs(Mth.sin(f4 * 2.0F)), | |
(float)(p_342383_.guiHeight() / 2) + f6 * Mth.abs(Mth.sin(f4 * 2.0F)), | |
-50.0F | |
); | |
float f7 = 50.0F + 175.0F * Mth.sin(f4); | |
posestack.scale(f7, -f7, f7); | |
posestack.mulPose(Axis.YP.rotationDegrees(900.0F * Mth.abs(Mth.sin(f4)))); | |
posestack.mulPose(Axis.XP.rotationDegrees(6.0F * Mth.cos(f * 8.0F))); | |
posestack.mulPose(Axis.ZP.rotationDegrees(6.0F * Mth.cos(f * 8.0F))); | |
p_342383_.drawSpecial( | |
p_357824_ -> this.minecraft | |
.getItemRenderer() | |
.renderStatic( | |
this.itemActivationItem, ItemDisplayContext.FIXED, 15728880, OverlayTexture.NO_OVERLAY, posestack, p_357824_, this.minecraft.level, 0 | |
) | |
); | |
posestack.popPose(); | |
} | |
} | |
public Minecraft getMinecraft() { | |
return this.minecraft; | |
} | |
public float getDarkenWorldAmount(float p_109132_) { | |
return Mth.lerp(p_109132_, this.darkenWorldAmountO, this.darkenWorldAmount); | |
} | |
public float getRenderDistance() { | |
return this.renderDistance; | |
} | |
public Camera getMainCamera() { | |
return this.mainCamera; | |
} | |
public LightTexture lightTexture() { | |
return this.lightTexture; | |
} | |
public OverlayTexture overlayTexture() { | |
return this.overlayTexture; | |
} | |
} |