Skip to content

Commit

Permalink
Merge branch 'dev' into snapshot/dev
Browse files Browse the repository at this point in the history
# Conflicts:
#	common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java
  • Loading branch information
IMS212 committed Sep 18, 2024
2 parents d75f6df + 888d922 commit 05259b6
Show file tree
Hide file tree
Showing 30 changed files with 237 additions and 101 deletions.
6 changes: 2 additions & 4 deletions .github/workflows/build-commit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
java-version: 21

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
uses: gradle/actions/setup-gradle@v4
with:
cache-read-only: false

Expand All @@ -38,6 +38,4 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: sodium-artifacts-${{ steps.ref.outputs.branch }}
path: |
neoforge/build/libs/*.jar
fabric/build/libs/*.jar
path: build/libs/*.jar
4 changes: 2 additions & 2 deletions .github/workflows/build-pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ jobs:
java-version: 21

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
uses: gradle/actions/setup-gradle@v4
with:
cache-read-only: true

- name: Execute Gradle build
run: ./gradlew build

- name: Upload artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: sodium-artifacts-${{ steps.ref.outputs.branch }}
path: build/libs/*.jar
2 changes: 1 addition & 1 deletion .github/workflows/build-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
java-version: 21

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
uses: gradle/actions/setup-gradle@v4
with:
cache-read-only: true

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/build-tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@ jobs:
run: ref="${GITHUB_REF#refs/heads/}" && echo "branch=${ref////-}" >> $GITHUB_OUTPUT
id: ref
- name: Checkout sources
uses: actions/checkout@v3
uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
uses: gradle/actions/setup-gradle@v4
with:
cache-read-only: true

- name: Execute Gradle build
run: ./gradlew build -Pbuild.release=true

- name: Upload artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: sodium-artifacts-${{ steps.ref.outputs.branch }}
path: build/libs/*.jar
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ val FABRIC_API_VERSION by extra { "0.104.1+1.21.2" }
val PARCHMENT_VERSION by extra { null }

// https://semver.org/
val MOD_VERSION by extra { "0.6.0-beta.1" }
val MOD_VERSION by extra { "0.6.0-beta.2" }

allprojects {
apply(plugin = "java")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.Monitor;
import com.mojang.blaze3d.platform.VideoMode;
import com.mojang.blaze3d.platform.Window;
import net.caffeinemc.mods.sodium.client.compatibility.environment.OsUtils;
import net.caffeinemc.mods.sodium.client.gl.arena.staging.MappedStagingBuffer;
import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice;
import net.caffeinemc.mods.sodium.client.gui.options.*;
import net.caffeinemc.mods.sodium.client.gui.options.binding.compat.VanillaBooleanOptionBinding;
import net.caffeinemc.mods.sodium.client.gui.options.control.ControlValueFormatter;
import net.caffeinemc.mods.sodium.client.gui.options.control.CyclingControl;
import net.caffeinemc.mods.sodium.client.gui.options.control.SliderControl;
import net.caffeinemc.mods.sodium.client.gui.options.control.TickBoxControl;
import net.caffeinemc.mods.sodium.client.gui.options.control.*;
import net.caffeinemc.mods.sodium.client.gui.options.storage.MinecraftOptionsStorage;
import net.caffeinemc.mods.sodium.client.gui.options.storage.SodiumOptionsStorage;
import net.caffeinemc.mods.sodium.client.compatibility.workarounds.Workarounds;
Expand All @@ -26,13 +26,16 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

// TODO: Rename in Sodium 0.6
public class SodiumGameOptionPages {
private static final SodiumOptionsStorage sodiumOpts = new SodiumOptionsStorage();
private static final MinecraftOptionsStorage vanillaOpts = new MinecraftOptionsStorage();
private static final Window window = Minecraft.getInstance().getWindow();

public static OptionPage general() {
Monitor monitor = window.findBestMonitor();
List<OptionGroup> groups = new ArrayList<>();

groups.add(OptionGroup.createBuilder()
Expand Down Expand Up @@ -90,6 +93,26 @@ public static OptionPage general() {
}
}, (opts) -> opts.fullscreen().get())
.build())
.add(OptionImpl.createBuilder(int.class, vanillaOpts)
.setName(Component.translatable("options.fullscreen.resolution"))
.setTooltip(Component.translatable("sodium.options.fullscreen_resolution.tooltip"))
.setControl(option -> new SliderControl(option, 0, null != monitor? monitor.getModeCount(): 0, 1, ControlValueFormatter.resolution()))
.setBinding((options, value) -> {
if (null != monitor) {
window.setPreferredFullscreenVideoMode(0 == value? Optional.empty(): Optional.of(monitor.getMode(value - 1)));
}
}, options -> {
if (null == monitor) {
return 0;
}
else {
Optional<VideoMode> optional = window.getPreferredFullscreenVideoMode();
return optional.map((videoMode) -> monitor.getVideoModeIndex(videoMode) + 1).orElse(0);
}
})
.setEnabled(() -> OsUtils.getOs() == OsUtils.OperatingSystem.WIN && Minecraft.getInstance().getWindow().findBestMonitor() != null)
.setFlags(OptionFlag.REQUIRES_VIDEOMODE_RELOAD)
.build())
.add(OptionImpl.createBuilder(boolean.class, vanillaOpts)
.setName(Component.translatable("options.vsync"))
.setTooltip(Component.translatable("sodium.options.v_sync.tooltip"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,10 @@ private void applyChanges() {
client.delayTextureReload();
}

if (flags.contains(OptionFlag.REQUIRES_VIDEOMODE_RELOAD)) {
client.getWindow().changeFullscreenVideoMode();
}

if (flags.contains(OptionFlag.REQUIRES_GAME_RESTART)) {
Console.instance().logMessage(MessageLevel.WARN,
"sodium.console.game_restart", true, 10.0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ public enum OptionFlag {
REQUIRES_RENDERER_RELOAD,
REQUIRES_RENDERER_UPDATE,
REQUIRES_ASSET_RELOAD,
REQUIRES_VIDEOMODE_RELOAD,
REQUIRES_GAME_RESTART
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.navigation.FocusNavigationEvent;
import net.minecraft.client.gui.navigation.ScreenRectangle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class ControlElement<T> extends AbstractWidget {
Expand All @@ -20,18 +21,28 @@ public ControlElement(Option<T> option, Dim2i dim) {
this.dim = dim;
}

public int getContentWidth() {
return this.option.getControl().getMaxWidth();
}

@Override
public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
String name = this.option.getName().getString();
String label;

if ((this.hovered || this.isFocused()) && this.font.width(name) > (this.dim.width() - this.option.getControl().getMaxWidth())) {
name = name.substring(0, Math.min(name.length(), 10)) + "...";
// add the star suffix before truncation to prevent it from overlapping with the label text
if (this.option.isAvailable() && this.option.hasChanged()) {
name = name + " *";
}

// on focus or hover truncate the label to never overlap with the control's content
if (this.hovered || this.isFocused()) {
name = truncateLabelToFit(name);
}

String label;
if (this.option.isAvailable()) {
if (this.option.hasChanged()) {
label = ChatFormatting.ITALIC + name + " *";
label = ChatFormatting.ITALIC + name;
} else {
label = ChatFormatting.WHITE + name;
}
Expand All @@ -49,6 +60,33 @@ public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
}
}

private @NotNull String truncateLabelToFit(String name) {
var suffix = "...";
var suffixWidth = this.font.width(suffix);
var nameFontWidth = this.font.width(name);
var targetWidth = this.dim.width() - this.getContentWidth() - 20;
if (nameFontWidth > targetWidth) {
targetWidth -= suffixWidth;
int maxLabelChars = name.length() - 3;
int minLabelChars = 1;

// binary search on how many chars fit
while (maxLabelChars - minLabelChars > 1) {
var mid = (maxLabelChars + minLabelChars) / 2;
var midName = name.substring(0, mid);
var midWidth = this.font.width(midName);
if (midWidth > targetWidth) {
maxLabelChars = mid;
} else {
minLabelChars = mid;
}
}

name = name.substring(0, minLabelChars).trim() + suffix;
}
return name;
}

public Option<T> getOption() {
return this.option;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,28 @@
package net.caffeinemc.mods.sodium.client.gui.options.control;

import com.mojang.blaze3d.platform.Monitor;
import net.caffeinemc.mods.sodium.client.compatibility.environment.OsUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;

public interface ControlValueFormatter {
static ControlValueFormatter guiScale() {
return (v) -> (v == 0) ? Component.translatable("options.guiScale.auto") : Component.literal(v + "x");
}

static ControlValueFormatter resolution() {
return (v) -> {
Monitor monitor = Minecraft.getInstance().getWindow().findBestMonitor();

if (OsUtils.getOs() != OsUtils.OperatingSystem.WIN || monitor == null) {
return Component.translatable("options.fullscreen.unavailable");
} else if (0 == v) {
return Component.translatable("options.fullscreen.current");
} else {
return Component.literal(monitor.getMode(v - 1).toString().replace(" (24bit)",""));
}
};
}
static ControlValueFormatter fpsLimit() {
return (v) -> (v == 260) ? Component.translatable("options.framerateLimit.max") : Component.translatable("options.framerate", v);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
import com.mojang.blaze3d.platform.InputConstants;
import net.caffeinemc.mods.sodium.client.gui.options.Option;
import net.caffeinemc.mods.sodium.client.util.Dim2i;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.Style;
import net.minecraft.util.Mth;
import org.apache.commons.lang3.Validate;

Expand Down Expand Up @@ -48,6 +49,7 @@ private static class Button extends ControlElement<Integer> {
private static final int THUMB_WIDTH = 2, TRACK_HEIGHT = 1;

private final Rect2i sliderBounds;
private int contentWidth;
private final ControlValueFormatter formatter;

private final int min;
Expand Down Expand Up @@ -75,48 +77,52 @@ public Button(Option<Integer> option, Dim2i dim, int min, int max, int interval,

@Override
public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
super.render(graphics, mouseX, mouseY, delta);

if (this.option.isAvailable() && (this.hovered || this.isFocused())) {
this.renderSlider(graphics);
} else {
this.renderStandaloneValue(graphics);
}
}

private void renderStandaloneValue(GuiGraphics graphics) {
int sliderX = this.sliderBounds.getX();
int sliderY = this.sliderBounds.getY();
int sliderWidth = this.sliderBounds.getWidth();
int sliderHeight = this.sliderBounds.getHeight();

Component label = this.formatter.format(this.option.getValue());
int labelWidth = this.font.width(label);
var label = this.formatter.format(this.option.getValue())
.copy();

this.drawString(graphics, label, sliderX + sliderWidth - labelWidth, sliderY + (sliderHeight / 2) - 4, 0xFFFFFFFF);
}
if (!this.option.isAvailable()) {
label.setStyle(Style.EMPTY
.withColor(ChatFormatting.GRAY)
.withItalic(true));
}

private void renderSlider(GuiGraphics graphics) {
int sliderX = this.sliderBounds.getX();
int sliderY = this.sliderBounds.getY();
int sliderWidth = this.sliderBounds.getWidth();
int sliderHeight = this.sliderBounds.getHeight();
int labelWidth = this.font.width(label);

this.thumbPosition = this.getThumbPositionForValue(this.option.getValue());
boolean drawSlider = this.option.isAvailable() && (this.hovered || this.isFocused());
if (drawSlider) {
this.contentWidth = sliderWidth + labelWidth;
} else {
this.contentWidth = labelWidth;
}

double thumbOffset = Mth.clamp((double) (this.getIntValue() - this.min) / this.range * sliderWidth, 0, sliderWidth);
// render the label first and then the slider to prevent the highlight rect from darkening the slider
super.render(graphics, mouseX, mouseY, delta);

int thumbX = (int) (sliderX + thumbOffset - THUMB_WIDTH);
int trackY = (int) (sliderY + (sliderHeight / 2f) - ((double) TRACK_HEIGHT / 2));
if (drawSlider) {
this.thumbPosition = this.getThumbPositionForValue(this.option.getValue());

this.drawRect(graphics, thumbX, sliderY, thumbX + (THUMB_WIDTH * 2), sliderY + sliderHeight, 0xFFFFFFFF);
this.drawRect(graphics, sliderX, trackY, sliderX + sliderWidth, trackY + TRACK_HEIGHT, 0xFFFFFFFF);
double thumbOffset = Mth.clamp((double) (this.getIntValue() - this.min) / this.range * sliderWidth, 0, sliderWidth);

Component label = this.formatter.format(this.getIntValue());
int thumbX = (int) (sliderX + thumbOffset - THUMB_WIDTH);
int trackY = (int) (sliderY + (sliderHeight / 2f) - ((double) TRACK_HEIGHT / 2));

int labelWidth = this.font.width(label);
this.drawRect(graphics, thumbX, sliderY, thumbX + (THUMB_WIDTH * 2), sliderY + sliderHeight, 0xFFFFFFFF);
this.drawRect(graphics, sliderX, trackY, sliderX + sliderWidth, trackY + TRACK_HEIGHT, 0xFFFFFFFF);

this.drawString(graphics, label, sliderX - labelWidth - 6, sliderY + (sliderHeight / 2) - 4, 0xFFFFFFFF);
this.drawString(graphics, label, sliderX - labelWidth - 6, sliderY + (sliderHeight / 2) - 4, 0xFFFFFFFF);
} else {
this.drawString(graphics, label, sliderX + sliderWidth - labelWidth, sliderY + (sliderHeight / 2) - 4, 0xFFFFFFFF);
}
}

@Override
public int getContentWidth() {
return this.contentWidth;
}

public int getIntValue() {
Expand Down
Loading

0 comments on commit 05259b6

Please sign in to comment.