GameRenderer.java

net.minecraft.client.renderer.GameRenderer

信息

  • 全限定名:net.minecraft.client.renderer.GameRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer
  • 源码路径:src/main/java/net/minecraft/client/renderer/GameRenderer.java
  • 起始行号:L105
  • 实现:AutoCloseable, TrackedWaypoint.Projector
  • 职责:

    TODO

字段/常量

  • BLUR_POST_CHAIN_ID

    • 类型: Identifier
    • 修饰符: private static final
    • 源码定位: L106
    • 说明:

      TODO

  • MAX_BLUR_RADIUS

    • 类型: int
    • 修饰符: public static final
    • 源码定位: L107
    • 说明:

      TODO

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L108
    • 说明:

      TODO

  • PROJECTION_3D_HUD_Z_FAR

    • 类型: float
    • 修饰符: public static final
    • 源码定位: L109
    • 说明:

      TODO

  • PORTAL_SPINNING_SPEED

    • 类型: float
    • 修饰符: private static final
    • 源码定位: L110
    • 说明:

      TODO

  • NAUSEA_SPINNING_SPEED

    • 类型: float
    • 修饰符: private static final
    • 源码定位: L111
    • 说明:

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L112
    • 说明:

      TODO

  • gameRenderState

    • 类型: GameRenderState
    • 修饰符: private final
    • 源码定位: L113
    • 说明:

      TODO

  • random

    • 类型: RandomSource
    • 修饰符: private final
    • 源码定位: L114
    • 说明:

      TODO

  • itemInHandRenderer

    • 类型: ItemInHandRenderer
    • 修饰符: public final
    • 源码定位: L115
    • 说明:

      TODO

  • screenEffectRenderer

    • 类型: ScreenEffectRenderer
    • 修饰符: private final
    • 源码定位: L116
    • 说明:

      TODO

  • renderBuffers

    • 类型: RenderBuffers
    • 修饰符: private final
    • 源码定位: L117
    • 说明:

      TODO

  • spinningEffectTime

    • 类型: float
    • 修饰符: private
    • 源码定位: L118
    • 说明:

      TODO

  • spinningEffectSpeed

    • 类型: float
    • 修饰符: private
    • 源码定位: L119
    • 说明:

      TODO

  • bossOverlayWorldDarkening

    • 类型: float
    • 修饰符: private
    • 源码定位: L120
    • 说明:

      TODO

  • bossOverlayWorldDarkeningO

    • 类型: float
    • 修饰符: private
    • 源码定位: L121
    • 说明:

      TODO

  • renderBlockOutline

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L122
    • 说明:

      TODO

  • lastScreenshotAttempt

    • 类型: long
    • 修饰符: private
    • 源码定位: L123
    • 说明:

      TODO

  • hasWorldScreenshot

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L124
    • 说明:

      TODO

  • lightmap

    • 类型: Lightmap
    • 修饰符: private final
    • 源码定位: L125
    • 说明:

      TODO

  • lightmapRenderStateExtractor

    • 类型: LightmapRenderStateExtractor
    • 修饰符: private final
    • 源码定位: L126
    • 说明:

      TODO

  • uiLightmap

    • 类型: UiLightmap
    • 修饰符: private final
    • 源码定位: L127
    • 说明:

      TODO

  • useUiLightmap

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L128
    • 说明:

      TODO

  • overlayTexture

    • 类型: OverlayTexture
    • 修饰符: private final
    • 源码定位: L129
    • 说明:

      TODO

  • panorama

    • 类型: Panorama
    • 修饰符: protected final
    • 源码定位: L130
    • 说明:

      TODO

  • resourcePool

    • 类型: CrossFrameResourcePool
    • 修饰符: private final
    • 源码定位: L131
    • 说明:

      TODO

  • fogRenderer

    • 类型: FogRenderer
    • 修饰符: private final
    • 源码定位: L132
    • 说明:

      TODO

  • guiRenderer

    • 类型: GuiRenderer
    • 修饰符: private final
    • 源码定位: L133
    • 说明:

      TODO

  • submitNodeStorage

    • 类型: SubmitNodeStorage
    • 修饰符: private final
    • 源码定位: L134
    • 说明:

      TODO

  • featureRenderDispatcher

    • 类型: FeatureRenderDispatcher
    • 修饰符: private final
    • 源码定位: L135
    • 说明:

      TODO

  • postEffectId

    • 类型: Identifier
    • 修饰符: private
    • 源码定位: L136
    • 说明:

      TODO

  • effectActive

    • 类型: boolean
    • 修饰符: private
    • 源码定位: L137
    • 说明:

      TODO

  • mainCamera

    • 类型: Camera
    • 修饰符: private final
    • 源码定位: L138
    • 说明:

      TODO

  • hudProjection

    • 类型: Projection
    • 修饰符: private final
    • 源码定位: L139
    • 说明:

      TODO

  • lighting

    • 类型: Lighting
    • 修饰符: private final
    • 源码定位: L140
    • 说明:

      TODO

  • globalSettingsUniform

    • 类型: GlobalSettingsUniform
    • 修饰符: private final
    • 源码定位: L141
    • 说明:

      TODO

  • levelProjectionMatrixBuffer

    • 类型: ProjectionMatrixBuffer
    • 修饰符: private final
    • 源码定位: L142
    • 说明:

      TODO

  • hud3dProjectionMatrixBuffer

    • 类型: ProjectionMatrixBuffer
    • 修饰符: private final
    • 源码定位: L143
    • 说明:

      TODO

内部类/嵌套类型

构造器

public GameRenderer(Minecraft minecraft, ItemInHandRenderer itemInHandRenderer, RenderBuffers renderBuffers, ModelManager modelManager) @ L145

  • 构造器名:GameRenderer
  • 源码定位:L145
  • 修饰符:public

参数:

  • minecraft: Minecraft
  • itemInHandRenderer: ItemInHandRenderer
  • renderBuffers: RenderBuffers
  • modelManager: ModelManager

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void close() @ L180

  • 方法名:close
  • 源码定位:L180
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public SubmitNodeStorage getSubmitNodeStorage() @ L195

  • 方法名:getSubmitNodeStorage
  • 源码定位:L195
  • 返回类型:SubmitNodeStorage
  • 修饰符:public

参数:

说明:

TODO

public FeatureRenderDispatcher getFeatureRenderDispatcher() @ L199

  • 方法名:getFeatureRenderDispatcher
  • 源码定位:L199
  • 返回类型:FeatureRenderDispatcher
  • 修饰符:public

参数:

说明:

TODO

public GameRenderState getGameRenderState() @ L203

  • 方法名:getGameRenderState
  • 源码定位:L203
  • 返回类型:GameRenderState
  • 修饰符:public

参数:

说明:

TODO

public void setRenderBlockOutline(boolean renderBlockOutline) @ L207

  • 方法名:setRenderBlockOutline
  • 源码定位:L207
  • 返回类型:void
  • 修饰符:public

参数:

  • renderBlockOutline: boolean

说明:

TODO

public void clearPostEffect() @ L211

  • 方法名:clearPostEffect
  • 源码定位:L211
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void togglePostEffect() @ L216

  • 方法名:togglePostEffect
  • 源码定位:L216
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void checkEntityPostEffect(Entity cameraEntity) @ L220

  • 方法名:checkEntityPostEffect
  • 源码定位:L220
  • 返回类型:void
  • 修饰符:public

参数:

  • cameraEntity: Entity

说明:

TODO

private void setPostEffect(Identifier id) @ L237

  • 方法名:setPostEffect
  • 源码定位:L237
  • 返回类型:void
  • 修饰符:private

参数:

  • id: Identifier

说明:

TODO

public void processBlurEffect() @ L242

  • 方法名:processBlurEffect
  • 源码定位:L242
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void preloadUiShader(ResourceProvider resourceProvider) @ L249

  • 方法名:preloadUiShader
  • 源码定位:L249
  • 返回类型:void
  • 修饰符:public

参数:

  • resourceProvider: ResourceProvider

说明:

TODO

public void tick() @ L273

  • 方法名:tick
  • 源码定位:L273
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public Identifier currentPostEffect() @ L310

  • 方法名:currentPostEffect
  • 源码定位:L310
  • 返回类型:Identifier
  • 修饰符:public

参数:

说明:

TODO

public void resize(int width, int height) @ L314

  • 方法名:resize
  • 源码定位:L314
  • 返回类型:void
  • 修饰符:public

参数:

  • width: int
  • height: int

说明:

TODO

private void bobHurt(CameraRenderState cameraState, PoseStack poseStack) @ L321

  • 方法名:bobHurt
  • 源码定位:L321
  • 返回类型:void
  • 修饰符:private

参数:

  • cameraState: CameraRenderState
  • poseStack: PoseStack

说明:

TODO

private void bobView(CameraRenderState cameraState, PoseStack poseStack) @ L343

  • 方法名:bobView
  • 源码定位:L343
  • 返回类型:void
  • 修饰符:private

参数:

  • cameraState: CameraRenderState
  • poseStack: PoseStack

说明:

TODO

private void renderItemInHand(CameraRenderState cameraState, float deltaPartialTick, Matrix4fc modelViewMatrix) @ L357

  • 方法名:renderItemInHand
  • 源码定位:L357
  • 返回类型:void
  • 修饰符:private

参数:

  • cameraState: CameraRenderState
  • deltaPartialTick: float
  • modelViewMatrix: Matrix4fc

说明:

TODO

public static float getNightVisionScale(LivingEntity camera, float a) @ L390

  • 方法名:getNightVisionScale
  • 源码定位:L390
  • 返回类型:float
  • 修饰符:public static

参数:

  • camera: LivingEntity
  • a: float

说明:

TODO

public void update(DeltaTracker deltaTracker, boolean advanceGameTime) @ L395

  • 方法名:update
  • 源码定位:L395
  • 返回类型:void
  • 修饰符:public

参数:

  • deltaTracker: DeltaTracker
  • advanceGameTime: boolean

说明:

TODO

public void extract(DeltaTracker deltaTracker, boolean advanceGameTime) @ L407

  • 方法名:extract
  • 源码定位:L407
  • 返回类型:void
  • 修饰符:public

参数:

  • deltaTracker: DeltaTracker
  • advanceGameTime: boolean

说明:

TODO

public void render(DeltaTracker deltaTracker, boolean advanceGameTime) @ L423

  • 方法名:render
  • 源码定位:L423
  • 返回类型:void
  • 修饰符:public

参数:

  • deltaTracker: DeltaTracker
  • advanceGameTime: boolean

说明:

TODO

private void extractGui(DeltaTracker deltaTracker, boolean shouldRenderLevel, boolean resourcesLoaded) @ L480

  • 方法名:extractGui
  • 源码定位:L480
  • 返回类型:void
  • 修饰符:private

参数:

  • deltaTracker: DeltaTracker
  • shouldRenderLevel: boolean
  • resourcesLoaded: boolean

说明:

TODO

private void renderActiveTextDebug() @ L560

  • 方法名:renderActiveTextDebug
  • 源码定位:L560
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

private void tryTakeScreenshotIfNeeded() @ L610

  • 方法名:tryTakeScreenshotIfNeeded
  • 源码定位:L610
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

private void takeAutoScreenshot(Path screenshotFile) @ L629

  • 方法名:takeAutoScreenshot
  • 源码定位:L629
  • 返回类型:void
  • 修饰符:private

参数:

  • screenshotFile: Path

说明:

TODO

private boolean shouldRenderBlockOutline() @ L656

  • 方法名:shouldRenderBlockOutline
  • 源码定位:L656
  • 返回类型:boolean
  • 修饰符:private

参数:

说明:

TODO

public void renderLevel(DeltaTracker deltaTracker) @ L683

  • 方法名:renderLevel
  • 源码定位:L683
  • 返回类型:void
  • 修饰符:public

参数:

  • deltaTracker: DeltaTracker

说明:

TODO

private void extractWindow() @ L756

  • 方法名:extractWindow
  • 源码定位:L756
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

private void extractOptions() @ L767

  • 方法名:extractOptions
  • 源码定位:L767
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

private void extractCamera(DeltaTracker deltaTracker, float worldPartialTicks, float cameraEntityPartialTicks) @ L791

  • 方法名:extractCamera
  • 源码定位:L791
  • 返回类型:void
  • 修饰符:private

参数:

  • deltaTracker: DeltaTracker
  • worldPartialTicks: float
  • cameraEntityPartialTicks: float

说明:

TODO

public void resetData() @ L805

  • 方法名:resetData
  • 源码定位:L805
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void displayItemActivation(ItemStack itemStack) @ L812

  • 方法名:displayItemActivation
  • 源码定位:L812
  • 返回类型:void
  • 修饰符:public

参数:

  • itemStack: ItemStack

说明:

TODO

public Minecraft getMinecraft() @ L816

  • 方法名:getMinecraft
  • 源码定位:L816
  • 返回类型:Minecraft
  • 修饰符:public

参数:

说明:

TODO

public float getBossOverlayWorldDarkening(float a) @ L820

  • 方法名:getBossOverlayWorldDarkening
  • 源码定位:L820
  • 返回类型:float
  • 修饰符:public

参数:

  • a: float

说明:

TODO

public Camera getMainCamera() @ L824

  • 方法名:getMainCamera
  • 源码定位:L824
  • 返回类型:Camera
  • 修饰符:public

参数:

说明:

TODO

public GpuTextureView lightmap() @ L828

  • 方法名:lightmap
  • 源码定位:L828
  • 返回类型:GpuTextureView
  • 修饰符:public

参数:

说明:

TODO

public GpuTextureView levelLightmap() @ L832

  • 方法名:levelLightmap
  • 源码定位:L832
  • 返回类型:GpuTextureView
  • 修饰符:public

参数:

说明:

TODO

public OverlayTexture overlayTexture() @ L836

  • 方法名:overlayTexture
  • 源码定位:L836
  • 返回类型:OverlayTexture
  • 修饰符:public

参数:

说明:

TODO

public Vec3 projectPointToScreen(Vec3 point) @ L840

  • 方法名:projectPointToScreen
  • 源码定位:L840
  • 返回类型:Vec3
  • 修饰符:public

参数:

  • point: Vec3

说明:

TODO

public double projectHorizonToScreen() @ L849

  • 方法名:projectHorizonToScreen
  • 源码定位:L849
  • 返回类型:double
  • 修饰符:public

参数:

说明:

TODO

public GlobalSettingsUniform getGlobalSettingsUniform() @ L862

  • 方法名:getGlobalSettingsUniform
  • 源码定位:L862
  • 返回类型:GlobalSettingsUniform
  • 修饰符:public

参数:

说明:

TODO

public Lighting getLighting() @ L866

  • 方法名:getLighting
  • 源码定位:L866
  • 返回类型:Lighting
  • 修饰符:public

参数:

说明:

TODO

public void setLevel(ClientLevel level) @ L870

  • 方法名:setLevel
  • 源码定位:L870
  • 返回类型:void
  • 修饰符:public

参数:

  • level: ClientLevel

说明:

TODO

public Panorama getPanorama() @ L878

  • 方法名:getPanorama
  • 源码定位:L878
  • 返回类型:Panorama
  • 修饰符:public

参数:

说明:

TODO

public void registerPanoramaTextures(TextureManager textureManager) @ L882

  • 方法名:registerPanoramaTextures
  • 源码定位:L882
  • 返回类型:void
  • 修饰符:public

参数:

  • textureManager: TextureManager

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class GameRenderer implements AutoCloseable, TrackedWaypoint.Projector {
    private static final Identifier BLUR_POST_CHAIN_ID = Identifier.withDefaultNamespace("blur");
    public static final int MAX_BLUR_RADIUS = 10;
    private static final Logger LOGGER = LogUtils.getLogger();
    public static final float PROJECTION_3D_HUD_Z_FAR = 100.0F;
    private static final float PORTAL_SPINNING_SPEED = 20.0F;
    private static final float NAUSEA_SPINNING_SPEED = 7.0F;
    private final Minecraft minecraft;
    private final GameRenderState gameRenderState = new GameRenderState();
    private final RandomSource random = RandomSource.create();
    public final ItemInHandRenderer itemInHandRenderer;
    private final ScreenEffectRenderer screenEffectRenderer;
    private final RenderBuffers renderBuffers;
    private float spinningEffectTime;
    private float spinningEffectSpeed;
    private float bossOverlayWorldDarkening;
    private float bossOverlayWorldDarkeningO;
    private boolean renderBlockOutline = true;
    private long lastScreenshotAttempt;
    private boolean hasWorldScreenshot;
    private final Lightmap lightmap = new Lightmap();
    private final LightmapRenderStateExtractor lightmapRenderStateExtractor;
    private final UiLightmap uiLightmap = new UiLightmap();
    private boolean useUiLightmap;
    private final OverlayTexture overlayTexture = new OverlayTexture();
    protected final Panorama panorama = new Panorama();
    private final CrossFrameResourcePool resourcePool = new CrossFrameResourcePool(3);
    private final FogRenderer fogRenderer = new FogRenderer();
    private final GuiRenderer guiRenderer;
    private final SubmitNodeStorage submitNodeStorage;
    private final FeatureRenderDispatcher featureRenderDispatcher;
    private @Nullable Identifier postEffectId;
    private boolean effectActive;
    private final Camera mainCamera = new Camera();
    private final Projection hudProjection = new Projection();
    private final Lighting lighting = new Lighting();
    private final GlobalSettingsUniform globalSettingsUniform = new GlobalSettingsUniform();
    private final ProjectionMatrixBuffer levelProjectionMatrixBuffer = new ProjectionMatrixBuffer("level");
    private final ProjectionMatrixBuffer hud3dProjectionMatrixBuffer = new ProjectionMatrixBuffer("3d hud");
 
    public GameRenderer(Minecraft minecraft, ItemInHandRenderer itemInHandRenderer, RenderBuffers renderBuffers, ModelManager modelManager) {
        this.minecraft = minecraft;
        this.itemInHandRenderer = itemInHandRenderer;
        this.lightmapRenderStateExtractor = new LightmapRenderStateExtractor(this, minecraft);
        this.renderBuffers = renderBuffers;
        MultiBufferSource.BufferSource bufferSource = renderBuffers.bufferSource();
        AtlasManager atlasManager = minecraft.getAtlasManager();
        this.submitNodeStorage = new SubmitNodeStorage();
        this.featureRenderDispatcher = new FeatureRenderDispatcher(
            this.submitNodeStorage,
            modelManager,
            bufferSource,
            atlasManager,
            renderBuffers.outlineBufferSource(),
            renderBuffers.crumblingBufferSource(),
            minecraft.font,
            this.gameRenderState
        );
        this.guiRenderer = new GuiRenderer(
            this.gameRenderState.guiRenderState,
            bufferSource,
            this.submitNodeStorage,
            this.featureRenderDispatcher,
            List.of(
                new GuiEntityRenderer(bufferSource, minecraft.getEntityRenderDispatcher()),
                new GuiSkinRenderer(bufferSource),
                new GuiBookModelRenderer(bufferSource),
                new GuiBannerResultRenderer(bufferSource, atlasManager),
                new GuiSignRenderer(bufferSource, atlasManager),
                new GuiProfilerChartRenderer(bufferSource)
            )
        );
        this.screenEffectRenderer = new ScreenEffectRenderer(minecraft, atlasManager, bufferSource);
    }
 
    @Override
    public void close() {
        this.globalSettingsUniform.close();
        this.lightmap.close();
        this.overlayTexture.close();
        this.uiLightmap.close();
        this.resourcePool.close();
        this.guiRenderer.close();
        this.levelProjectionMatrixBuffer.close();
        this.hud3dProjectionMatrixBuffer.close();
        this.lighting.close();
        this.fogRenderer.close();
        this.featureRenderDispatcher.close();
    }
 
    public SubmitNodeStorage getSubmitNodeStorage() {
        return this.submitNodeStorage;
    }
 
    public FeatureRenderDispatcher getFeatureRenderDispatcher() {
        return this.featureRenderDispatcher;
    }
 
    public GameRenderState getGameRenderState() {
        return this.gameRenderState;
    }
 
    public void setRenderBlockOutline(boolean renderBlockOutline) {
        this.renderBlockOutline = renderBlockOutline;
    }
 
    public void clearPostEffect() {
        this.postEffectId = null;
        this.effectActive = false;
    }
 
    public void togglePostEffect() {
        this.effectActive = !this.effectActive;
    }
 
    public void checkEntityPostEffect(@Nullable Entity cameraEntity) {
        switch (cameraEntity) {
            case Creeper ignored:
                this.setPostEffect(Identifier.withDefaultNamespace("creeper"));
                break;
            case Spider ignoredx:
                this.setPostEffect(Identifier.withDefaultNamespace("spider"));
                break;
            case EnderMan ignoredxx:
                this.setPostEffect(Identifier.withDefaultNamespace("invert"));
                break;
            case null:
            default:
                this.clearPostEffect();
        }
    }
 
    private void setPostEffect(Identifier id) {
        this.postEffectId = id;
        this.effectActive = true;
    }
 
    public void processBlurEffect() {
        PostChain postChain = this.minecraft.getShaderManager().getPostChain(BLUR_POST_CHAIN_ID, LevelTargetBundle.MAIN_TARGETS);
        if (postChain != null) {
            postChain.process(this.minecraft.getMainRenderTarget(), this.resourcePool);
        }
    }
 
    public void preloadUiShader(ResourceProvider resourceProvider) {
        GpuDevice device = RenderSystem.getDevice();
        ShaderSource shaderSource = (id, type) -> {
            Identifier location = type.idConverter().idToFile(id);
 
            try {
                String t$;
                try (Reader reader = resourceProvider.getResourceOrThrow(location).openAsReader()) {
                    t$ = IOUtils.toString(reader);
                }
 
                return t$;
            } catch (IOException var9) {
                LOGGER.error("Coudln't preload {} shader {}: {}", type, id, var9);
                return null;
            }
        };
        device.precompilePipeline(RenderPipelines.GUI, shaderSource);
        device.precompilePipeline(RenderPipelines.GUI_TEXTURED, shaderSource);
        if (TracyClient.isAvailable()) {
            device.precompilePipeline(RenderPipelines.TRACY_BLIT, shaderSource);
        }
    }
 
    public void tick() {
        this.lightmapRenderStateExtractor.tick();
        LocalPlayer player = this.minecraft.player;
        if (this.mainCamera.entity() == null) {
            this.mainCamera.setEntity(player);
        }
 
        this.mainCamera.tick();
        this.itemInHandRenderer.tick();
        float portalIntensity = player.portalEffectIntensity;
        float nauseaIntensity = player.getEffectBlendFactor(MobEffects.NAUSEA, 1.0F);
        if (!(portalIntensity > 0.0F) && !(nauseaIntensity > 0.0F)) {
            this.spinningEffectSpeed = 0.0F;
        } else {
            this.spinningEffectSpeed = (portalIntensity * 20.0F + nauseaIntensity * 7.0F) / (portalIntensity + nauseaIntensity);
            this.spinningEffectTime = this.spinningEffectTime + this.spinningEffectSpeed;
        }
 
        if (this.minecraft.level.tickRateManager().runsNormally()) {
            this.bossOverlayWorldDarkeningO = this.bossOverlayWorldDarkening;
            if (this.minecraft.gui.getBossOverlay().shouldDarkenScreen()) {
                this.bossOverlayWorldDarkening += 0.05F;
                if (this.bossOverlayWorldDarkening > 1.0F) {
                    this.bossOverlayWorldDarkening = 1.0F;
                }
            } else if (this.bossOverlayWorldDarkening > 0.0F) {
                this.bossOverlayWorldDarkening -= 0.0125F;
            }
 
            this.screenEffectRenderer.tick();
            ProfilerFiller profiler = Profiler.get();
            profiler.push("levelRenderer");
            this.minecraft.levelRenderer.tick(this.mainCamera);
            profiler.pop();
        }
    }
 
    public @Nullable Identifier currentPostEffect() {
        return this.postEffectId;
    }
 
    public void resize(int width, int height) {
        this.resourcePool.clear();
        RenderTarget mainRenderTarget = this.minecraft.getMainRenderTarget();
        mainRenderTarget.resize(width, height);
        this.minecraft.levelRenderer.resize(width, height);
    }
 
    private void bobHurt(CameraRenderState cameraState, PoseStack poseStack) {
        if (cameraState.entityRenderState.isLiving) {
            float hurt = cameraState.entityRenderState.hurtTime;
            if (cameraState.entityRenderState.isDeadOrDying) {
                float duration = Math.min(cameraState.entityRenderState.deathTime, 20.0F);
                poseStack.mulPose(Axis.ZP.rotationDegrees(40.0F - 8000.0F / (duration + 200.0F)));
            }
 
            if (hurt < 0.0F) {
                return;
            }
 
            hurt /= cameraState.entityRenderState.hurtDuration;
            hurt = Mth.sin(hurt * hurt * hurt * hurt * (float) Math.PI);
            float rr = cameraState.entityRenderState.hurtDir;
            poseStack.mulPose(Axis.YP.rotationDegrees(-rr));
            float tiltAmount = (float)(-hurt * 14.0 * this.gameRenderState.optionsRenderState.damageTiltStrength);
            poseStack.mulPose(Axis.ZP.rotationDegrees(tiltAmount));
            poseStack.mulPose(Axis.YP.rotationDegrees(rr));
        }
    }
 
    private void bobView(CameraRenderState cameraState, PoseStack poseStack) {
        if (cameraState.entityRenderState.isPlayer) {
            float backwardsInterpolatedWalkDistance = cameraState.entityRenderState.backwardsInterpolatedWalkDistance;
            float bob = cameraState.entityRenderState.bob;
            poseStack.translate(
                Mth.sin(backwardsInterpolatedWalkDistance * (float) Math.PI) * bob * 0.5F,
                -Math.abs(Mth.cos(backwardsInterpolatedWalkDistance * (float) Math.PI) * bob),
                0.0F
            );
            poseStack.mulPose(Axis.ZP.rotationDegrees(Mth.sin(backwardsInterpolatedWalkDistance * (float) Math.PI) * bob * 3.0F));
            poseStack.mulPose(Axis.XP.rotationDegrees(Math.abs(Mth.cos(backwardsInterpolatedWalkDistance * (float) Math.PI - 0.2F) * bob) * 5.0F));
        }
    }
 
    private void renderItemInHand(CameraRenderState cameraState, float deltaPartialTick, Matrix4fc modelViewMatrix) {
        if (!cameraState.isPanoramicMode) {
            this.featureRenderDispatcher.renderAllFeatures();
            this.renderBuffers.bufferSource().endBatch();
            PoseStack poseStack = new PoseStack();
            poseStack.pushPose();
            poseStack.mulPose(modelViewMatrix.invert(new Matrix4f()));
            Matrix4fStack modelViewStack = RenderSystem.getModelViewStack();
            modelViewStack.pushMatrix().mul(modelViewMatrix);
            this.bobHurt(cameraState, poseStack);
            if (this.gameRenderState.optionsRenderState.bobView) {
                this.bobView(cameraState, poseStack);
            }
 
            if (this.gameRenderState.optionsRenderState.cameraType.isFirstPerson()
                && !cameraState.entityRenderState.isSleeping
                && !this.gameRenderState.optionsRenderState.hideGui
                && this.minecraft.gameMode.getPlayerMode() != GameType.SPECTATOR) {
                this.itemInHandRenderer
                    .renderHandsWithItems(
                        deltaPartialTick,
                        poseStack,
                        this.minecraft.gameRenderer.getSubmitNodeStorage(),
                        this.minecraft.player,
                        this.minecraft.getEntityRenderDispatcher().getPackedLightCoords(this.minecraft.player, deltaPartialTick)
                    );
            }
 
            modelViewStack.popMatrix();
            poseStack.popPose();
        }
    }
 
    public static float getNightVisionScale(LivingEntity camera, float a) {
        MobEffectInstance nightVision = camera.getEffect(MobEffects.NIGHT_VISION);
        return !nightVision.endsWithin(200) ? 1.0F : 0.7F + Mth.sin((nightVision.getDuration() - a) * (float) Math.PI * 0.2F) * 0.3F;
    }
 
    public void update(DeltaTracker deltaTracker, boolean advanceGameTime) {
        ProfilerFiller profiler = Profiler.get();
        profiler.push("camera");
        this.mainCamera.update(deltaTracker);
        profiler.pop();
        boolean resourcesLoaded = this.minecraft.isGameLoadFinished();
        boolean shouldRenderLevel = resourcesLoaded && advanceGameTime && this.minecraft.level != null;
        if (shouldRenderLevel) {
            this.minecraft.levelRenderer.update(this.mainCamera);
        }
    }
 
    public void extract(DeltaTracker deltaTracker, boolean advanceGameTime) {
        boolean resourcesLoaded = this.minecraft.isGameLoadFinished();
        boolean shouldRenderLevel = resourcesLoaded && advanceGameTime && this.minecraft.level != null;
        float worldPartialTicks = deltaTracker.getGameTimeDeltaPartialTick(false);
        this.extractWindow();
        this.extractOptions();
        if (shouldRenderLevel) {
            this.lightmapRenderStateExtractor.extract(this.gameRenderState.lightmapRenderState, 1.0F);
            float cameraEntityPartialTicks = this.mainCamera.getCameraEntityPartialTicks(deltaTracker);
            this.extractCamera(deltaTracker, worldPartialTicks, cameraEntityPartialTicks);
            this.minecraft.levelRenderer.extractLevel(deltaTracker, this.mainCamera, worldPartialTicks);
        }
 
        this.extractGui(deltaTracker, shouldRenderLevel, resourcesLoaded);
    }
 
    public void render(DeltaTracker deltaTracker, boolean advanceGameTime) {
        ProfilerFiller profiler = Profiler.get();
        profiler.push("render");
        if (this.gameRenderState.windowRenderState.isResized) {
            this.resize(this.gameRenderState.windowRenderState.width, this.gameRenderState.windowRenderState.height);
        }
 
        RenderTarget mainRenderTarget = this.minecraft.getMainRenderTarget();
        RenderSystem.getDevice()
            .createCommandEncoder()
            .clearColorAndDepthTextures(
                mainRenderTarget.getColorTexture(), this.gameRenderState.guiRenderState.clearColorOverride, mainRenderTarget.getDepthTexture(), 1.0
            );
        boolean resourcesLoaded = this.minecraft.isGameLoadFinished();
        boolean shouldRenderLevel = resourcesLoaded && advanceGameTime && this.minecraft.level != null;
        this.globalSettingsUniform
            .update(
                this.gameRenderState.windowRenderState.width,
                this.gameRenderState.windowRenderState.height,
                this.gameRenderState.optionsRenderState.glintStrength,
                this.minecraft.level == null ? 0L : this.minecraft.level.getGameTime(),
                deltaTracker,
                this.gameRenderState.optionsRenderState.menuBackgroundBlurriness,
                this.gameRenderState.levelRenderState.cameraRenderState.pos,
                this.gameRenderState.optionsRenderState.textureFiltering == TextureFilteringMethod.RGSS
            );
        if (shouldRenderLevel) {
            this.lightmap.render(this.gameRenderState.lightmapRenderState);
            profiler.push("world");
            this.renderLevel(deltaTracker);
            this.tryTakeScreenshotIfNeeded();
            this.minecraft.levelRenderer.doEntityOutline();
            if (this.postEffectId != null && this.effectActive) {
                PostChain postChain = this.minecraft.getShaderManager().getPostChain(this.postEffectId, LevelTargetBundle.MAIN_TARGETS);
                if (postChain != null) {
                    postChain.process(this.minecraft.getMainRenderTarget(), this.resourcePool);
                }
            }
 
            profiler.pop();
        }
 
        this.fogRenderer.endFrame();
        RenderSystem.getDevice().createCommandEncoder().clearDepthTexture(mainRenderTarget.getDepthTexture(), 1.0);
        this.getLighting().setupFor(Lighting.Entry.ITEMS_3D);
        this.useUiLightmap = true;
        profiler.push("gui");
        this.guiRenderer.render(this.fogRenderer.getBuffer(FogRenderer.FogMode.NONE));
        this.guiRenderer.endFrame();
        profiler.pop();
        this.useUiLightmap = false;
        this.submitNodeStorage.endFrame();
        this.featureRenderDispatcher.endFrame();
        this.resourcePool.endFrame();
        profiler.pop();
    }
 
    private void extractGui(DeltaTracker deltaTracker, boolean shouldRenderLevel, boolean resourcesLoaded) {
        ProfilerFiller profiler = Profiler.get();
        int xMouse = (int)this.minecraft.mouseHandler.getScaledXPos(this.minecraft.getWindow());
        int yMouse = (int)this.minecraft.mouseHandler.getScaledYPos(this.minecraft.getWindow());
        profiler.push("gui");
        this.gameRenderState.guiRenderState.reset();
        GuiGraphicsExtractor graphics = new GuiGraphicsExtractor(this.minecraft, this.gameRenderState.guiRenderState, xMouse, yMouse);
        if (shouldRenderLevel) {
            profiler.push("inGameGui");
            this.minecraft.gui.extractRenderState(graphics, deltaTracker);
            profiler.pop();
        }
 
        if (this.minecraft.getOverlay() != null) {
            profiler.push("overlay");
 
            try {
                this.minecraft.getOverlay().extractRenderState(graphics, xMouse, yMouse, deltaTracker.getGameTimeDeltaTicks());
            } catch (Throwable var13) {
                CrashReport report = CrashReport.forThrowable(var13, "Extracting overlay render state");
                CrashReportCategory category = report.addCategory("Overlay details");
                category.setDetail("Overlay name", () -> this.minecraft.getOverlay().getClass().getCanonicalName());
                throw new ReportedException(report);
            }
 
            profiler.pop();
        } else if (resourcesLoaded && this.minecraft.screen != null) {
            profiler.push("screen");
 
            try {
                this.minecraft.screen.extractRenderStateWithTooltipAndSubtitles(graphics, xMouse, yMouse, deltaTracker.getGameTimeDeltaTicks());
            } catch (Throwable var12) {
                CrashReport report = CrashReport.forThrowable(var12, "Rendering screen");
                CrashReportCategory category = report.addCategory("Screen render details");
                category.setDetail("Screen name", () -> this.minecraft.screen.getClass().getCanonicalName());
                this.minecraft.mouseHandler.fillMousePositionDetails(category, this.minecraft.getWindow());
                throw new ReportedException(report);
            }
 
            if (SharedConstants.DEBUG_CURSOR_POS) {
                this.minecraft.mouseHandler.drawDebugMouseInfo(this.minecraft.font, graphics);
            }
 
            try {
                if (this.minecraft.screen != null) {
                    this.minecraft.screen.handleDelayedNarration();
                }
            } catch (Throwable var15) {
                CrashReport report = CrashReport.forThrowable(var15, "Narrating screen");
                CrashReportCategory category = report.addCategory("Screen details");
                category.setDetail("Screen name", () -> this.minecraft.screen.getClass().getCanonicalName());
                throw new ReportedException(report);
            }
 
            profiler.pop();
        }
 
        if (shouldRenderLevel) {
            this.minecraft.gui.extractSavingIndicator(graphics, deltaTracker);
        }
 
        if (resourcesLoaded) {
            try (Zone ignored = profiler.zone("toasts")) {
                this.minecraft.getToastManager().extractRenderState(graphics);
            }
        }
 
        if (!(this.minecraft.screen instanceof DebugOptionsScreen)) {
            this.minecraft.gui.extractDebugOverlay(graphics);
        }
 
        this.minecraft.gui.extractDeferredSubtitles();
        if (SharedConstants.DEBUG_ACTIVE_TEXT_AREAS) {
            this.renderActiveTextDebug();
        }
 
        profiler.pop();
        graphics.applyCursor(this.minecraft.getWindow());
    }
 
    private void renderActiveTextDebug() {
        GuiRenderState guiRenderState = this.gameRenderState.guiRenderState;
        guiRenderState.nextStratum();
        guiRenderState.forEachText(
            text -> text.ensurePrepared()
                .visit(
                    new Font.GlyphVisitor() {
                        private int index;
 
                        {
                            Objects.requireNonNull(GameRenderer.this);
                        }
 
                        @Override
                        public void acceptGlyph(TextRenderable.Styled glyph) {
                            this.renderDebugMarkers(glyph, false);
                        }
 
                        @Override
                        public void acceptEmptyArea(EmptyArea empty) {
                            this.renderDebugMarkers(empty, true);
                        }
 
                        private void renderDebugMarkers(ActiveArea glyph, boolean isEmpty) {
                            int intensity = (isEmpty ? 128 : 255) - (this.index++ & 1) * 64;
                            Style style = glyph.style();
                            int red = style.getClickEvent() != null ? intensity : 0;
                            int green = style.getHoverEvent() != null ? intensity : 0;
                            int blue = red != 0 && green != 0 ? 0 : intensity;
                            int color = ARGB.color(128, red, green, blue);
                            guiRenderState.addGuiElement(
                                new ColoredRectangleRenderState(
                                    RenderPipelines.GUI,
                                    TextureSetup.noTexture(),
                                    text.pose,
                                    (int)glyph.activeLeft(),
                                    (int)glyph.activeTop(),
                                    (int)glyph.activeRight(),
                                    (int)glyph.activeBottom(),
                                    color,
                                    color,
                                    text.scissor
                                )
                            );
                        }
                    }
                )
        );
    }
 
    private void tryTakeScreenshotIfNeeded() {
        if (!this.hasWorldScreenshot && this.minecraft.isLocalServer()) {
            long time = Util.getMillis();
            if (time - this.lastScreenshotAttempt >= 1000L) {
                this.lastScreenshotAttempt = time;
                IntegratedServer server = this.minecraft.getSingleplayerServer();
                if (server != null && !server.isStopped()) {
                    server.getWorldScreenshotFile().ifPresent(path -> {
                        if (Files.isRegularFile(path)) {
                            this.hasWorldScreenshot = true;
                        } else {
                            this.takeAutoScreenshot(path);
                        }
                    });
                }
            }
        }
    }
 
    private void takeAutoScreenshot(Path screenshotFile) {
        if (this.minecraft.levelRenderer.countRenderedSections() > 10 && this.minecraft.levelRenderer.hasRenderedAllSections()) {
            Screenshot.takeScreenshot(this.minecraft.getMainRenderTarget(), screenshot -> Util.ioPool().execute(() -> {
                int width = screenshot.getWidth();
                int height = screenshot.getHeight();
                int x = 0;
                int y = 0;
                if (width > height) {
                    x = (width - height) / 2;
                    width = height;
                } else {
                    y = (height - width) / 2;
                    height = width;
                }
 
                try (NativeImage scaled = new NativeImage(64, 64, false)) {
                    screenshot.resizeSubRectTo(x, y, width, height, scaled);
                    scaled.writeToFile(screenshotFile);
                } catch (IOException var16) {
                    LOGGER.warn("Couldn't save auto screenshot", (Throwable)var16);
                } finally {
                    screenshot.close();
                }
            }));
        }
    }
 
    private boolean shouldRenderBlockOutline() {
        if (!this.renderBlockOutline) {
            return false;
        } else {
            Entity cameraEntity = this.minecraft.getCameraEntity();
            boolean renderOutline = cameraEntity instanceof Player && !this.minecraft.options.hideGui;
            if (renderOutline && !((Player)cameraEntity).getAbilities().mayBuild) {
                ItemStack itemStack = ((LivingEntity)cameraEntity).getMainHandItem();
                HitResult hitResult = this.minecraft.hitResult;
                if (hitResult != null && hitResult.getType() == HitResult.Type.BLOCK) {
                    BlockPos pos = ((BlockHitResult)hitResult).getBlockPos();
                    BlockState blockState = this.minecraft.level.getBlockState(pos);
                    if (this.minecraft.gameMode.getPlayerMode() == GameType.SPECTATOR) {
                        renderOutline = blockState.getMenuProvider(this.minecraft.level, pos) != null;
                    } else {
                        BlockInWorld blockInWorld = new BlockInWorld(this.minecraft.level, pos, false);
                        Registry<Block> blockRegistry = this.minecraft.level.registryAccess().lookupOrThrow(Registries.BLOCK);
                        renderOutline = !itemStack.isEmpty()
                            && (itemStack.canBreakBlockInAdventureMode(blockInWorld) || itemStack.canPlaceOnBlockInAdventureMode(blockInWorld));
                    }
                }
            }
 
            return renderOutline;
        }
    }
 
    public void renderLevel(DeltaTracker deltaTracker) {
        float worldPartialTicks = deltaTracker.getGameTimeDeltaPartialTick(false);
        float cameraEntityPartialTicks = this.mainCamera.getCameraEntityPartialTicks(deltaTracker);
        LocalPlayer player = this.minecraft.player;
        ProfilerFiller profiler = Profiler.get();
        boolean renderOutline = this.shouldRenderBlockOutline();
        OptionsRenderState optionsState = this.gameRenderState.optionsRenderState;
        CameraRenderState cameraState = this.gameRenderState.levelRenderState.cameraRenderState;
        Matrix4fc modelViewMatrix = cameraState.viewRotationMatrix;
        profiler.push("matrices");
        Matrix4f projectionMatrix = new Matrix4f(cameraState.projectionMatrix);
        PoseStack bobStack = new PoseStack();
        this.bobHurt(cameraState, bobStack);
        if (optionsState.bobView) {
            this.bobView(cameraState, bobStack);
        }
 
        projectionMatrix.mul(bobStack.last().pose());
        float screenEffectScale = optionsState.screenEffectScale;
        float portalIntensity = Mth.lerp(worldPartialTicks, player.oPortalEffectIntensity, player.portalEffectIntensity);
        float nauseaIntensity = player.getEffectBlendFactor(MobEffects.NAUSEA, worldPartialTicks);
        float spinningEffectIntensity = Math.max(portalIntensity, nauseaIntensity) * (screenEffectScale * screenEffectScale);
        if (spinningEffectIntensity > 0.0F) {
            float skew = 5.0F / (spinningEffectIntensity * spinningEffectIntensity + 5.0F) - spinningEffectIntensity * 0.04F;
            skew *= skew;
            Vector3f axis = new Vector3f(0.0F, Mth.SQRT_OF_TWO / 2.0F, Mth.SQRT_OF_TWO / 2.0F);
            float angle = (this.spinningEffectTime + worldPartialTicks * this.spinningEffectSpeed) * (float) (Math.PI / 180.0);
            projectionMatrix.rotate(angle, axis);
            projectionMatrix.scale(1.0F / skew, 1.0F, 1.0F);
            projectionMatrix.rotate(-angle, axis);
        }
 
        RenderSystem.setProjectionMatrix(this.levelProjectionMatrixBuffer.getBuffer(projectionMatrix), ProjectionType.PERSPECTIVE);
        profiler.popPush("fog");
        this.fogRenderer.updateBuffer(cameraState.fogData);
        GpuBufferSlice terrainFog = this.fogRenderer.getBuffer(FogRenderer.FogMode.WORLD);
        profiler.popPush("level");
        boolean shouldCreateBossFog = this.minecraft.gui.getBossOverlay().shouldCreateWorldFog();
        this.minecraft
            .levelRenderer
            .renderLevel(
                this.resourcePool,
                deltaTracker,
                renderOutline,
                cameraState,
                modelViewMatrix,
                terrainFog,
                cameraState.fogData.color,
                !shouldCreateBossFog,
                this.gameRenderState.levelRenderState.chunkSectionsToRender
            );
        profiler.popPush("hand");
        boolean isSleeping = cameraState.entityRenderState.isSleeping;
        this.hudProjection
            .setupPerspective(0.05F, 100.0F, cameraState.hudFov, this.gameRenderState.windowRenderState.width, this.gameRenderState.windowRenderState.height);
        RenderSystem.setProjectionMatrix(this.hud3dProjectionMatrixBuffer.getBuffer(this.hudProjection), ProjectionType.PERSPECTIVE);
        RenderSystem.getDevice().createCommandEncoder().clearDepthTexture(this.minecraft.getMainRenderTarget().getDepthTexture(), 1.0);
        this.renderItemInHand(cameraState, cameraEntityPartialTicks, modelViewMatrix);
        profiler.popPush("screenEffects");
        MultiBufferSource.BufferSource bufferSource = this.renderBuffers.bufferSource();
        this.screenEffectRenderer
            .renderScreenEffect(optionsState.cameraType.isFirstPerson(), isSleeping, worldPartialTicks, this.submitNodeStorage, optionsState.hideGui);
        this.featureRenderDispatcher.renderAllFeatures();
        bufferSource.endBatch();
        profiler.pop();
        RenderSystem.setShaderFog(this.fogRenderer.getBuffer(FogRenderer.FogMode.NONE));
        if (this.minecraft.debugEntries.isCurrentlyEnabled(DebugScreenEntries.THREE_DIMENSIONAL_CROSSHAIR)
            && optionsState.cameraType.isFirstPerson()
            && !optionsState.hideGui) {
            this.minecraft.getDebugOverlay().render3dCrosshair(cameraState, this.gameRenderState.windowRenderState.guiScale);
        }
    }
 
    private void extractWindow() {
        WindowRenderState windowState = this.gameRenderState.windowRenderState;
        Window window = this.minecraft.getWindow();
        windowState.width = window.getWidth();
        windowState.height = window.getHeight();
        windowState.guiScale = window.getGuiScale();
        windowState.appropriateLineWidth = window.getAppropriateLineWidth();
        windowState.isMinimized = window.isMinimized();
        windowState.isResized = window.isResized();
    }
 
    private void extractOptions() {
        OptionsRenderState optionsState = this.gameRenderState.optionsRenderState;
        Options options = this.minecraft.options;
        optionsState.cloudRange = options.cloudRange().get();
        optionsState.cutoutLeaves = options.cutoutLeaves().get();
        optionsState.improvedTransparency = options.improvedTransparency().get();
        optionsState.ambientOcclusion = options.ambientOcclusion().get();
        optionsState.menuBackgroundBlurriness = options.getMenuBackgroundBlurriness();
        optionsState.panoramaSpeed = options.panoramaSpeed().get();
        optionsState.maxAnisotropyValue = options.maxAnisotropyValue();
        optionsState.textureFiltering = options.textureFiltering().get();
        optionsState.bobView = options.bobView().get();
        optionsState.hideGui = options.hideGui;
        optionsState.screenEffectScale = options.screenEffectScale().get().floatValue();
        optionsState.glintSpeed = options.glintSpeed().get();
        optionsState.glintStrength = options.glintStrength().get();
        optionsState.damageTiltStrength = options.damageTiltStrength().get();
        optionsState.backgroundForChatOnly = options.backgroundForChatOnly().get();
        optionsState.textBackgroundOpacity = options.textBackgroundOpacity().get().floatValue();
        optionsState.cloudStatus = options.getCloudStatus();
        optionsState.cameraType = options.getCameraType();
        optionsState.renderDistance = options.getEffectiveRenderDistance();
    }
 
    private void extractCamera(DeltaTracker deltaTracker, float worldPartialTicks, float cameraEntityPartialTicks) {
        CameraRenderState cameraState = this.gameRenderState.levelRenderState.cameraRenderState;
        this.mainCamera.extractRenderState(cameraState, cameraEntityPartialTicks);
        cameraState.fogType = this.mainCamera.getFluidInCamera();
        cameraState.fogData = this.fogRenderer
            .setupFog(
                this.mainCamera,
                this.minecraft.options.getEffectiveRenderDistance(),
                deltaTracker,
                this.getBossOverlayWorldDarkening(worldPartialTicks),
                this.minecraft.level
            );
    }
 
    public void resetData() {
        this.screenEffectRenderer.resetItemActivation();
        this.minecraft.getMapTextureManager().resetData();
        this.mainCamera.reset();
        this.hasWorldScreenshot = false;
    }
 
    public void displayItemActivation(ItemStack itemStack) {
        this.screenEffectRenderer.displayItemActivation(itemStack, this.random);
    }
 
    public Minecraft getMinecraft() {
        return this.minecraft;
    }
 
    public float getBossOverlayWorldDarkening(float a) {
        return Mth.lerp(a, this.bossOverlayWorldDarkeningO, this.bossOverlayWorldDarkening);
    }
 
    public Camera getMainCamera() {
        return this.mainCamera;
    }
 
    public GpuTextureView lightmap() {
        return this.useUiLightmap ? this.uiLightmap.getTextureView() : this.lightmap.getTextureView();
    }
 
    public GpuTextureView levelLightmap() {
        return this.lightmap.getTextureView();
    }
 
    public OverlayTexture overlayTexture() {
        return this.overlayTexture;
    }
 
    @Override
    public Vec3 projectPointToScreen(Vec3 point) {
        Matrix4f mvp = this.mainCamera.getViewRotationProjectionMatrix(new Matrix4f());
        Vec3 camPos = this.mainCamera.position();
        Vec3 offset = point.subtract(camPos);
        Vector3f vector3f = mvp.transformProject(offset.toVector3f());
        return new Vec3(vector3f);
    }
 
    @Override
    public double projectHorizonToScreen() {
        float xRot = this.mainCamera.xRot();
        if (xRot <= -90.0F) {
            return Double.NEGATIVE_INFINITY;
        } else if (xRot >= 90.0F) {
            return Double.POSITIVE_INFINITY;
        } else {
            float fov = this.mainCamera.getFov();
            return Math.tan(xRot * (float) (Math.PI / 180.0)) / Math.tan(fov / 2.0F * (float) (Math.PI / 180.0));
        }
    }
 
    public GlobalSettingsUniform getGlobalSettingsUniform() {
        return this.globalSettingsUniform;
    }
 
    public Lighting getLighting() {
        return this.lighting;
    }
 
    public void setLevel(@Nullable ClientLevel level) {
        if (level != null) {
            this.lighting.updateLevel(level.dimensionType().cardinalLightType());
        }
 
        this.mainCamera.setLevel(level);
    }
 
    public Panorama getPanorama() {
        return this.panorama;
    }
 
    public void registerPanoramaTextures(TextureManager textureManager) {
        this.guiRenderer.registerPanoramaTextures(textureManager);
    }
}

引用的其他类

  • Lighting

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: Lighting()
  • NativeImage

    • 引用位置: 构造调用
    • 关联成员: NativeImage()
  • CrossFrameResourcePool

    • 引用位置: 字段/构造调用
    • 关联成员: CrossFrameResourcePool()
  • RenderSystem

    • 引用位置: 方法调用
    • 关联成员: RenderSystem.getDevice(), RenderSystem.getModelViewStack(), RenderSystem.setProjectionMatrix(), RenderSystem.setShaderFog()
  • GpuTextureView

    • 引用位置: 返回值
  • PoseStack

    • 引用位置: 参数/构造调用
    • 关联成员: PoseStack()
  • CrashReport

    • 引用位置: 方法调用
    • 关联成员: CrashReport.forThrowable()
  • ReportedException

    • 引用位置: 构造调用
    • 关联成员: ReportedException()
  • Camera

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: Camera()
  • DeltaTracker

    • 引用位置: 参数
  • Minecraft

    • 引用位置: 参数/字段/返回值
  • Screenshot

    • 引用位置: 方法调用
    • 关联成员: Screenshot.takeScreenshot()
  • Font

    • 引用位置: 方法调用/构造调用
    • 关联成员: Font.GlyphVisitor(), GlyphVisitor()
  • GuiGraphicsExtractor

    • 引用位置: 构造调用
    • 关联成员: GuiGraphicsExtractor()
  • GuiRenderer

    • 引用位置: 字段/构造调用
    • 关联成员: GuiRenderer()
  • TextureSetup

    • 引用位置: 方法调用
    • 关联成员: TextureSetup.noTexture()
  • GuiBannerResultRenderer

    • 引用位置: 构造调用
    • 关联成员: GuiBannerResultRenderer()
  • GuiBookModelRenderer

    • 引用位置: 构造调用
    • 关联成员: GuiBookModelRenderer()
  • GuiEntityRenderer

    • 引用位置: 构造调用
    • 关联成员: GuiEntityRenderer()
  • GuiProfilerChartRenderer

    • 引用位置: 构造调用
    • 关联成员: GuiProfilerChartRenderer()
  • GuiSignRenderer

    • 引用位置: 构造调用
    • 关联成员: GuiSignRenderer()
  • GuiSkinRenderer

    • 引用位置: 构造调用
    • 关联成员: GuiSkinRenderer()
  • ClientLevel

    • 引用位置: 参数
  • GlobalSettingsUniform

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: GlobalSettingsUniform()
  • ItemInHandRenderer

    • 引用位置: 参数/字段
  • Lightmap

    • 引用位置: 字段/构造调用
    • 关联成员: Lightmap()
  • LightmapRenderStateExtractor

    • 引用位置: 字段/构造调用
    • 关联成员: LightmapRenderStateExtractor()
  • Panorama

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: Panorama()
  • Projection

    • 引用位置: 字段/构造调用
    • 关联成员: Projection()
  • ProjectionMatrixBuffer

    • 引用位置: 字段/构造调用
    • 关联成员: ProjectionMatrixBuffer()
  • RenderBuffers

    • 引用位置: 参数/字段
  • ScreenEffectRenderer

    • 引用位置: 字段/构造调用
    • 关联成员: ScreenEffectRenderer()
  • SubmitNodeStorage

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: SubmitNodeStorage()
  • UiLightmap

    • 引用位置: 字段/构造调用
    • 关联成员: UiLightmap()
  • FeatureRenderDispatcher

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: FeatureRenderDispatcher()
  • FogRenderer

    • 引用位置: 字段/构造调用
    • 关联成员: FogRenderer()
  • GameRenderState

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: GameRenderState()
  • ColoredRectangleRenderState

    • 引用位置: 构造调用
    • 关联成员: ColoredRectangleRenderState()
  • CameraRenderState

    • 引用位置: 参数
  • OverlayTexture

    • 引用位置: 字段/构造调用/返回值
    • 关联成员: OverlayTexture()
  • TextureManager

    • 引用位置: 参数
  • ModelManager

    • 引用位置: 参数
  • Identifier

    • 引用位置: 参数/字段/方法调用/返回值
    • 关联成员: Identifier.withDefaultNamespace()
  • ResourceProvider

    • 引用位置: 参数
  • ARGB

    • 引用位置: 方法调用
    • 关联成员: ARGB.color()
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.cos(), Mth.lerp(), Mth.sin()
  • RandomSource

    • 引用位置: 字段/方法调用
    • 关联成员: RandomSource.create()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.getMillis(), Util.ioPool()
  • Profiler

    • 引用位置: 方法调用
    • 关联成员: Profiler.get()
  • Entity

    • 引用位置: 参数
  • LivingEntity

    • 引用位置: 参数
  • ItemStack

    • 引用位置: 参数
  • BlockInWorld

    • 引用位置: 构造调用
    • 关联成员: BlockInWorld()
  • Vec3

    • 引用位置: 参数/构造调用/返回值
    • 关联成员: Vec3()
  • TrackedWaypoint

    • 引用位置: 实现