VideoSettingsScreen.java

net.minecraft.client.gui.screens.options.VideoSettingsScreen

信息

  • 全限定名:net.minecraft.client.gui.screens.options.VideoSettingsScreen
  • 类型:public class
  • 包:net.minecraft.client.gui.screens.options
  • 源码路径:src/main/java/net/minecraft/client/gui/screens/options/VideoSettingsScreen.java
  • 起始行号:L27
  • 继承:OptionsSubScreen
  • 职责:

    TODO

字段/常量

  • TITLE

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

      TODO

  • IMPROVED_TRANSPARENCY

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

      TODO

  • WARNING_MESSAGE

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

      TODO

  • WARNING_TITLE

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

      TODO

  • BUTTON_ACCEPT

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

      TODO

  • BUTTON_CANCEL

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

      TODO

  • DISPLAY_HEADER

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

      TODO

  • QUALITY_HEADER

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

      TODO

  • PREFERENCES_HEADER

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

      TODO

  • gpuWarnlistManager

    • 类型: GpuWarnlistManager
    • 修饰符: private final
    • 源码定位: L37
    • 说明:

      TODO

  • oldMipmaps

    • 类型: int
    • 修饰符: private final
    • 源码定位: L38
    • 说明:

      TODO

  • oldAnisotropyBit

    • 类型: int
    • 修饰符: private final
    • 源码定位: L39
    • 说明:

      TODO

  • oldTextureFiltering

    • 类型: TextureFilteringMethod
    • 修饰符: private final
    • 源码定位: L40
    • 说明:

      TODO

内部类/嵌套类型

构造器

public VideoSettingsScreen(Screen lastScreen, Minecraft minecraft, Options options) @ L80

  • 构造器名:VideoSettingsScreen
  • 源码定位:L80
  • 修饰符:public

参数:

  • lastScreen: Screen
  • minecraft: Minecraft
  • options: Options

说明:

TODO

方法

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

private static OptionInstance<?>[] qualityOptions(Options options) @ L42

  • 方法名:qualityOptions
  • 源码定位:L42
  • 返回类型:OptionInstance<?>[]
  • 修饰符:private static

参数:

  • options: Options

说明:

TODO

private static OptionInstance<?>[] displayOptions(Options options) @ L64

  • 方法名:displayOptions
  • 源码定位:L64
  • 返回类型:OptionInstance<?>[]
  • 修饰符:private static

参数:

  • options: Options

说明:

TODO

private static OptionInstance<?>[] preferenceOptions(Options options) @ L76

  • 方法名:preferenceOptions
  • 源码定位:L76
  • 返回类型:OptionInstance<?>[]
  • 修饰符:private static

参数:

  • options: Options

说明:

TODO

protected void addOptions() @ L93

  • 方法名:addOptions
  • 源码定位:L93
  • 返回类型:void
  • 修饰符:protected

参数:

说明:

TODO

public void tick() @ L146

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

参数:

说明:

TODO

public void onClose() @ L155

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

参数:

说明:

TODO

public void removed() @ L161

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

参数:

说明:

TODO

public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) @ L173

  • 方法名:mouseClicked
  • 源码定位:L173
  • 返回类型:boolean
  • 修饰符:public

参数:

  • event: MouseButtonEvent
  • doubleClick: boolean

说明:

TODO

public boolean mouseScrolled(double x, double y, double scrollX, double scrollY) @ L220

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

参数:

  • x: double
  • y: double
  • scrollX: double
  • scrollY: double

说明:

TODO

public void updateFullscreenButton(boolean fullscreen) @ L245

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

参数:

  • fullscreen: boolean

说明:

TODO

public void updateTransparencyButton() @ L255

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

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class VideoSettingsScreen extends OptionsSubScreen {
    private static final Component TITLE = Component.translatable("options.videoTitle");
    private static final Component IMPROVED_TRANSPARENCY = Component.translatable("options.improvedTransparency").withStyle(ChatFormatting.ITALIC);
    private static final Component WARNING_MESSAGE = Component.translatable("options.graphics.warning.message", IMPROVED_TRANSPARENCY, IMPROVED_TRANSPARENCY);
    private static final Component WARNING_TITLE = Component.translatable("options.graphics.warning.title").withStyle(ChatFormatting.RED);
    private static final Component BUTTON_ACCEPT = Component.translatable("options.graphics.warning.accept");
    private static final Component BUTTON_CANCEL = Component.translatable("options.graphics.warning.cancel");
    private static final Component DISPLAY_HEADER = Component.translatable("options.video.display.header");
    private static final Component QUALITY_HEADER = Component.translatable("options.video.quality.header");
    private static final Component PREFERENCES_HEADER = Component.translatable("options.video.preferences.header");
    private final GpuWarnlistManager gpuWarnlistManager;
    private final int oldMipmaps;
    private final int oldAnisotropyBit;
    private final TextureFilteringMethod oldTextureFiltering;
 
    private static OptionInstance<?>[] qualityOptions(Options options) {
        return new OptionInstance[]{
            options.biomeBlendRadius(),
            options.renderDistance(),
            options.prioritizeChunkUpdates(),
            options.simulationDistance(),
            options.ambientOcclusion(),
            options.cloudStatus(),
            options.particles(),
            options.mipmapLevels(),
            options.entityShadows(),
            options.entityDistanceScaling(),
            options.menuBackgroundBlurriness(),
            options.cloudRange(),
            options.cutoutLeaves(),
            options.improvedTransparency(),
            options.textureFiltering(),
            options.maxAnisotropyBit(),
            options.weatherRadius()
        };
    }
 
    private static OptionInstance<?>[] displayOptions(Options options) {
        return new OptionInstance[]{
            options.framerateLimit(),
            options.enableVsync(),
            options.inactivityFpsLimit(),
            options.guiScale(),
            options.fullscreen(),
            options.exclusiveFullscreen(),
            options.gamma()
        };
    }
 
    private static OptionInstance<?>[] preferenceOptions(Options options) {
        return new OptionInstance[]{options.showAutosaveIndicator(), options.vignette(), options.attackIndicator(), options.chunkSectionFadeInTime()};
    }
 
    public VideoSettingsScreen(Screen lastScreen, Minecraft minecraft, Options options) {
        super(lastScreen, options, TITLE);
        this.gpuWarnlistManager = minecraft.getGpuWarnlistManager();
        this.gpuWarnlistManager.resetWarnings();
        if (options.improvedTransparency().get()) {
            this.gpuWarnlistManager.dismissWarning();
        }
 
        this.oldMipmaps = options.mipmapLevels().get();
        this.oldAnisotropyBit = options.maxAnisotropyBit().get();
        this.oldTextureFiltering = options.textureFiltering().get();
    }
 
    @Override
    protected void addOptions() {
        int CURRENT_MODE = -1;
        Window window = this.minecraft.getWindow();
        Monitor monitor = window.findBestMonitor();
        int initialValue;
        if (monitor == null) {
            initialValue = -1;
        } else {
            Optional<VideoMode> preferredFullscreenVideoMode = window.getPreferredFullscreenVideoMode();
            initialValue = preferredFullscreenVideoMode.map(monitor::getVideoModeIndex).orElse(-1);
        }
 
        OptionInstance<Integer> fullscreenOption = new OptionInstance<>(
            "options.fullscreen.resolution",
            OptionInstance.noTooltip(),
            (caption, value) -> {
                if (monitor == null) {
                    return Component.translatable("options.fullscreen.unavailable");
                } else if (value == -1) {
                    return Options.genericValueLabel(caption, Component.translatable("options.fullscreen.current"));
                } else {
                    VideoMode mode = monitor.getMode(value);
                    return Options.genericValueLabel(
                        caption,
                        Component.translatable(
                            "options.fullscreen.entry",
                            mode.getWidth(),
                            mode.getHeight(),
                            mode.getRefreshRate(),
                            mode.getRedBits() + mode.getGreenBits() + mode.getBlueBits()
                        )
                    );
                }
            },
            new OptionInstance.IntRange(-1, monitor != null ? monitor.getModeCount() - 1 : -1),
            initialValue,
            value -> {
                if (monitor != null) {
                    window.setPreferredFullscreenVideoMode(value == -1 ? Optional.empty() : Optional.of(monitor.getMode(value)));
                }
            }
        );
        this.list.addHeader(DISPLAY_HEADER);
        this.list.addBig(fullscreenOption);
        this.list.addSmall(displayOptions(this.options));
        this.list.addHeader(QUALITY_HEADER);
        this.list.addBig(this.options.graphicsPreset());
        this.list.addSmall(qualityOptions(this.options));
        this.list.addHeader(PREFERENCES_HEADER);
        this.list.addSmall(preferenceOptions(this.options));
    }
 
    @Override
    public void tick() {
        if (this.list != null && this.list.findOption(this.options.maxAnisotropyBit()) instanceof AbstractSliderButton maxAnisotropy) {
            maxAnisotropy.active = this.options.textureFiltering().get() == TextureFilteringMethod.ANISOTROPIC;
        }
 
        super.tick();
    }
 
    @Override
    public void onClose() {
        this.minecraft.getWindow().changeFullscreenVideoMode();
        super.onClose();
    }
 
    @Override
    public void removed() {
        if (this.options.mipmapLevels().get() != this.oldMipmaps
            || this.options.maxAnisotropyBit().get() != this.oldAnisotropyBit
            || this.options.textureFiltering().get() != this.oldTextureFiltering) {
            this.minecraft.updateMaxMipLevel(this.options.mipmapLevels().get());
            this.minecraft.delayTextureReload();
        }
 
        super.removed();
    }
 
    @Override
    public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) {
        if (super.mouseClicked(event, doubleClick)) {
            if (this.gpuWarnlistManager.isShowingWarning()) {
                List<Component> warningMessage = Lists.newArrayList(WARNING_MESSAGE, CommonComponents.NEW_LINE);
                String rendererWarnings = this.gpuWarnlistManager.getRendererWarnings();
                if (rendererWarnings != null) {
                    warningMessage.add(CommonComponents.NEW_LINE);
                    warningMessage.add(Component.translatable("options.graphics.warning.renderer", rendererWarnings).withStyle(ChatFormatting.GRAY));
                }
 
                String vendorWarnings = this.gpuWarnlistManager.getVendorWarnings();
                if (vendorWarnings != null) {
                    warningMessage.add(CommonComponents.NEW_LINE);
                    warningMessage.add(Component.translatable("options.graphics.warning.vendor", vendorWarnings).withStyle(ChatFormatting.GRAY));
                }
 
                String versionWarnings = this.gpuWarnlistManager.getVersionWarnings();
                if (versionWarnings != null) {
                    warningMessage.add(CommonComponents.NEW_LINE);
                    warningMessage.add(Component.translatable("options.graphics.warning.version", versionWarnings).withStyle(ChatFormatting.GRAY));
                }
 
                this.minecraft
                    .setScreen(
                        new UnsupportedGraphicsWarningScreen(
                            WARNING_TITLE, warningMessage, ImmutableList.of(new UnsupportedGraphicsWarningScreen.ButtonOption(BUTTON_ACCEPT, btn -> {
                                this.options.improvedTransparency().set(true);
                                Minecraft.getInstance().levelRenderer.allChanged();
                                this.gpuWarnlistManager.dismissWarning();
                                this.minecraft.setScreen(this);
                            }), new UnsupportedGraphicsWarningScreen.ButtonOption(BUTTON_CANCEL, btn -> {
                                this.gpuWarnlistManager.dismissWarning();
                                this.options.improvedTransparency().set(false);
                                this.updateTransparencyButton();
                                this.minecraft.setScreen(this);
                            }))
                        )
                    );
            }
 
            return true;
        } else {
            return false;
        }
    }
 
    @Override
    public boolean mouseScrolled(double x, double y, double scrollX, double scrollY) {
        if (this.minecraft.hasControlDown()) {
            OptionInstance<Integer> guiScale = this.options.guiScale();
            if (guiScale.values() instanceof OptionInstance.ClampingLazyMaxIntRange clampingLazyMaxIntRange) {
                int oldValue = guiScale.get();
                int adjustedOldValue = oldValue == 0 ? clampingLazyMaxIntRange.maxInclusive() + 1 : oldValue;
                int newValue = adjustedOldValue + (int)Math.signum(scrollY);
                if (newValue != 0 && newValue <= clampingLazyMaxIntRange.maxInclusive() && newValue >= clampingLazyMaxIntRange.minInclusive()) {
                    CycleButton<Integer> cycleButton = (CycleButton<Integer>)this.list.findOption(guiScale);
                    if (cycleButton != null) {
                        guiScale.set(newValue);
                        cycleButton.setValue(newValue);
                        this.list.setScrollAmount(0.0);
                        return true;
                    }
                }
            }
 
            return false;
        } else {
            return super.mouseScrolled(x, y, scrollX, scrollY);
        }
    }
 
    public void updateFullscreenButton(boolean fullscreen) {
        if (this.list != null) {
            AbstractWidget fullscreenWidget = this.list.findOption(this.options.fullscreen());
            if (fullscreenWidget != null) {
                CycleButton<Boolean> fullscreenButton = (CycleButton<Boolean>)fullscreenWidget;
                fullscreenButton.setValue(fullscreen);
            }
        }
    }
 
    public void updateTransparencyButton() {
        if (this.list != null) {
            OptionInstance<Boolean> option = this.options.improvedTransparency();
            AbstractWidget widget = this.list.findOption(option);
            if (widget != null) {
                CycleButton<Boolean> button = (CycleButton<Boolean>)widget;
                button.setValue(option.get());
            }
        }
    }
}

引用的其他类

  • Minecraft

    • 引用位置: 参数/方法调用
    • 关联成员: Minecraft.getInstance()
  • OptionInstance

    • 引用位置: 方法调用/构造调用/返回值
    • 关联成员: IntRange(), OptionInstance.IntRange(), OptionInstance.noTooltip()
  • Options

    • 引用位置: 参数/方法调用
    • 关联成员: Options.genericValueLabel()
  • TextureFilteringMethod

    • 引用位置: 字段
  • Screen

    • 引用位置: 参数
  • OptionsSubScreen

    • 引用位置: 继承
  • UnsupportedGraphicsWarningScreen

    • 引用位置: 方法调用/构造调用
    • 关联成员: ButtonOption(), UnsupportedGraphicsWarningScreen(), UnsupportedGraphicsWarningScreen.ButtonOption()
  • MouseButtonEvent

    • 引用位置: 参数
  • GpuWarnlistManager

    • 引用位置: 字段
  • Component

    • 引用位置: 字段/方法调用
    • 关联成员: Component.translatable()