diff --git a/.gitignore b/.gitignore index 6adbb6c..d4dea09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ # User-specific stuff .idea/ +.ai +MCVR-Repo/ *.iml *.ipr @@ -124,4 +126,4 @@ core.lib libnvidia-ngx-dlss* include/ shaders/ -libxess* \ No newline at end of file +libxess* diff --git a/build.gradle b/build.gradle index fa93c0f..54db29a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.11-SNAPSHOT' + id 'fabric-loom' version '1.8.13' id 'maven-publish' } @@ -40,6 +40,10 @@ repositories { mavenCentral() } +configurations { + shade +} + dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" @@ -50,7 +54,7 @@ dependencies { // https://mvnrepository.com/artifact/org.yaml/snakeyaml implementation "org.yaml:snakeyaml:2.5" - include "org.yaml:snakeyaml:2.5" + shade "org.yaml:snakeyaml:2.5" } processResources { @@ -66,7 +70,7 @@ processResources { } } -def targetJavaVersion = 21 +def targetJavaVersion = 17 tasks.withType(JavaCompile).configureEach { // ensure that the encoding is set to UTF-8, no matter what the system default is // this fixes some edge cases with special characters not displaying correctly @@ -93,6 +97,12 @@ jar { from("LICENSE") { rename { "${it}_${project.archivesBaseName}" } } + + from({ + configurations.shade.collect { it.isDirectory() ? it : zipTree(it) } + }) { + exclude "META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA" + } } tasks.named("remapJar") { @@ -103,6 +113,27 @@ tasks.named("remapSourcesJar") { archiveFileName.set("${project.archives_base_name}-${project.version}-fabric-${project.minecraft_version}-sources.jar") } +def stripArchiveCopyAction = { task -> + def filteredActions = task.actions.findAll { action -> + if (action.class.name != "org.gradle.api.internal.project.taskfactory.StandardTaskAction") { + return true + } + + def methodField = action.class.getDeclaredField("method") + methodField.accessible = true + methodField.get(action).name != "copy" + } + task.setActions(filteredActions) +} + +tasks.named("remapJar") { + stripArchiveCopyAction(delegate) +} + +tasks.named("remapSourcesJar") { + stripArchiveCopyAction(delegate) +} + // configure the maven publication publishing { publications { diff --git a/gradle.properties b/gradle.properties index 90f5058..0304563 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,15 +1,15 @@ # Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx1G +org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.21.4 -yarn_mappings=1.21.4+build.8 -loader_version=0.18.3 -loom_version=1.14-SNAPSHOT +minecraft_version=1.20.1 +yarn_mappings=1.20.1+build.10 +loader_version=0.16.14 +loom_version=1.8.13 # Mod Properties mod_version=0.1.4-alpha maven_group=com.radiance archives_base_name=Radiance # Dependencies # check this on https://modmuss50.me/fabric.html -fabric_version=0.119.4+1.21.4 +fabric_version=0.92.5+1.20.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 002b867..309da0a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ +#Wed Mar 25 17:01:10 CET 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip -networkTimeout=10000 -validateDistributionUrl=true +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/radiance/client/RadianceClient.java b/src/main/java/com/radiance/client/RadianceClient.java index fed8c42..d5f954d 100644 --- a/src/main/java/com/radiance/client/RadianceClient.java +++ b/src/main/java/com/radiance/client/RadianceClient.java @@ -10,6 +10,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.file.AccessDeniedException; import java.nio.file.FileSystem; import java.nio.file.FileSystemNotFoundException; import java.nio.file.FileSystems; @@ -98,6 +99,12 @@ public void copyFileFromResource(Path targetPath, Path resourcePath) { Files.createDirectories(targetPath.getParent()); Files.copy(is, targetPath, StandardCopyOption.REPLACE_EXISTING); + } catch (AccessDeniedException e) { + if (Files.exists(targetPath)) { + LOGGER.warn("Using existing locked native/resource file {}", targetPath); + return; + } + throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } @@ -111,6 +118,12 @@ public void copyOptionalFileFromResource(Path targetPath, Path resourcePath) { Files.createDirectories(targetPath.getParent()); Files.copy(is, targetPath, StandardCopyOption.REPLACE_EXISTING); + } catch (AccessDeniedException e) { + if (Files.exists(targetPath)) { + LOGGER.warn("Using existing locked optional file {}", targetPath); + return; + } + throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/com/radiance/client/constant/Constants.java b/src/main/java/com/radiance/client/constant/Constants.java index 9a23b2f..63bda31 100644 --- a/src/main/java/com/radiance/client/constant/Constants.java +++ b/src/main/java/com/radiance/client/constant/Constants.java @@ -6,7 +6,6 @@ import java.util.Map; import java.util.stream.Collectors; import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderPhase; import net.minecraft.client.render.VertexFormat; public class Constants { @@ -102,8 +101,8 @@ public enum VertexFormats { private static final Map BY_VERTEX_FORMAT = Collections.unmodifiableMap(Arrays.stream(values()) - .collect( - Collectors.toMap(VertexFormats::getVertexFormat, VertexFormats::getValue))); + .collect(Collectors.toMap(VertexFormats::getVertexFormat, + VertexFormats::getValue, (existing, ignored) -> existing))); private final VertexFormat vertexFormat; private final int value; @@ -166,30 +165,11 @@ public static GeometryTypes getGeometryType(RenderLayer renderLayer, boolean ref return WORLD_SOLID; } - if (multiPhase.isTranslucent()) { + if (multiPhase.name.contains("translucent") || multiPhase.name.contains("glint") + || multiPhase.name.contains("lightning") || multiPhase.name.contains("crumbling") + || multiPhase.name.contains("tripwire")) { // transparent - if (RenderPhase.NO_TRANSPARENCY.equals(multiPhase.phases.transparency)) { - return WORLD_TRANSPARENT; - } else if (RenderPhase.ADDITIVE_TRANSPARENCY.equals( - multiPhase.phases.transparency)) { - return WORLD_TRANSPARENT; - } else if (RenderPhase.LIGHTNING_TRANSPARENCY.equals( - multiPhase.phases.transparency)) { - return WORLD_TRANSPARENT; - } else if (RenderPhase.GLINT_TRANSPARENCY.equals(multiPhase.phases.transparency)) { - return WORLD_TRANSPARENT; - } else if (RenderPhase.CRUMBLING_TRANSPARENCY.equals( - multiPhase.phases.transparency)) { - return WORLD_TRANSPARENT; - } else if (RenderPhase.OVERLAY_TRANSPARENCY.equals( - multiPhase.phases.transparency)) { - return WORLD_TRANSPARENT; - } else if (RenderPhase.TRANSLUCENT_TRANSPARENCY.equals( - multiPhase.phases.transparency)) { - return WORLD_TRANSPARENT; - } else { - throw new IllegalArgumentException("Invalid render layer " + multiPhase); - } + return WORLD_TRANSPARENT; } else { // cut out return WORLD_TRANSPARENT; diff --git a/src/main/java/com/radiance/client/gui/ModuleAttributeScreen.java b/src/main/java/com/radiance/client/gui/ModuleAttributeScreen.java index 56e816f..7c9be1c 100644 --- a/src/main/java/com/radiance/client/gui/ModuleAttributeScreen.java +++ b/src/main/java/com/radiance/client/gui/ModuleAttributeScreen.java @@ -1,167 +1,29 @@ package com.radiance.client.gui; import com.radiance.client.pipeline.Module; -import com.radiance.client.pipeline.config.AttributeConfig; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.text.Text; public class ModuleAttributeScreen extends Screen { - private static final int OK_BORDER = 0xFF34D058; - private static final int BAD_BORDER = 0xFFE5534B; - private static final int ROW_LEFT = 20; - private static final int ROW_RIGHT = 20; - private static final int WIDGET_WIDTH = 160; - private static final int VEC3_COMPONENT_WIDTH = 52; - private static final int VEC3_GAP = 2; - - private static final int HEADER_HEIGHT = 32; - private static final String MODULE_ATTRIBUTE_SCREEN_NO_ATTRIBUTES = "module_attribute_screen.no_attributes"; - private final Screen parent; - private final Module module; - - private final List rows = new ArrayList<>(); - - private int scrollY = 0; public ModuleAttributeScreen(Screen parent, Module module) { super(Text.translatable(module.name)); this.parent = parent; - this.module = module; - } - - @Override - protected void init() { - addDrawableChild( - ButtonWidget.builder(Text.translatable("Back"), button -> close()) - .dimensions(10, 6, 60, 20) - .build()); - - rows.clear(); - - List list = module.attributeConfigs; - if (list == null || list.isEmpty()) { - return; - } - - for (AttributeConfig cfg : list) { - List ws = AttributeWidgetUtil.buildWidgets(cfg, textRenderer, WIDGET_WIDTH, - VEC3_COMPONENT_WIDTH); - for (ClickableWidget w : ws) { - addDrawableChild(w); - } - rows.add(new Row(cfg, ws)); - } } @Override public void close() { - MinecraftClient.getInstance().setScreen(parent); + if (this.client != null) { + this.client.setScreen(this.parent); + } } @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { + this.renderBackground(context); super.render(context, mouseX, mouseY, delta); - - context.drawTextWithShadow(textRenderer, Text.translatable(module.name), 10, HEADER_HEIGHT + 8, 0xFFEAEAEA); - - if (rows.isEmpty()) { - context.drawTextWithShadow(textRenderer, MODULE_ATTRIBUTE_SCREEN_NO_ATTRIBUTES, 10, 60, 0xFFB0B0B0); - return; - } - - int baseY = (HEADER_HEIGHT + 28) + scrollY; - int rowH = 22; - - for (int i = 0; i < rows.size(); i++) { - Row row = rows.get(i); - int y = baseY + i * rowH; - - boolean visible = y >= (HEADER_HEIGHT + 18) && y <= (this.height - 24); - if (visible) { - context.drawTextWithShadow(textRenderer, Text.translatable(row.cfg.name), ROW_LEFT, y + 6, - 0xFFD0D0D0); - } - - layoutRowWidgets(row, y); - - String type = row.cfg.type == null ? "" : row.cfg.type.toLowerCase(Locale.ROOT); - boolean doBorder = AttributeWidgetUtil.shouldValidateBorder(type); - - for (ClickableWidget w : row.widgets) { - w.visible = visible; - w.active = visible; - - if (!doBorder) { - continue; - } - - boolean ok = true; - - if (type.equals("vec3")) { - if (w instanceof TextFieldWidget tf) { - ok = AttributeWidgetUtil.isStrictFloat(tf.getText()); - } - } else if (type.equals("int")) { - if (w instanceof TextFieldWidget tf) { - ok = AttributeWidgetUtil.isStrictInt(tf.getText()); - } - } else if (type.equals("float")) { - if (w instanceof TextFieldWidget tf) { - ok = AttributeWidgetUtil.isStrictFloat(tf.getText()); - } - } - - if (w instanceof TextFieldWidget tf) { - int c = ok ? OK_BORDER : BAD_BORDER; - AttributeWidgetUtil.drawBorder(context, tf.getX(), tf.getY(), tf.getWidth(), tf.getHeight(), c); - } - } - } - } - - private void layoutRowWidgets(Row row, int y) { - int widgetWidth = AttributeWidgetUtil.totalWidgetWidth(row.widgets, WIDGET_WIDTH, VEC3_COMPONENT_WIDTH, - VEC3_GAP); - int x = this.width - ROW_RIGHT - widgetWidth; - AttributeWidgetUtil.layoutWidgets(row.widgets, x, y, WIDGET_WIDTH, VEC3_COMPONENT_WIDTH, VEC3_GAP); - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { - int rowH = 22; - int contentH = 60 + rows.size() * rowH + 20; - int minScroll = Math.min(0, this.height - contentH); - - scrollY += (int) (verticalAmount * 10); - if (scrollY > 0) { - scrollY = 0; - } - if (scrollY < minScroll) { - scrollY = minScroll; - } - return true; - } - - private static class Row { - - private final AttributeConfig cfg; - private final List widgets; - - private Row(AttributeConfig cfg, List widgets) { - this.cfg = cfg; - this.widgets = widgets; - } } } diff --git a/src/main/java/com/radiance/client/gui/RenderPipelineScreen.java b/src/main/java/com/radiance/client/gui/RenderPipelineScreen.java index 89d230f..f2dcadd 100644 --- a/src/main/java/com/radiance/client/gui/RenderPipelineScreen.java +++ b/src/main/java/com/radiance/client/gui/RenderPipelineScreen.java @@ -1,1013 +1,28 @@ package com.radiance.client.gui; -import com.radiance.Radiance; -import com.radiance.client.pipeline.Module; -import com.radiance.client.pipeline.ModuleEntry; -import com.radiance.client.pipeline.Pipeline; -import com.radiance.client.pipeline.Presets; -import com.radiance.client.pipeline.config.AttributeConfig; -import com.radiance.client.pipeline.config.ImageConfig; -import com.radiance.mixin_related.extensions.vulkan_render_integration.IDrawContextExt; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; - -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.render.RenderLayer; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; public class RenderPipelineScreen extends Screen { - private static final Identifier GEAR_TEX = Identifier.of(Radiance.MOD_ID, - "textures/gui/render_pipeline/gear.png"); - - private static final Map FORMAT_COLORS = Map.of("R8G8B8A8_SRGB", 0xFF4EA5FF, - "R8G8B8A8_UNORM", 0xFF62E36A, "R16G16_SFLOAT", 0xFFFF6BD6, "R16_SFLOAT", 0xFF6BE6FF, - "R16G16B16A16_SFLOAT", 0xFFFFB84E); - - private static final int HEADER_HEIGHT = 32; - private static final float GLOBAL_SCALE = 0.75f; - private static final String RENDER_PIPELINE_SCREEN_BACK = "render_pipeline_screen.back"; - private static final String RENDER_PIPELINE_SCREEN_SAVE_AND_BUIld = "render_pipeline_screen.save_and_build"; - private static final String RENDER_PIPELINE_SCREEN_RELOAD = "render_pipeline_screen.reload"; - private static final String RENDER_PIPELINE_SCREEN_ADD_MODULE = "render_pipeline_screen.add_module"; - private static final String RENDER_PIPELINE_SCREEN_BACK_HINT = "render_pipeline_screen.back_hint"; private final Screen parent; - private final List nodes = new ArrayList<>(); - private final List moduleConnections = new ArrayList<>(); - private ModuleNode draggedNode = null; - private double lastMouseX, lastMouseY; - private ModuleSelector activeSelector = null; - private ImageConfig localFinalOutput = null; - private ImageConfig pendingPort = null; - private boolean isPendingOutput = false; - private boolean isPanning = false; - - private Mode mode = Mode.PIPELINE; - private final List presets = new ArrayList<>(); - private PresetEntry activePreset = null; - private PresetSelector activePresetSelector = null; - private final List presetBlocks = new ArrayList<>(); - private final List presetWidgets = new ArrayList<>(); - private int presetScrollY = 0; - - private ButtonWidget modeToggleBtn; - private ButtonWidget secondaryBtn; - - private static final String RENDER_PIPELINE_PRESET_NAME = "render_pipeline.preset.name"; - private static final String RENDER_PIPELINE_MODE_NAME = "render_pipeline.mode.name"; public RenderPipelineScreen(Screen parent) { super(Text.literal("Render Pipeline")); - this.parent = parent; - - registerDefaultPresets(); - - Pipeline.PipelineMode pipelineMode = Pipeline.getPipelineMode(); - this.mode = pipelineMode == Pipeline.PipelineMode.PRESET ? Mode.PRESET : Mode.PIPELINE; - - String presetName = Pipeline.processPresetName(Pipeline.getActivePreset()); - if (presetName != null) { - for (PresetEntry e : presets) { - if (e != null && e.name() != null && e.name().equals(presetName)) { - this.activePreset = e; - break; - } - } - } - - if (this.mode == Mode.PRESET && this.activePreset == null && !this.presets.isEmpty()) { - this.activePreset = this.presets.getFirst(); - } - } - - private int getFormatColor(String format) { - Integer c = FORMAT_COLORS.get(format); - if (c == null) { - throw new RuntimeException("No color for image format: " + format); - } - return c; - } - - @Override - protected void init() { - rebuildUI(); - } - - private void rebuildUI() { - clearChildren(); - activeSelector = null; - activePresetSelector = null; - presetWidgets.clear(); - - if (mode == Mode.PRESET && activePreset == null && !presets.isEmpty()) { - activePreset = presets.getFirst(); - } - - if (mode == Mode.PIPELINE) { - refreshPipeline(); - } - - int backX = 10; - int backW = 60; - int toggleX = backX + backW + 5; - int toggleW = 110; - int secondaryX = toggleX + toggleW + 5; - int secondaryW = 150; - - addDrawableChild( - ButtonWidget.builder(Text.translatable(RENDER_PIPELINE_SCREEN_BACK), button -> close()) - .dimensions(backX, 6, backW, 20).build()); - - modeToggleBtn = addDrawableChild(ButtonWidget.builder( - Text.translatable(RENDER_PIPELINE_MODE_NAME) - .append(Text.literal(": ").append(Text.translatable(mode.key))), button -> { - if (mode == Mode.PIPELINE) { - if (activePreset == null && !presets.isEmpty()) { - activePreset = presets.getFirst(); - } - Pipeline.switchToPresetMode( - activePreset != null ? activePreset.name() : "Default"); - mode = Mode.PRESET; - } else { - Pipeline.switchToPipelineMode(); - mode = Mode.PIPELINE; - } - rebuildUI(); - }).dimensions(toggleX, 6, toggleW, 20).build()); - - if (mode == Mode.PIPELINE) { - secondaryBtn = addDrawableChild( - ButtonWidget.builder(Text.translatable(RENDER_PIPELINE_SCREEN_ADD_MODULE), - button -> { - Map entries = Pipeline.INSTANCE.getModuleEntries(); - if (entries != null && !entries.isEmpty()) { - activeSelector = new ModuleSelector(secondaryX, HEADER_HEIGHT + 4, - entries); - } - }).dimensions(secondaryX, 6, secondaryW, 20).build()); - } else { - Text activePresetText = activePreset != null - ? Text.translatable(activePreset.name()) - : Text.literal("N/A"); // to make sure - secondaryBtn = addDrawableChild( - ButtonWidget.builder(Text.translatable(RENDER_PIPELINE_PRESET_NAME) - .append(Text.literal(": ")) - .append(activePresetText), button -> { - if (!presets.isEmpty()) { - activePresetSelector = new PresetSelector(secondaryX, HEADER_HEIGHT + 4, - presets); - } - }).dimensions(secondaryX, 6, secondaryW, 20).build()); - } - - ButtonWidget saveBtn = addDrawableChild( - ButtonWidget.builder(Text.translatable(RENDER_PIPELINE_SCREEN_SAVE_AND_BUIld), - button -> { - if (mode == Mode.PIPELINE) { - syncToPipeline(); - } else { - syncPresetToPipeline(); - } - }).dimensions(secondaryX + secondaryW + 5, 6, 100, 20).build()); - - ButtonWidget reloadBtn = addDrawableChild( - ButtonWidget.builder(Text.translatable(RENDER_PIPELINE_SCREEN_RELOAD), button -> { - if (mode == Mode.PIPELINE) { - refreshPipeline(); - } else { - applyActivePreset(); - } - }).dimensions(secondaryX + secondaryW + 110, 6, 100, 20).build()); - - saveBtn.active = true; - reloadBtn.active = true; - secondaryBtn.visible = true; - secondaryBtn.active = true; - - if (mode == Mode.PRESET) { - presetScrollY = 0; - if (activePreset == null && !presets.isEmpty()) { - activePreset = presets.get(0); - } - Pipeline.switchToPresetMode(activePreset != null ? activePreset.name() : "Default"); - applyActivePreset(); - } - } - - public void refreshPipeline() { - nodes.clear(); - for (Module module : Pipeline.INSTANCE.getModules()) { - nodes.add(new ModuleNode(module)); - } - - moduleConnections.clear(); - var globalConnections = Pipeline.INSTANCE.getModuleConnections(); - globalConnections.forEach((src, list) -> list.forEach( - dst -> moduleConnections.add(new ModuleConnection(src, dst)))); - for (ModuleNode node : nodes) { - for (ImageConfig out : node.module.outputImageConfigs) { - if (out.finalOutput) { - localFinalOutput = out; - break; - } - } - } - } - - public void syncToPipeline() { - Pipeline.clear(); - for (ModuleNode node : nodes) { - Pipeline.addModule(node.module); - } - - for (ModuleConnection moduleConnection : moduleConnections) { - Pipeline.connect(moduleConnection.src, moduleConnection.dst); - } - - Pipeline.build(); - refreshPipeline(); } @Override public void close() { - if (mode == Mode.PIPELINE) { - syncToPipeline(); - } else { - syncPresetToPipeline(); + if (this.client != null) { + this.client.setScreen(this.parent); } - MinecraftClient.getInstance().setScreen(parent); } @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { - for (ModuleNode node : nodes) { - node.updateWidth(textRenderer); - } - - this.renderBackground(context, mouseX, mouseY, delta); - - context.getMatrices().push(); - context.getMatrices().scale(GLOBAL_SCALE, GLOBAL_SCALE, 1f); - - int scaledMouseX = (int) (mouseX / GLOBAL_SCALE); - int scaledMouseY = (int) (mouseY / GLOBAL_SCALE); - - for (Drawable drawable : this.drawables) { - drawable.render(context, scaledMouseX, scaledMouseY, delta); - } - - context.drawTextWithShadow(textRenderer, - Text.translatable(RENDER_PIPELINE_SCREEN_BACK_HINT), 10, HEADER_HEIGHT + 8, 0xFFEAEAEA); - - if (mode == Mode.PIPELINE) { - for (ModuleNode node : nodes) { - drawModuleNode(context, node); - } - - drawConnections(context); - - if (activeSelector != null) { - context.getMatrices().push(); - context.getMatrices().translate(0, 0, 200); - activeSelector.render(context, scaledMouseX, scaledMouseY); - context.getMatrices().pop(); - } - } else { - renderPresetMode(context); - if (activePresetSelector != null) { - context.getMatrices().push(); - context.getMatrices().translate(0, 0, 200); - activePresetSelector.render(context, scaledMouseX, scaledMouseY); - context.getMatrices().pop(); - } - } - - context.getMatrices().pop(); - } - - private int scaledW() { - return (int) (this.width / GLOBAL_SCALE); - } - - private int scaledH() { - return (int) (this.height / GLOBAL_SCALE); - } - - private void renderPresetMode(DrawContext ctx) { - int sw = scaledW(); - int sh = scaledH(); - int x0 = 10; - int y0 = HEADER_HEIGHT + 28; - int contentW = sw - 20; - - int y = y0 + presetScrollY; - int titleGap = 12; - int afterTitle = 8; - int rowH = 22; - - for (PresetModuleBlock block : presetBlocks) { - if (block.rows.isEmpty()) { - continue; - } - int titleY = y; - int tw = textRenderer.getWidth(Text.translatable(block.module.name)); - int tx = x0 + (contentW - tw) / 2; - - boolean titleVisible = titleY >= (HEADER_HEIGHT + 18) && titleY <= (sh - 24); - if (titleVisible) { - ctx.drawTextWithShadow(textRenderer, Text.translatable(block.module.name), tx, - titleY, 0xFFEAEAEA); - } - - y += titleGap + afterTitle; - - for (int i = 0; i < block.rows.size(); i++) { - PresetRow row = block.rows.get(i); - int ry = y + i * rowH; - boolean visible = ry >= (HEADER_HEIGHT + 18) && ry <= (sh - 24); - - if (visible) { - ctx.drawTextWithShadow(textRenderer, Text.translatable(row.cfg.name), x0 + 10, - ry + 6, 0xFFD0D0D0); - } - - layoutPresetRowWidgets(row, x0 + contentW - 10, ry); - - String type = row.cfg.type == null ? "" : row.cfg.type.toLowerCase(Locale.ROOT); - boolean doBorder = AttributeWidgetUtil.shouldValidateBorder(type); - - for (ClickableWidget w : row.widgets) { - w.visible = visible; - w.active = visible; - - if (!doBorder) { - continue; - } - - boolean ok = true; - if (type.equals("vec3")) { - if (w instanceof TextFieldWidget tf) { - ok = AttributeWidgetUtil.isStrictFloat(tf.getText()); - } - } else if (type.equals("int")) { - if (w instanceof TextFieldWidget tf) { - ok = AttributeWidgetUtil.isStrictInt(tf.getText()); - } - } else if (type.equals("float")) { - if (w instanceof TextFieldWidget tf) { - ok = AttributeWidgetUtil.isStrictFloat(tf.getText()); - } - } - - int bx = w.getX() - 1; - int by = w.getY() - 1; - int bw = w.getWidth() + 2; - int bh = w.getHeight() + 2; - AttributeWidgetUtil.drawBorder(ctx, bx, by, bw, bh, - ok ? 0xFF34D058 : 0xFFE5534B); - } - } - - y += block.rows.size() * rowH + 18; - } - } - - private void layoutPresetRowWidgets(PresetRow row, int rightEdge, int y) { - int singleWidth = 200; - int tripleWidth = 64; - int gap = 4; - int widgetWidth = AttributeWidgetUtil.totalWidgetWidth(row.widgets, singleWidth, tripleWidth, gap); - int x = rightEdge - widgetWidth; - AttributeWidgetUtil.layoutWidgets(row.widgets, x, y, singleWidth, tripleWidth, gap); - } - - private PortPos getPortPosition(ImageConfig config, boolean isOutput) { - for (ModuleNode node : nodes) { - if (node.module == config.owner) { - int x = (int) node.module.x; - int y = (int) node.module.y + HEADER_HEIGHT; - var list = - isOutput ? node.module.outputImageConfigs : node.module.inputImageConfigs; - int index = list.indexOf(config); - - if (index != -1) { - int ry = y + node.headerH + node.pad + index * node.rowH + 7; - int dotY = ry + 7; - int dotX = isOutput ? (x + node.width - 10) : (x + 10); - return new PortPos(dotX, dotY); - } - } - } - return null; - } - - private void drawBezier(DrawContext ctx, int x1, int y1, int x2, int y2, int color) { - int segments = 32; - float prevX = x1; - float prevY = y1; - float thickness = 1.2f; - - float ctrlOffset = Math.abs(x2 - x1) * 0.5f; - - for (int i = 1; i <= segments; i++) { - float t = i / (float) segments; - float invT = 1 - t; - float b0 = invT * invT * invT; - float b1 = 3 * invT * invT * t; - float b2 = 3 * invT * t * t; - float b3 = t * t * t; - - float cx = b0 * x1 + b1 * (x1 + ctrlOffset) + b2 * (x2 - ctrlOffset) + b3 * x2; - float cy = b0 * y1 + b1 * y1 + b2 * y2 + b3 * y2; - - ((IDrawContextExt) (Object) ctx).radiance$drawOrientedQuad(RenderLayer.getGui(), - prevX, prevY, cx, cy, thickness, color); - - prevX = cx; - prevY = cy; - } - } - - private void drawConnections(DrawContext context) { - for (ModuleConnection link : moduleConnections) { - PortPos p1 = getPortPosition(link.src, true); - PortPos p2 = getPortPosition(link.dst, false); - if (p1 != null && p2 != null) { - drawBezier(context, p1.x, p1.y, p2.x, p2.y, getFormatColor(link.src.format)); - } - } - } - - private void drawModuleNode(DrawContext context, ModuleNode moduleNode) { - int x = (int) moduleNode.module.x; - int y = (int) moduleNode.module.y + HEADER_HEIGHT; - int w = moduleNode.width; - int h = moduleNode.height(); - - context.fill(x, y, x + w, y + h, 0xFF20242C); - - context.fill(x, y, x + w, y + moduleNode.headerH, 0xFF2B3240); - - context.drawTextWithShadow(textRenderer, Text.translatable(moduleNode.module.name), x + 6, - y + 5, 0xFFEAEAEA); - - int btnSize = 12; - int deleteX = x + w - btnSize - 4; - int btnY = y + (moduleNode.headerH - btnSize) / 2; - int gearX = deleteX - btnSize - 2; - - context.drawTexture(RenderLayer::getGuiTextured, GEAR_TEX, gearX, btnY, 0, 0, btnSize, - btnSize, btnSize, btnSize); - - context.drawTextWithShadow(textRenderer, "×", deleteX + 3, btnY + 2, 0xFFFF5A5A); - - for (int i = 0; i < moduleNode.rows(); i++) { - int ry = y + moduleNode.headerH + moduleNode.pad + i * moduleNode.rowH + 7; - - if (i < moduleNode.module.inputImageConfigs.size()) { - ImageConfig in = moduleNode.module.inputImageConfigs.get(i); - int dotX = x + 10; - int dotY = ry + 7; - - int color = (in == pendingPort) ? 0xFFFFFF00 : getFormatColor(in.format); - boolean isConnected = moduleConnections.stream().anyMatch(l -> l.dst == in); - drawPortDot(context, dotX, dotY, color, isConnected, false); - - context.drawTextWithShadow(textRenderer, in.name, x + 18, ry + 2, 0xFFD0D0D0); - } - - if (i < moduleNode.module.outputImageConfigs.size()) { - ImageConfig out = moduleNode.module.outputImageConfigs.get(i); - int dotX = x + w - 10; - int dotY = ry + 7; - - int color = (out == pendingPort) ? 0xFFFFFF00 : getFormatColor(out.format); - boolean isConnected = moduleConnections.stream().anyMatch(l -> l.src == out); - drawPortDot(context, dotX, dotY, color, isConnected, out == localFinalOutput); - - int nameWidth = textRenderer.getWidth(out.name); - context.drawTextWithShadow(textRenderer, out.name, (dotX - 8) - nameWidth, ry + 2, - 0xFFD0D0D0); - } - } - } - - private void drawPortDot(DrawContext ctx, int cx, int cy, int color, boolean filled, - boolean isFinal) { - ctx.fill(cx - 4, cy - 4, cx + 5, cy + 5, isFinal ? 0xFF55FF55 : 0xFF000000); - ctx.fill(cx - 3, cy - 3, cx + 4, cy + 4, 0xFF000000); - ctx.fill(cx - 2, cy - 2, cx + 3, cy + 3, color); - if (!filled) { - ctx.fill(cx - 1, cy - 1, cx + 2, cy + 2, 0xFF20242C); - } - } - - private boolean testCycle(ImageConfig src, ImageConfig dst) { - if (src.owner == dst.owner) { - return true; - } - return hasPath(dst.owner, src.owner); - } - - private boolean hasPath(Module start, Module target) { - if (start == target) { - return true; - } - for (ModuleConnection link : moduleConnections) { - if (link.src.owner == start) { - if (hasPath(link.dst.owner, target)) { - return true; - } - } - } - return false; - } - - private void handleLocalConnection(ImageConfig current, boolean isOutput) { - if (pendingPort == null) { - pendingPort = current; - isPendingOutput = isOutput; - } else { - if (isPendingOutput != isOutput) { - ImageConfig src = isPendingOutput ? pendingPort : current; - ImageConfig dst = isPendingOutput ? current : pendingPort; - - if (!Objects.equals(src.format, dst.format)) { - pendingPort = null; - return; - } - - if (src.owner == dst.owner) { - pendingPort = null; - return; - } - - if (!testCycle(src, dst)) { - moduleConnections.removeIf(link -> link.dst == dst); - moduleConnections.add(new ModuleConnection(src, dst)); - } - } - pendingPort = null; - } - } - - private boolean isGearClicked(ModuleNode node, double mouseX, double mouseY) { - int x = (int) node.module.x; - int y = (int) node.module.y + HEADER_HEIGHT; - int w = node.width; - int btnSize = 12; - int deleteX = x + w - btnSize - 4; - int btnY = y + (node.headerH - btnSize) / 2; - int gearX = deleteX - btnSize - 2; - return mouseX >= gearX && mouseX <= gearX + btnSize && mouseY >= btnY - && mouseY <= btnY + btnSize; - } - - private boolean isDeleteClicked(ModuleNode node, double mouseX, double mouseY) { - int x = (int) node.module.x; - int y = (int) node.module.y + HEADER_HEIGHT; - int w = node.width; - int btnSize = 12; - int deleteX = x + w - btnSize - 4; - int btnY = y + (node.headerH - btnSize) / 2; - return mouseX >= deleteX && mouseX <= deleteX + btnSize && mouseY >= btnY - && mouseY <= btnY + btnSize; - } - - private ImageConfig getClickedPort(ModuleNode node, double mouseX, double mouseY, - boolean isOutput) { - int x = (int) node.module.x; - int y = (int) node.module.y + HEADER_HEIGHT; - int w = node.width; - - var configs = isOutput ? node.module.outputImageConfigs : node.module.inputImageConfigs; - if (configs == null) { - return null; - } - - for (int i = 0; i < configs.size(); i++) { - int ry = y + node.headerH + node.pad + i * node.rowH + 7; - int dotY = ry + 7; - int dotX = isOutput ? (x + w - 10) : (x + 10); - - if (Math.abs(mouseX - dotX) <= 8 && Math.abs(mouseY - dotY) <= 8) { - return configs.get(i); - } - } - return null; - } - - private void deleteNode(ModuleNode node) { - nodes.remove(node); - moduleConnections.removeIf( - link -> link.src.owner == node.module || link.dst.owner == node.module); - - if (draggedNode == node) { - draggedNode = null; - } - if (pendingPort != null && pendingPort.owner == node.module) { - pendingPort = null; - } - if (localFinalOutput != null && localFinalOutput.owner == node.module) { - localFinalOutput = null; - } - - activeSelector = null; - } - - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - mouseX /= GLOBAL_SCALE; - mouseY /= GLOBAL_SCALE; - - lastMouseX = mouseX; - lastMouseY = mouseY; - - isPanning = false; - draggedNode = null; - - if (mouseY < HEADER_HEIGHT) { - return super.mouseClicked(mouseX, mouseY, button); - } - - if (mode == Mode.PRESET) { - if (activePresetSelector != null) { - if (activePresetSelector.onClick(mouseX, mouseY)) { - activePresetSelector = null; - return true; - } - activePresetSelector = null; - } - return super.mouseClicked(mouseX, mouseY, button); - } - - for (ModuleNode node : nodes) { - if (button == 0 && isDeleteClicked(node, mouseX, mouseY)) { - deleteNode(node); - return true; - } - - if (button == 0 && isGearClicked(node, mouseX, mouseY)) { - MinecraftClient.getInstance() - .setScreen(new ModuleAttributeScreen(this, node.module)); - return true; - } - } - - for (ModuleNode node : nodes) { - ImageConfig clickedIn = getClickedPort(node, mouseX, mouseY, false); - ImageConfig clickedOut = getClickedPort(node, mouseX, mouseY, true); - ImageConfig current = (clickedIn != null) ? clickedIn : clickedOut; - - if (current != null) { - if (button == 0) { - handleLocalConnection(current, clickedOut != null); - return true; - } else if (button == 1) { - boolean isConnected = moduleConnections.stream() - .anyMatch(l -> l.src == current || l.dst == current); - - if (isConnected) { - moduleConnections.removeIf( - link -> link.src == current || link.dst == current); - } else if (clickedOut != null) { - if (localFinalOutput != null && localFinalOutput != current) { - localFinalOutput.finalOutput = false; - } - - localFinalOutput = (localFinalOutput == current) ? null : current; - current.finalOutput = (localFinalOutput == current); - } - return true; - } - } - } - - if (activeSelector != null) { - if (activeSelector.onClick(mouseX, mouseY)) { - activeSelector = null; - return true; - } - activeSelector = null; - } - - for (int i = nodes.size() - 1; i >= 0; i--) { - ModuleNode node = nodes.get(i); - if (mouseX >= node.module.x && mouseX <= node.module.x + node.width && mouseY >= ( - node.module.y + HEADER_HEIGHT) && mouseY <= (node.module.y + HEADER_HEIGHT - + node.height())) { - if (button == 0) { - draggedNode = node; - } else if (button == 1) { - isPanning = true; - } - return true; - } - } - - if (button == 1 || button == 0) { - isPanning = true; - return true; - } - - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, - double verticalAmount) { - if (mode != Mode.PRESET) { - return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount); - } - - int sh = scaledH(); - int y0 = HEADER_HEIGHT + 28; - int rowH = 22; - int contentH = y0 + presetBlocks.stream().filter(b -> !b.rows.isEmpty()) - .mapToInt(b -> 12 + 8 + (b.rows.size() * rowH) + 18).sum(); - int minScroll = Math.min(0, sh - contentH - 10); - - presetScrollY += (int) (verticalAmount * 12); - if (presetScrollY > 0) { - presetScrollY = 0; - } - if (presetScrollY < minScroll) { - presetScrollY = minScroll; - } - return true; - } - - @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, - double deltaY) { - mouseX /= GLOBAL_SCALE; - mouseY /= GLOBAL_SCALE; - - if (mode == Mode.PRESET) { - return super.mouseDragged(mouseX, mouseY, button, deltaX / GLOBAL_SCALE, - deltaY / GLOBAL_SCALE); - } - - if (super.mouseDragged(mouseX, mouseY, button, deltaX / GLOBAL_SCALE, - deltaY / GLOBAL_SCALE)) { - lastMouseX = mouseX; - lastMouseY = mouseY; - return true; - } - - double dx = mouseX - lastMouseX; - double dy = mouseY - lastMouseY; - - if (button == 0 && draggedNode != null) { - draggedNode.module.x += dx; - draggedNode.module.y += dy; - } else if (isPanning && (button == 1 || button == 0)) { - for (ModuleNode node : nodes) { - node.module.x += dx; - node.module.y += dy; - } - } - - lastMouseX = mouseX; - lastMouseY = mouseY; - return true; - } - - - @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { - mouseX /= GLOBAL_SCALE; - mouseY /= GLOBAL_SCALE; - - lastMouseX = mouseX; - lastMouseY = mouseY; - - boolean handled = super.mouseReleased(mouseX, mouseY, button); - - draggedNode = null; - isPanning = false; - - return handled; - } - - - private record ModuleConnection(ImageConfig src, ImageConfig dst) { - - } - - private record PortPos(int x, int y) { - - } - - private class ModuleSelector { - - private final int x, y, width; - private final List options; - private final int itemHeight = 18; - - public ModuleSelector(int x, int y, Map entries) { - this.x = x; - this.y = y; - this.options = new ArrayList<>(); - for (ModuleEntry entry : entries.values()) { - if (entry == null || entry.name == null) { - continue; - } - if (Pipeline.isModuleAvailable(entry.name)) { - this.options.add(entry); - } - } - this.width = 120; - } - - public void render(DrawContext ctx, int mouseX, int mouseY) { - int currentY = y; - ctx.fill(x - 1, y - 1, x + width + 1, y + (options.size() * itemHeight) + 1, - 0xFFFFFFFF); - - for (ModuleEntry entry : options) { - boolean hovered = mouseX >= x && mouseX <= x + width && mouseY >= currentY - && mouseY <= currentY + itemHeight; - ctx.fill(x, currentY, x + width, currentY + itemHeight, - hovered ? 0xFF444444 : 0xFF222222); - ctx.drawTextWithShadow(textRenderer, Text.translatable(entry.name), x + 5, - currentY + 5, 0xFFE0E0E0); - currentY += itemHeight; - } - } - - public boolean onClick(double mouseX, double mouseY) { - if (mouseX < x || mouseX > x + width || mouseY < y || mouseY > y + (options.size() - * itemHeight)) { - return false; - } - int index = (int) ((mouseY - y) / itemHeight); - if (index >= 0 && index < options.size()) { - ModuleEntry selected = options.get(index); - if (!Pipeline.isModuleAvailable(selected.name)) { - return true; - } - Module module = selected.loadModule(); - module.x = 100; - module.y = 100; - nodes.add(new ModuleNode(module)); - return true; - } - return false; - } - } - - private enum Mode { - PIPELINE("render_pipeline.mode.pipeline"), PRESET("render_pipeline.mode.preset"); - - public final String key; - - Mode(String key) { - this.key = key; - } - } - - private record PresetEntry(String name) { - - } - - private void registerDefaultPresets() { - this.presets.clear(); - if (Pipeline.isPresetAvailable(Presets.RT_DLSSRR.key)) { - this.presets.add(new PresetEntry(Presets.RT_DLSSRR.key)); - } - if (Pipeline.isPresetAvailable(Presets.RT_NRD.key)) { - this.presets.add(new PresetEntry(Presets.RT_NRD.key)); - } - if (Pipeline.isPresetAvailable(Presets.RT_NRD_FSR.key)) { - this.presets.add(new PresetEntry(Presets.RT_NRD_FSR.key)); - } - if (Pipeline.isPresetAvailable(Presets.RT_NRD_XESS.key)) { - this.presets.add(new PresetEntry(Presets.RT_NRD_XESS.key)); - } - } - - private void applyActivePreset() { - presetBlocks.clear(); - for (ClickableWidget w : presetWidgets) { - this.children().remove(w); - this.drawables.remove(w); - } - presetWidgets.clear(); - - if (activePreset == null) { - return; - } - - Pipeline.switchToPresetMode(activePreset.name()); - - List modules = new ArrayList<>(Pipeline.INSTANCE.getModules()); - - for (Module m : modules) { - PresetModuleBlock block = new PresetModuleBlock(m); - presetBlocks.add(block); - if (m.attributeConfigs == null || m.attributeConfigs.isEmpty()) { - continue; - } - for (AttributeConfig cfg : m.attributeConfigs) { - List ws = buildPresetWidgets(cfg); - for (ClickableWidget w : ws) { - presetWidgets.add(addDrawableChild(w)); - } - block.rows.add(new PresetRow(cfg, ws)); - } - } - - if (secondaryBtn != null && mode == Mode.PRESET) { - Text activePresetText = activePreset != null - ? Text.translatable(activePreset.name()) - : Text.literal("N/A"); - secondaryBtn.setMessage(Text.translatable(RENDER_PIPELINE_PRESET_NAME) - .append(Text.literal(": ")) - .append(activePresetText)); - } - } - - private void syncPresetToPipeline() { - Pipeline.savePipeline(); - Pipeline.build(); - refreshPipeline(); - } - - private List buildPresetWidgets(AttributeConfig cfg) { - return AttributeWidgetUtil.buildWidgets(cfg, textRenderer, 200, 64); - } - - private class PresetSelector { - - private final int x, y, width; - private final List options; - private final int itemHeight = 18; - - public PresetSelector(int x, int y, List presets) { - this.x = x; - this.y = y; - this.options = new ArrayList<>(presets); - this.width = 140; - } - - public void render(DrawContext ctx, int mouseX, int mouseY) { - int currentY = y; - ctx.fill(x - 1, y - 1, x + width + 1, y + (options.size() * itemHeight) + 1, - 0xFFFFFFFF); - - for (PresetEntry entry : options) { - boolean hovered = mouseX >= x && mouseX <= x + width && mouseY >= currentY - && mouseY <= currentY + itemHeight; - ctx.fill(x, currentY, x + width, currentY + itemHeight, - hovered ? 0xFF444444 : 0xFF222222); - ctx.drawTextWithShadow(textRenderer, Text.translatable(entry.name()), x + 5, - currentY + 5, 0xFFE0E0E0); - currentY += itemHeight; - } - } - - public boolean onClick(double mouseX, double mouseY) { - if (mouseX < x || mouseX > x + width || mouseY < y || mouseY > y + (options.size() - * itemHeight)) { - return false; - } - int index = (int) ((mouseY - y) / itemHeight); - if (index >= 0 && index < options.size()) { - activePreset = options.get(index); - presetScrollY = 0; - Pipeline.switchToPresetMode(activePreset != null ? activePreset.name() : "Default"); - applyActivePreset(); - return true; - } - return false; - } - } - - private static class PresetModuleBlock { - - private final Module module; - private final List rows = new ArrayList<>(); - - private PresetModuleBlock(Module module) { - this.module = module; - } - } - - private record PresetRow(AttributeConfig cfg, List widgets) { - + this.renderBackground(context); + super.render(context, mouseX, mouseY, delta); } } diff --git a/src/main/java/com/radiance/client/proxy/vulkan/BufferProxy.java b/src/main/java/com/radiance/client/proxy/vulkan/BufferProxy.java index 3481584..7ae0fd3 100644 --- a/src/main/java/com/radiance/client/proxy/vulkan/BufferProxy.java +++ b/src/main/java/com/radiance/client/proxy/vulkan/BufferProxy.java @@ -13,9 +13,9 @@ import java.nio.IntBuffer; import java.util.Map; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BuiltBuffer; +import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.Camera; -import net.minecraft.client.render.Fog; +import net.minecraft.client.render.FogShape; import net.minecraft.client.render.RenderPhase; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.world.ClientWorld; @@ -53,20 +53,20 @@ private static void queueUpload(ByteBuffer buf, int expectedSize, int dstId) { public static native void performQueuedUpload(); public static VertexIndexBufferHandle createAndUploadVertexIndexBuffer( - BuiltBuffer builtBuffer) { - BuiltBuffer.DrawParameters drawParameters = builtBuffer.getDrawParameters(); - assert builtBuffer.getDrawParameters().mode() == VertexFormat.DrawMode.QUADS; + BufferBuilder.BuiltBuffer builtBuffer) { + BufferBuilder.DrawParameters drawParameters = builtBuffer.getParameters(); + assert drawParameters.mode() == VertexFormat.DrawMode.QUADS; int vertexSize = drawParameters.vertexCount() * drawParameters.format().getVertexSizeByte(); int vertexId = allocateBuffer(); initializeBuffer(vertexId, vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT.getValue()); - queueUpload(builtBuffer.getBuffer(), vertexSize, vertexId); + queueUpload(builtBuffer.getVertexBuffer(), vertexSize, vertexId); int indexSize = drawParameters.indexCount() * drawParameters.indexType().size; int indexId = allocateBuffer(); initializeBuffer(indexId, indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT.getValue()); - if (builtBuffer.getSortedBuffer() != null) { - queueUpload(builtBuffer.getSortedBuffer(), indexSize, indexId); + if (builtBuffer.getIndexBuffer() != null) { + queueUpload(builtBuffer.getIndexBuffer(), indexSize, indexId); } else { int type = Constants.IndexTypes.getValue(drawParameters.indexType()); int drawMode = Constants.DrawModes.getValue(drawParameters.mode()); @@ -110,20 +110,19 @@ public static void updateOverlayDrawUniform() { bb.putFloat(baseAddr, shaderGlintAlpha); baseAddr += Float.BYTES; - Fog fog = RenderSystem.getShaderFog(); - float fogStart = fog.start(); + float fogStart = RenderSystem.getShaderFogStart(); bb.putFloat(baseAddr, fogStart); baseAddr += Float.BYTES; - float fogEnd = fog.end(); + float fogEnd = RenderSystem.getShaderFogEnd(); bb.putFloat(baseAddr, fogEnd); baseAddr += Float.BYTES; - int fogShape = fog.shape().getId(); + int fogShape = RenderSystem.getShaderFogShape().getId(); bb.putInt(baseAddr, fogShape); baseAddr += Integer.BYTES; - float[] fogColor = {fog.red(), fog.green(), fog.blue(), fog.alpha()}; + float[] fogColor = RenderSystem.getShaderFogColor(); for (int i = 0; i < 4; i++) { bb.putFloat(baseAddr, fogColor[i]); baseAddr += Float.BYTES; @@ -202,8 +201,9 @@ public static void updateOverlayPostUniform(float radius) { public static native void updateWorldUniform(long ptr); public static void updateWorldUniform(Camera camera, Matrix4f viewMatrix, - Matrix4f effectedViewMatrix, Matrix4f projectionMatrix, int overlayTextureID, Fog fog, - ClientWorld world, int endSkyTextureID, int endPortalTextureID) { + Matrix4f effectedViewMatrix, Matrix4f projectionMatrix, int overlayTextureID, + float fogStart, float fogEnd, float[] fogColor, FogShape fogShape, ClientWorld world, + int endSkyTextureID, int endPortalTextureID) { try (MemoryStack stack = stackPush()) { int size = 560; ByteBuffer bb = stack.malloc(size); @@ -238,21 +238,21 @@ public static void updateWorldUniform(Camera camera, Matrix4f viewMatrix, baseAddr += Integer.BYTES; bb.putInt(baseAddr, camera.isThirdPerson() ? 0 : 1); baseAddr += Integer.BYTES; - bb.putFloat(baseAddr, fog.start()); + bb.putFloat(baseAddr, fogStart); baseAddr += Float.BYTES; - bb.putFloat(baseAddr, fog.end()); + bb.putFloat(baseAddr, fogEnd); baseAddr += Float.BYTES; - bb.putFloat(baseAddr, fog.red()); + bb.putFloat(baseAddr, fogColor[0]); baseAddr += Float.BYTES; - bb.putFloat(baseAddr, fog.green()); + bb.putFloat(baseAddr, fogColor[1]); baseAddr += Float.BYTES; - bb.putFloat(baseAddr, fog.blue()); + bb.putFloat(baseAddr, fogColor[2]); baseAddr += Float.BYTES; - bb.putFloat(baseAddr, fog.alpha()); + bb.putFloat(baseAddr, fogColor[3]); baseAddr += Float.BYTES; - bb.putInt(baseAddr, fog.shape().getId()); + bb.putInt(baseAddr, fogShape.getId()); baseAddr += Integer.BYTES; bb.putInt(baseAddr, world.getDimensionEffects().getSkyType().ordinal()); baseAddr += Integer.BYTES; diff --git a/src/main/java/com/radiance/client/proxy/vulkan/RendererProxy.java b/src/main/java/com/radiance/client/proxy/vulkan/RendererProxy.java index 428a5dc..b4f0823 100644 --- a/src/main/java/com/radiance/client/proxy/vulkan/RendererProxy.java +++ b/src/main/java/com/radiance/client/proxy/vulkan/RendererProxy.java @@ -40,9 +40,24 @@ public static void bindOverlayPipeline(int type) { pipelineType = type; } + public static boolean hasOverlayPipeline() { + return pipelineType >= 0; + } + + public static int getOverlayPipelineType() { + return pipelineType; + } + public static native void drawOverlay(int vertexId, int indexId, int pipelineType, int indexCount, int indexType); + public static void drawOverlay(BufferProxy.VertexIndexBufferHandle handle, int indexCount, + int pipelineType, + VertexFormat.IndexType indexType) { + drawOverlay(handle.vertexId, handle.indexId, pipelineType, indexCount, + Constants.IndexTypes.getValue(indexType)); + } + public static void drawOverlay(BufferProxy.VertexIndexBufferHandle handle, int indexCount, VertexFormat.IndexType indexType) { drawOverlay(handle.vertexId, handle.indexId, pipelineType, indexCount, diff --git a/src/main/java/com/radiance/client/proxy/world/ChunkProxy.java b/src/main/java/com/radiance/client/proxy/world/ChunkProxy.java index e839e70..e7e7fe4 100644 --- a/src/main/java/com/radiance/client/proxy/world/ChunkProxy.java +++ b/src/main/java/com/radiance/client/proxy/world/ChunkProxy.java @@ -3,11 +3,12 @@ import static net.minecraft.client.render.VertexFormat.DrawMode.QUADS; import static org.lwjgl.system.MemoryUtil.memAddress; -import com.mojang.blaze3d.systems.VertexSorter; import com.radiance.client.constant.Constants; import com.radiance.client.proxy.vulkan.BufferProxy; +import com.radiance.client.vertex.PBRVertexConsumer; import com.radiance.mixin_related.extensions.vulkan_render_integration.IChunkBuilderBuiltChunkExt; import com.radiance.mixin_related.extensions.vulkan_render_integration.IChunkBuilderExt; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; @@ -18,22 +19,29 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BuiltBuffer; +import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.Camera; import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.chunk.BlockBufferAllocatorStorage; +import net.minecraft.client.render.RenderLayers; +import net.minecraft.client.render.block.BlockModelRenderer; +import net.minecraft.client.render.block.BlockRenderManager; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.chunk.ChunkBuilder; +import net.minecraft.client.render.chunk.ChunkOcclusionDataBuilder; import net.minecraft.client.render.chunk.ChunkRendererRegion; import net.minecraft.client.render.chunk.ChunkRendererRegionBuilder; -import net.minecraft.client.render.chunk.SectionBuilder; import net.minecraft.client.texture.MissingSprite; import net.minecraft.client.texture.TextureManager; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.fluid.FluidState; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkSectionPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; import org.lwjgl.system.MemoryUtil; public class ChunkProxy { @@ -49,25 +57,27 @@ public boolean isVisibleThrough(Direction from, Direction to) { public boolean isVisibleThrough(Direction from, Direction to) { return false; } + + @Override + public boolean isEmpty(RenderLayer layer) { + return true; + } }; - private static final Map rebuildQueue = new ConcurrentHashMap<>(); + private static final Map rebuildQueue = + new ConcurrentHashMap<>(); private static final List> rebuildTasks = new ArrayList<>(); - private static final int numNormalChunkRebuildThreads = 1; - private static final int numImportantChunkRebuildThreads = 1; - private static final ExecutorService - importantChunkRebuildExecutor = - Executors.newFixedThreadPool(numImportantChunkRebuildThreads, r -> { - Thread thread = new Thread(r); + private static final int NUM_NORMAL_CHUNK_REBUILD_THREADS = 1; + private static final int NUM_IMPORTANT_CHUNK_REBUILD_THREADS = 1; + private static final ExecutorService IMPORTANT_CHUNK_REBUILD_EXECUTOR = + Executors.newFixedThreadPool(NUM_IMPORTANT_CHUNK_REBUILD_THREADS, runnable -> { + Thread thread = new Thread(runnable); thread.setPriority(Thread.NORM_PRIORITY); return thread; }); - private static final ThreadLocal - blockBufferAllocatorStorageThreadLocal = - ThreadLocal.withInitial(BlockBufferAllocatorStorage::new); public static int builtChunkNum = 0; - private static ExecutorService backgroundChunkRebuildExecutor = Executors.newFixedThreadPool( - numNormalChunkRebuildThreads, r -> { - Thread thread = new Thread(r); + private static ExecutorService backgroundChunkRebuildExecutor = + Executors.newFixedThreadPool(NUM_NORMAL_CHUNK_REBUILD_THREADS, runnable -> { + Thread thread = new Thread(runnable); thread.setPriority(Thread.NORM_PRIORITY); return thread; }); @@ -79,24 +89,26 @@ public static void init(int numChunks) { initNative(numChunks); } - public static AutoCloseable scopedBlockBufferAllocatorStorage() { - final BlockBufferAllocatorStorage s = blockBufferAllocatorStorageThreadLocal.get(); - s.reset(); - return s::clear; + public static AutoCloseable scopedBlockBufferStorage() { + return () -> { + }; } public static void clear() { waitImportantChunkRebuild(); + builtChunkNum = 0; backgroundChunkRebuildExecutor.shutdown(); try { backgroundChunkRebuildExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new RuntimeException(e); } - backgroundChunkRebuildExecutor = Executors.newFixedThreadPool(numNormalChunkRebuildThreads, - r -> { - Thread thread = new Thread(r); + + backgroundChunkRebuildExecutor = + Executors.newFixedThreadPool(NUM_NORMAL_CHUNK_REBUILD_THREADS, runnable -> { + Thread thread = new Thread(runnable); thread.setPriority(Thread.NORM_PRIORITY); return thread; }); @@ -110,29 +122,23 @@ public static void enqueueRebuild(ChunkBuilder.BuiltChunk chunk) { } public static void rebuild(Camera camera) { - BlockPos blockPos = camera.getBlockPos(); for (ChunkBuilder.BuiltChunk builtChunk : rebuildQueue.values()) { - if (builtChunk.needsRebuild() && builtChunk.shouldBuild()) { - builtChunk.cancelRebuild(); - - BlockPos - chunkCenterPos = - builtChunk.getOrigin() - .add(8, 8, 8); - boolean isImportant = chunkCenterPos.getSquaredDistance(blockPos) < 768.0 - || builtChunk.needsImportantRebuild(); - - if (isImportant) { - Future rebuildTask = importantChunkRebuildExecutor.submit(() -> { - rebuildSingle(builtChunk, true); - }); - rebuildTasks.add(rebuildTask); - } else { - backgroundChunkRebuildExecutor.execute(() -> { - rebuildSingle(builtChunk, false); - }); - } + if (!builtChunk.needsRebuild() || !builtChunk.shouldBuild()) { + continue; + } + + builtChunk.cancelRebuild(); + BlockPos chunkCenterPos = builtChunk.getOrigin().add(8, 8, 8); + boolean isImportant = chunkCenterPos.getSquaredDistance(blockPos) < 768.0 + || builtChunk.needsImportantRebuild(); + + if (isImportant) { + Future rebuildTask = IMPORTANT_CHUNK_REBUILD_EXECUTOR.submit( + () -> rebuildSingle(builtChunk, true)); + rebuildTasks.add(rebuildTask); + } else { + backgroundChunkRebuildExecutor.execute(() -> rebuildSingle(builtChunk, false)); } } @@ -147,7 +153,10 @@ public static void waitImportantChunkRebuild() { for (Future rebuildTask : rebuildTasks) { try { rebuildTask.get(); - } catch (InterruptedException | ExecutionException e) { + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException(e); + } catch (ExecutionException e) { throw new RuntimeException(e); } } @@ -156,238 +165,246 @@ public static void waitImportantChunkRebuild() { } private static void rebuildSingle(ChunkBuilder.BuiltChunk builtChunk, boolean important) { - try (var scope = scopedBlockBufferAllocatorStorage()) { - ChunkRendererRegionBuilder chunkRendererRegionBuilder = new ChunkRendererRegionBuilder(); - IChunkBuilderBuiltChunkExt builtChunkExt = (IChunkBuilderBuiltChunkExt) builtChunk; + try (var ignored = scopedBlockBufferStorage()) { + IChunkBuilderBuiltChunkExt builtChunkExt = + (IChunkBuilderBuiltChunkExt) builtChunk; ChunkBuilder chunkBuilder = builtChunkExt.radiance$getChunkBuilder(); - IChunkBuilderExt chunkBuilderExt = (IChunkBuilderExt) chunkBuilder; - ChunkRendererRegion - chunkRendererRegion = - chunkRendererRegionBuilder.build(chunkBuilderExt.radiance$getWorld(), - ChunkSectionPos.from(builtChunk.getSectionPos())); - - if (chunkRendererRegion == null) { + ChunkRendererRegionBuilder regionBuilder = new ChunkRendererRegionBuilder(); + BlockPos origin = builtChunk.getOrigin(); + ChunkRendererRegion region = regionBuilder.build( + ((IChunkBuilderExt) chunkBuilder).radiance$getWorld(), + origin.add(-1, -1, -1), + origin.add(16, 16, 16), + 1); + + if (region == null) { invalidateSingle(builtChunk.index); builtChunk.data.set(ChunkBuilder.ChunkData.EMPTY); return; } - BlockBufferAllocatorStorage storage = blockBufferAllocatorStorageThreadLocal.get(); - rebuildSingle(chunkRendererRegion, chunkBuilder, chunkBuilderExt, builtChunk, storage, - important); + rebuildSingle(region, builtChunk, important); } catch (Exception e) { throw new RuntimeException(e); } } - private static void rebuildSingle(ChunkRendererRegion chunkRendererRegion, - ChunkBuilder chunkBuilder, - IChunkBuilderExt chunkBuilderExt, + private static void rebuildSingle(ChunkRendererRegion region, ChunkBuilder.BuiltChunk builtChunk, - BlockBufferAllocatorStorage storage, boolean important) { + BlockPos startPos = builtChunk.getOrigin(); + BlockPos endPos = startPos.add(15, 15, 15); + ChunkOcclusionDataBuilder occlusionBuilder = new ChunkOcclusionDataBuilder(); + MatrixStack matrixStack = new MatrixStack(); + Map builders = + new Reference2ObjectArrayMap<>(RenderLayer.getBlockLayers().size()); + List blockEntities = new ArrayList<>(); + List noCullingBlockEntities = new ArrayList<>(); + Random random = Random.create(); + BlockModelRenderer.enableBrightnessCache(); - ChunkSectionPos chunkSectionPos = ChunkSectionPos.from(builtChunk.getOrigin()); - - Vec3d vec3d = chunkBuilder.getCameraPosition(); - // TODO: cancel out the sort operation in section builder - VertexSorter - vertexSorter = - VertexSorter.byDistance((float) (vec3d.x - builtChunk.getOrigin() - .getX()), - (float) (vec3d.y - builtChunk.getOrigin() - .getY()), - (float) (vec3d.z - builtChunk.getOrigin() - .getZ())); - - SectionBuilder.RenderData renderData; - synchronized (ChunkBuilder.class) { - renderData = - ((IChunkBuilderExt) chunkBuilder).radiance$getSectionBuilder() - .build(chunkSectionPos, chunkRendererRegion, vertexSorter, storage); - } + try { + BlockRenderManager blockRenderManager = + MinecraftClient.getInstance().getBlockRenderManager(); - Map buffers = renderData.buffers; - builtChunk.setNoCullingBlockEntities(renderData.noCullingBlockEntities); + for (BlockPos blockPos : BlockPos.iterate(startPos, endPos)) { + BlockState blockState = region.getBlockState(blockPos); + if (blockState.isOpaqueFullCube(region, blockPos)) { + occlusionBuilder.markClosed(blockPos); + } - if (buffers.isEmpty()) { - ChunkBuilder.ChunkData chunkData = new ChunkBuilder.ChunkData() { - @Override - public List getBlockEntities() { - return renderData.blockEntities; + if (blockState.hasBlockEntity()) { + BlockEntity blockEntity = region.getBlockEntity(blockPos); + if (blockEntity != null) { + blockEntities.add(blockEntity); + BlockEntityRenderer renderer = + MinecraftClient.getInstance() + .getBlockEntityRenderDispatcher() + .get(blockEntity); + if (renderer != null && renderer.rendersOutsideBoundingBox(blockEntity)) { + noCullingBlockEntities.add(blockEntity); + } + } } - @Override - public boolean isVisibleThrough(Direction from, Direction to) { - return renderData.chunkOcclusionData.isVisibleThrough(from, to); + FluidState fluidState = blockState.getFluidState(); + if (!fluidState.isEmpty()) { + RenderLayer renderLayer = RenderLayers.getFluidLayer(fluidState); + PBRVertexConsumer consumer = beginBufferBuilding(builders, renderLayer); + blockRenderManager.renderFluid(blockPos, region, consumer, blockState, + fluidState); } - @Override - public boolean isEmpty(RenderLayer layer) { - return true; + if (blockState.getRenderType() == BlockRenderType.MODEL) { + RenderLayer renderLayer = RenderLayers.getBlockLayer(blockState); + PBRVertexConsumer consumer = beginBufferBuilding(builders, renderLayer); + matrixStack.push(); + matrixStack.translate(blockPos.getX() & 15, blockPos.getY() & 15, + blockPos.getZ() & 15); + blockRenderManager.renderBlock(blockState, blockPos, region, matrixStack, + consumer, true, random); + matrixStack.pop(); } - }; - builtChunk.data.set(chunkData); - builtChunkNum++; + } + } finally { + BlockModelRenderer.disableBrightnessCache(); + } - invalidateSingle(builtChunk.index); - } else { + Map buffers = + new Reference2ObjectArrayMap<>(builders.size()); + for (Map.Entry entry : builders.entrySet()) { + BufferBuilder.BuiltBuffer builtBuffer = entry.getValue().endNullable(); + if (builtBuffer != null && !builtBuffer.isEmpty()) { + buffers.put(entry.getKey(), builtBuffer); + } + } + + ((IChunkBuilderBuiltChunkExt) builtChunk).radiance$setNoCullingBlockEntities( + noCullingBlockEntities); + + if (buffers.isEmpty()) { ChunkBuilder.ChunkData chunkData = new ChunkBuilder.ChunkData() { @Override public List getBlockEntities() { - return renderData.blockEntities; + return blockEntities; } @Override public boolean isVisibleThrough(Direction from, Direction to) { - return renderData.chunkOcclusionData.isVisibleThrough(from, to); + return occlusionBuilder.build().isVisibleThrough(from, to); } @Override public boolean isEmpty(RenderLayer layer) { - return false; + return true; } }; builtChunk.data.set(chunkData); builtChunkNum++; + invalidateSingle(builtChunk.index); + return; + } - ByteBuffer geometryTypeBB = null; - ByteBuffer geometryGroupNameBB = null; - ByteBuffer geometryTextureBB = null; - ByteBuffer vertexFormatBB = null; - ByteBuffer vertexCountBB = null; - ByteBuffer verticesBB = null; - List geometryGroupNameBuffers = new ArrayList<>(buffers.size()); + ChunkBuilder.ChunkData chunkData = new ChunkBuilder.ChunkData() { + @Override + public List getBlockEntities() { + return blockEntities; + } - try { - int geometryTypeSize = buffers.size() * Integer.BYTES; - geometryTypeBB = MemoryUtil.memAlloc(geometryTypeSize); - long geometryTypeAddr = memAddress(geometryTypeBB); - int geometryTypeBaseAddr = 0; - - int geometryGroupNameSize = buffers.size() * Long.BYTES; - geometryGroupNameBB = MemoryUtil.memAlloc(geometryGroupNameSize); - long geometryGroupNameAddr = memAddress(geometryGroupNameBB); - int geometryGroupNameBaseAddr = 0; - - int geometryTextureSize = buffers.size() * Integer.BYTES; - geometryTextureBB = MemoryUtil.memAlloc(geometryTextureSize); - long geometryTextureAddr = memAddress(geometryTextureBB); - int geometryTextureBaseAddr = 0; - - int vertexFormatSize = buffers.size() * Integer.BYTES; - vertexFormatBB = MemoryUtil.memAlloc(vertexFormatSize); - long vertexFormatAddr = memAddress(vertexFormatBB); - int vertexFormatBaseAddr = 0; - - int vertexCountSize = buffers.size() * Integer.BYTES; - vertexCountBB = MemoryUtil.memAlloc(vertexCountSize); - long vertexCountAddr = memAddress(vertexCountBB); - int vertexCountBaseAddr = 0; - - int verticesSize = buffers.size() * Long.BYTES; - verticesBB = MemoryUtil.memAlloc(verticesSize); - long verticesAddr = memAddress(verticesBB); - int verticesBaseAddr = 0; - - for (Map.Entry entry : buffers.entrySet()) { - RenderLayer renderLayer = entry.getKey(); - assert renderLayer.getDrawMode() == QUADS; - - BuiltBuffer vertexBuffer = entry.getValue(); - BufferProxy.BufferInfo vertexBufferInfo = BufferProxy.getBufferInfo( - vertexBuffer.getBuffer()); - assert vertexBuffer.getDrawParameters() - .indexCount() == vertexBuffer.getDrawParameters() - .vertexCount() / 4 * 6; - - TextureManager - textureManager = - MinecraftClient.getInstance() - .getTextureManager(); - - int - geometryTypeID = - Constants.GeometryTypes.getGeometryType(renderLayer, true) - .getValue(); - int - geometryTextureID = - textureManager.getTexture( - ((RenderLayer.MultiPhase) renderLayer).phases.texture.getId() - .orElse(MissingSprite.getMissingSpriteId())) - .getGlId(); - int vertexFormatID = Constants.VertexFormats.getValue( - vertexBuffer.getDrawParameters() - .format()); - - geometryTypeBB.putInt(geometryTypeBaseAddr, geometryTypeID); - geometryTypeBaseAddr += Integer.BYTES; - - ByteBuffer geometryGroupNameBuffer = MemoryUtil.memUTF8(renderLayer.name, true); - geometryGroupNameBuffers.add(geometryGroupNameBuffer); - geometryGroupNameBB.putLong(geometryGroupNameBaseAddr, - memAddress(geometryGroupNameBuffer)); - geometryGroupNameBaseAddr += Long.BYTES; - - geometryTextureBB.putInt(geometryTextureBaseAddr, geometryTextureID); - geometryTextureBaseAddr += Integer.BYTES; - - vertexFormatBB.putInt(vertexFormatBaseAddr, vertexFormatID); - vertexFormatBaseAddr += Integer.BYTES; - - vertexCountBB.putInt(vertexCountBaseAddr, - vertexBuffer.getDrawParameters() - .vertexCount()); - vertexCountBaseAddr += Integer.BYTES; - - verticesBB.putLong(verticesBaseAddr, vertexBufferInfo.addr()); - verticesBaseAddr += Long.BYTES; - } + @Override + public boolean isVisibleThrough(Direction from, Direction to) { + return occlusionBuilder.build().isVisibleThrough(from, to); + } - rebuildSingle(builtChunk.getOrigin() - .getX(), - builtChunk.getOrigin() - .getY(), - builtChunk.getOrigin() - .getZ(), - builtChunk.index, - buffers.size(), - geometryTypeAddr, - geometryGroupNameAddr, - geometryTextureAddr, - vertexFormatAddr, - vertexCountAddr, - verticesAddr, - important); - } finally { - if (geometryTypeBB != null) { - MemoryUtil.memFree(geometryTypeBB); - } - if (geometryGroupNameBB != null) { - MemoryUtil.memFree(geometryGroupNameBB); - } - if (geometryTextureBB != null) { - MemoryUtil.memFree(geometryTextureBB); - } - if (vertexFormatBB != null) { - MemoryUtil.memFree(vertexFormatBB); - } - if (vertexCountBB != null) { - MemoryUtil.memFree(vertexCountBB); - } - if (verticesBB != null) { - MemoryUtil.memFree(verticesBB); - } - for (ByteBuffer geometryGroupNameBuffer : geometryGroupNameBuffers) { - MemoryUtil.memFree(geometryGroupNameBuffer); - } + @Override + public boolean isEmpty(RenderLayer layer) { + return !buffers.containsKey(layer); + } + }; + builtChunk.data.set(chunkData); + builtChunkNum++; + + ByteBuffer geometryTypeBuffer = null; + ByteBuffer geometryGroupNameBuffer = null; + ByteBuffer geometryTextureBuffer = null; + ByteBuffer vertexFormatBuffer = null; + ByteBuffer vertexCountBuffer = null; + ByteBuffer verticesBuffer = null; + List geometryGroupNameBuffers = new ArrayList<>(buffers.size()); + + try { + geometryTypeBuffer = MemoryUtil.memAlloc(buffers.size() * Integer.BYTES); + geometryGroupNameBuffer = MemoryUtil.memAlloc(buffers.size() * Long.BYTES); + geometryTextureBuffer = MemoryUtil.memAlloc(buffers.size() * Integer.BYTES); + vertexFormatBuffer = MemoryUtil.memAlloc(buffers.size() * Integer.BYTES); + vertexCountBuffer = MemoryUtil.memAlloc(buffers.size() * Integer.BYTES); + verticesBuffer = MemoryUtil.memAlloc(buffers.size() * Long.BYTES); + + int geometryTypeOffset = 0; + int geometryGroupNameOffset = 0; + int geometryTextureOffset = 0; + int vertexFormatOffset = 0; + int vertexCountOffset = 0; + int verticesOffset = 0; + TextureManager textureManager = MinecraftClient.getInstance().getTextureManager(); + + for (Map.Entry entry : buffers.entrySet()) { + RenderLayer renderLayer = entry.getKey(); + BufferBuilder.BuiltBuffer builtBuffer = entry.getValue(); + BufferBuilder.DrawParameters parameters = builtBuffer.getParameters(); + BufferProxy.BufferInfo bufferInfo = BufferProxy.getBufferInfo( + builtBuffer.getVertexBuffer()); + + int geometryTypeId = Constants.GeometryTypes.getGeometryType(renderLayer, true) + .getValue(); + int geometryTextureId = textureManager.getTexture( + renderLayer instanceof RenderLayer.MultiPhase multiPhase ? + multiPhase.phases.texture.getId().orElse(MissingSprite.getMissingSpriteId()) + : MissingSprite.getMissingSpriteId()).getGlId(); + int vertexFormatId = Constants.VertexFormats.getValue(parameters.format()); + + geometryTypeBuffer.putInt(geometryTypeOffset, geometryTypeId); + geometryTypeOffset += Integer.BYTES; + + ByteBuffer groupNameBuffer = MemoryUtil.memUTF8(renderLayer.name, true); + geometryGroupNameBuffers.add(groupNameBuffer); + geometryGroupNameBuffer.putLong(geometryGroupNameOffset, memAddress(groupNameBuffer)); + geometryGroupNameOffset += Long.BYTES; + + geometryTextureBuffer.putInt(geometryTextureOffset, geometryTextureId); + geometryTextureOffset += Integer.BYTES; + + vertexFormatBuffer.putInt(vertexFormatOffset, vertexFormatId); + vertexFormatOffset += Integer.BYTES; + + vertexCountBuffer.putInt(vertexCountOffset, parameters.vertexCount()); + vertexCountOffset += Integer.BYTES; + + verticesBuffer.putLong(verticesOffset, bufferInfo.addr()); + verticesOffset += Long.BYTES; + } + + rebuildSingle(startPos.getX(), startPos.getY(), startPos.getZ(), builtChunk.index, + buffers.size(), memAddress(geometryTypeBuffer), memAddress(geometryGroupNameBuffer), + memAddress(geometryTextureBuffer), memAddress(vertexFormatBuffer), + memAddress(vertexCountBuffer), memAddress(verticesBuffer), important); + } finally { + for (BufferBuilder.BuiltBuffer builtBuffer : buffers.values()) { + builtBuffer.release(); + } + if (geometryTypeBuffer != null) { + MemoryUtil.memFree(geometryTypeBuffer); + } + if (geometryGroupNameBuffer != null) { + MemoryUtil.memFree(geometryGroupNameBuffer); + } + if (geometryTextureBuffer != null) { + MemoryUtil.memFree(geometryTextureBuffer); + } + if (vertexFormatBuffer != null) { + MemoryUtil.memFree(vertexFormatBuffer); + } + if (vertexCountBuffer != null) { + MemoryUtil.memFree(vertexCountBuffer); + } + if (verticesBuffer != null) { + MemoryUtil.memFree(verticesBuffer); + } + for (ByteBuffer groupNameBuffer : geometryGroupNameBuffers) { + MemoryUtil.memFree(groupNameBuffer); } } + } - for (Map.Entry entry : buffers.entrySet()) { - entry.getValue() - .close(); + private static PBRVertexConsumer beginBufferBuilding( + Map builders, + RenderLayer layer) { + PBRVertexConsumer consumer = builders.get(layer); + if (consumer == null) { + consumer = new PBRVertexConsumer(layer); + builders.put(layer, consumer); } + return consumer; } private static native void rebuildSingle(int originX, diff --git a/src/main/java/com/radiance/client/proxy/world/EntityProxy.java b/src/main/java/com/radiance/client/proxy/world/EntityProxy.java index b82d78e..bc4c1db 100644 --- a/src/main/java/com/radiance/client/proxy/world/EntityProxy.java +++ b/src/main/java/com/radiance/client/proxy/world/EntityProxy.java @@ -1,92 +1,83 @@ package com.radiance.client.proxy.world; -import static net.minecraft.client.render.VertexFormat.DrawMode.LINES; import static net.minecraft.client.render.VertexFormat.DrawMode.LINE_STRIP; +import static net.minecraft.client.render.VertexFormat.DrawMode.LINES; import static net.minecraft.client.render.VertexFormat.DrawMode.QUADS; import static net.minecraft.client.render.VertexFormat.DrawMode.TRIANGLE_STRIP; import static org.lwjgl.system.MemoryUtil.memAddress; import com.radiance.client.constant.Constants; -import com.radiance.client.constant.Constants.RayTracingFlags; import com.radiance.client.proxy.vulkan.BufferProxy; import com.radiance.client.vertex.PBRVertexConsumer; import com.radiance.client.vertex.StorageVertexConsumerProvider; import com.radiance.mixin_related.extensions.vulkan_render_integration.IHeldItemRendererExt; -import com.radiance.mixin_related.extensions.vulkan_render_integration.IParticleManagerExt; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.Queue; import java.util.Set; import java.util.SortedSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Stream; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.hud.InGameOverlayRenderer; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleManager; -import net.minecraft.client.particle.ParticleTextureSheet; +import net.minecraft.client.render.BlockBreakingInfo; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.BufferBuilderStorage; -import net.minecraft.client.render.BuiltBuffer; import net.minecraft.client.render.BuiltChunkStorage; import net.minecraft.client.render.Camera; -import net.minecraft.client.render.Frustum; import net.minecraft.client.render.OverlayVertexConsumer; import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderTickCounter; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumers; -import net.minecraft.client.render.VertexRendering; -import net.minecraft.client.render.WeatherRendering; -import net.minecraft.client.render.WorldBorderRendering; -import net.minecraft.client.render.block.BlockRenderManager; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.chunk.ChunkBuilder; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.item.HeldItemRenderer; -import net.minecraft.client.render.model.ModelBaker; +import net.minecraft.client.render.model.ModelLoader; import net.minecraft.client.texture.MissingSprite; import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.BlockBreakingInfo; import net.minecraft.entity.projectile.FishingBobberEntity; -import net.minecraft.util.Colors; -import net.minecraft.util.Identifier; -import net.minecraft.util.Pair; -import net.minecraft.util.crash.CrashException; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.GameMode; -import net.minecraft.world.tick.TickManager; import org.lwjgl.system.MemoryUtil; -public class EntityProxy { +public final class EntityProxy { public static final ConcurrentMap, AtomicInteger> PARTICLE_COUNTERS = new ConcurrentHashMap<>(); + private static final int WORLD_ENTITY_BUFFER_SIZE = 16 * 1024; - private static final Identifier SUN_TEXTURE = Identifier.ofVanilla( - "textures/environment/sun.png"); - private static final Identifier MOON_PHASES_TEXTURE = Identifier.ofVanilla( - "textures/environment/moon_phases.png"); + private EntityProxy() { + } + + private static native void queueBuild(float lineWidth, + int coordinate, + boolean normalOffset, + int size, + long entityHashCodes, + long entityPosXs, + long entityPosYs, + long entityPosZs, + long entityRTFlags, + long entityPrebuiltBLASs, + long entityPosts, + long entityLayerCounts, + long geometryTypes, + long geometryGroupNames, + long geometryTextures, + long vertexFormats, + long indexFormats, + long vertexCounts, + long vertices); public static void processWorldEntityRenderData( StorageVertexConsumerProvider storageVertexConsumerProvider, @@ -97,35 +88,8 @@ public static void processWorldEntityRenderData( Constants.RayTracingFlags rtFlag, boolean reflect, EntityRenderDataList entityRenderDataList) { - processEntityRenderData(storageVertexConsumerProvider, - hashCode, - entityPosX, - entityPosY, - entityPosZ, - rtFlag.getValue(), - -1, - reflect, - false, - entityRenderDataList); - } - - public static void processPostEntityRenderData( - StorageVertexConsumerProvider storageVertexConsumerProvider, - int hashCode, - double entityPosX, - double entityPosY, - double entityPosZ, - EntityRenderDataList entityRenderDataList) { - processEntityRenderData(storageVertexConsumerProvider, - hashCode, - entityPosX, - entityPosY, - entityPosZ, - 0, - -1, - false, - true, - entityRenderDataList); + processEntityRenderData(storageVertexConsumerProvider, hashCode, entityPosX, entityPosY, + entityPosZ, rtFlag.getValue(), -1, reflect, false, entityRenderDataList); } private static void processEntityRenderData( @@ -140,19 +104,12 @@ private static void processEntityRenderData( boolean post, EntityRenderDataList entityRenderDataList) { Map layerBuffers = storageVertexConsumerProvider.getLayers(); - EntityRenderData - entityRenderData = - new EntityRenderData(hashCode, entityPosX, entityPosY, - entityPosZ, - rtFlag, prebuiltBLAS, post); - EntityRenderData - waterMaskRenderData = - new EntityRenderData(hashCode, entityPosX, entityPosY, - entityPosZ, - RayTracingFlags.BOAT_WATER_MASK.getValue(), prebuiltBLAS, post); + EntityRenderData entityRenderData = new EntityRenderData(hashCode, entityPosX, entityPosY, + entityPosZ, rtFlag, prebuiltBLAS, post); + for (Map.Entry layerBuffer : layerBuffers.entrySet()) { RenderLayer layer = layerBuffer.getKey(); - BuiltBuffer buffer = null; + BufferBuilder.BuiltBuffer buffer = null; VertexConsumer vertexConsumer = layerBuffer.getValue(); if (vertexConsumer instanceof BufferBuilder bufferBuilder) { @@ -162,313 +119,131 @@ private static void processEntityRenderData( } if (layer.getDrawMode() != QUADS && layer.getDrawMode() != TRIANGLE_STRIP - && layer.getDrawMode() != LINE_STRIP && - layer.getDrawMode() != LINES) { + && layer.getDrawMode() != LINE_STRIP && layer.getDrawMode() != LINES) { continue; } - if (buffer == null) { + if (buffer == null || buffer.isEmpty()) { continue; } - if (layer.name.contains("water_mask")) { - waterMaskRenderData.add(new EntityRenderLayer(layer, buffer, reflect)); - } else { - entityRenderData.add(new EntityRenderLayer(layer, buffer, reflect)); - } + entityRenderData.add(new EntityRenderLayer(layer, buffer, reflect)); } if (!entityRenderData.isEmpty()) { entityRenderDataList.add(entityRenderData); } - if (!waterMaskRenderData.isEmpty()) { - entityRenderDataList.add(waterMaskRenderData); - } - } - public static void queueEntitiesBuild(Camera camera, - List renderedEntities, - EntityRenderDispatcher entityRenderDispatcher, - RenderTickCounter tickCounter, - boolean canDrawEntityOutlines) { + public static void queueEntitiesBuild(Camera camera, List renderedEntities, + EntityRenderDispatcher entityRenderDispatcher, float tickDelta) { MatrixStack matrixStack = new MatrixStack(); - - MinecraftClient client = MinecraftClient.getInstance(); - TickManager - tickManager = - Objects.requireNonNull(client.world) - .getTickManager(); - - List entityStorageVertexConsumerProviders = new ArrayList<>(); + List storageVertexConsumerProviders = new ArrayList<>(); EntityRenderDataList entityRenderDataList = new EntityRenderDataList(); - for (Entity entity : renderedEntities) { + for (Entity entity : renderedEntities) { if (entity.age == 0) { entity.lastRenderX = entity.getX(); entity.lastRenderY = entity.getY(); entity.lastRenderZ = entity.getZ(); } - StorageVertexConsumerProvider entityStorageVertexConsumerProvider = new StorageVertexConsumerProvider( - 786432); - entityStorageVertexConsumerProviders.add(entityStorageVertexConsumerProvider); - - VertexConsumerProvider vertexConsumerProvider; - if (canDrawEntityOutlines && client.hasOutline(entity)) { -// TODO: add outline -// StorageOutlineVertexConsumerProvider -// outlineVertexConsumerProvider = -// new StorageOutlineVertexConsumerProvider(entityStorageVertexConsumerProvider); -// vertexConsumerProvider = outlineVertexConsumerProvider; -// int color = entity.getTeamColorValue(); -// outlineVertexConsumerProvider.setColor(ColorHelper.getRed(color), -// ColorHelper.getGreen(color), -// ColorHelper.getBlue(color), -// 255); - vertexConsumerProvider = entityStorageVertexConsumerProvider; - } else { - vertexConsumerProvider = entityStorageVertexConsumerProvider; - } + StorageVertexConsumerProvider storageVertexConsumerProvider = + new StorageVertexConsumerProvider(WORLD_ENTITY_BUFFER_SIZE); + storageVertexConsumerProviders.add(storageVertexConsumerProvider); - float tickDelta = tickCounter.getTickDelta(!tickManager.shouldSkipTick(entity)); - double entityPosX = MathHelper.lerp(tickDelta, entity.lastRenderX, - entity.getX()); - double entityPosY = MathHelper.lerp(tickDelta, entity.lastRenderY, - entity.getY()); - double entityPosZ = MathHelper.lerp(tickDelta, entity.lastRenderZ, - entity.getZ()); - - entityRenderDispatcher.render(entity, - 0, - 0, - 0, - tickDelta, - matrixStack, - vertexConsumerProvider, + double entityPosX = MathHelper.lerp(tickDelta, entity.lastRenderX, entity.getX()); + double entityPosY = MathHelper.lerp(tickDelta, entity.lastRenderY, entity.getY()); + double entityPosZ = MathHelper.lerp(tickDelta, entity.lastRenderZ, entity.getZ()); + + entityRenderDispatcher.render(entity, 0.0, 0.0, 0.0, entity.getYaw(tickDelta), + tickDelta, matrixStack, storageVertexConsumerProvider, entityRenderDispatcher.getLight(entity, tickDelta)); if (entity.equals(camera.getFocusedEntity())) { - processWorldEntityRenderData(entityStorageVertexConsumerProvider, - System.identityHashCode(entity), - entityPosX, - entityPosY, - entityPosZ, - Constants.RayTracingFlags.PLAYER, - true, - entityRenderDataList); + processWorldEntityRenderData(storageVertexConsumerProvider, + System.identityHashCode(entity), entityPosX, entityPosY, entityPosZ, + Constants.RayTracingFlags.PLAYER, true, entityRenderDataList); } else if (entity instanceof FishingBobberEntity) { - processWorldEntityRenderData(entityStorageVertexConsumerProvider, - System.identityHashCode(entity), - entityPosX, - entityPosY, - entityPosZ, - Constants.RayTracingFlags.FISHING_BOBBER, - true, - entityRenderDataList); + processWorldEntityRenderData(storageVertexConsumerProvider, + System.identityHashCode(entity), entityPosX, entityPosY, entityPosZ, + Constants.RayTracingFlags.FISHING_BOBBER, true, entityRenderDataList); } else { - processWorldEntityRenderData(entityStorageVertexConsumerProvider, - System.identityHashCode(entity), - entityPosX, - entityPosY, - entityPosZ, - Constants.RayTracingFlags.WORLD, - true, - entityRenderDataList); + processWorldEntityRenderData(storageVertexConsumerProvider, + System.identityHashCode(entity), entityPosX, entityPosY, entityPosZ, + Constants.RayTracingFlags.WORLD, true, entityRenderDataList); } } - queueBuild(entityStorageVertexConsumerProviders, entityRenderDataList); + queueBuild(storageVertexConsumerProviders, entityRenderDataList, 0.0125f, + Constants.Coordinates.WORLD, false); } - public static synchronized Pair, EntityRenderDataList> queueBlockEntitiesRebuild( - BuiltChunkStorage chunks, + public static void queueBlockEntitiesBuild(BuiltChunkStorage chunks, Set noCullingBlockEntities, Long2ObjectMap> blockBreakingProgressions, - BlockEntityRenderDispatcher blockEntityRenderDispatcher, - float tickDelta) { + BlockEntityRenderDispatcher blockEntityRenderDispatcher, float tickDelta) { MatrixStack matrixStack = new MatrixStack(); - List entityStorageVertexConsumerProviders = new ArrayList<>(); + List storageVertexConsumerProviders = new ArrayList<>(); EntityRenderDataList entityRenderDataList = new EntityRenderDataList(); - List crumblingStorageVertexConsumerProviders = new ArrayList<>(); - EntityRenderDataList crumblingRenderDataList = new EntityRenderDataList(); for (ChunkBuilder.BuiltChunk builtChunk : chunks.chunks) { - List - list = - builtChunk.getData() - .getBlockEntities(); - if (!list.isEmpty()) { - for (BlockEntity blockEntity : list) { - StorageVertexConsumerProvider entityStorageVertexConsumerProvider = new StorageVertexConsumerProvider( - 786432); - entityStorageVertexConsumerProviders.add(entityStorageVertexConsumerProvider); - StorageVertexConsumerProvider crumblingStorageVertexConsumerProvider = new StorageVertexConsumerProvider( - 0); - crumblingStorageVertexConsumerProviders.add( - crumblingStorageVertexConsumerProvider); - - VertexConsumerProvider vertexConsumerProvider = entityStorageVertexConsumerProvider; - - BlockPos blockPos = blockEntity.getPos(); - double entityPosX = blockPos.getX(); - double entityPosY = blockPos.getY(); - double entityPosZ = blockPos.getZ(); - - matrixStack.push(); - SortedSet sortedSet = blockBreakingProgressions.get( - blockPos.asLong()); - if (sortedSet != null && !sortedSet.isEmpty()) { - int - stage = - sortedSet.last() - .getStage(); - if (stage >= 0) { - MatrixStack.Entry entry = matrixStack.peek(); - VertexConsumer - vertexConsumer = - new OverlayVertexConsumer( - crumblingStorageVertexConsumerProvider.getBuffer( - ModelBaker.BLOCK_DESTRUCTION_RENDER_LAYERS.get( - stage)), entry, 1.0F); - vertexConsumerProvider = renderLayer -> { - VertexConsumer vertexConsumer2 = entityStorageVertexConsumerProvider.getBuffer( - renderLayer); - return renderLayer.hasCrumbling() ? VertexConsumers.union( - vertexConsumer, - vertexConsumer2) : - vertexConsumer2; - }; - } - } + List blockEntities = builtChunk.getData().getBlockEntities(); + if (blockEntities.isEmpty()) { + continue; + } - blockEntityRenderDispatcher.render(blockEntity, tickDelta, matrixStack, - vertexConsumerProvider); - matrixStack.pop(); - - processWorldEntityRenderData(entityStorageVertexConsumerProvider, - System.identityHashCode(blockEntity), - entityPosX, - entityPosY, - entityPosZ, - Constants.RayTracingFlags.WORLD, - true, - entityRenderDataList); - processWorldEntityRenderData(crumblingStorageVertexConsumerProvider, - System.identityHashCode(blockEntity) + 1, - entityPosX, - entityPosY, - entityPosZ, - Constants.RayTracingFlags.WORLD, - true, - crumblingRenderDataList); + for (BlockEntity blockEntity : blockEntities) { + StorageVertexConsumerProvider storageVertexConsumerProvider = + new StorageVertexConsumerProvider(WORLD_ENTITY_BUFFER_SIZE); + storageVertexConsumerProviders.add(storageVertexConsumerProvider); + + VertexConsumerProvider vertexConsumerProvider = storageVertexConsumerProvider; + BlockPos blockPos = blockEntity.getPos(); + SortedSet breakingInfos = + blockBreakingProgressions.get(blockPos.asLong()); + if (breakingInfos != null && !breakingInfos.isEmpty()) { + int stage = breakingInfos.last().getStage(); + if (stage >= 0) { + MatrixStack.Entry entry = matrixStack.peek(); + VertexConsumer crumbling = new OverlayVertexConsumer( + storageVertexConsumerProvider.getBuffer( + ModelLoader.BLOCK_DESTRUCTION_RENDER_LAYERS.get(stage)), + entry.getPositionMatrix(), entry.getNormalMatrix(), 1.0F); + vertexConsumerProvider = renderLayer -> { + VertexConsumer base = storageVertexConsumerProvider.getBuffer(renderLayer); + if (renderLayer.hasCrumbling()) { + return VertexConsumers.union(crumbling, base); + } + return base; + }; + } } + + blockEntityRenderDispatcher.render(blockEntity, tickDelta, matrixStack, + vertexConsumerProvider); + + processWorldEntityRenderData(storageVertexConsumerProvider, + System.identityHashCode(blockEntity), blockPos.getX(), blockPos.getY(), + blockPos.getZ(), Constants.RayTracingFlags.WORLD, true, entityRenderDataList); } } for (BlockEntity blockEntity : noCullingBlockEntities) { - StorageVertexConsumerProvider entityStorageVertexConsumerProvider = new StorageVertexConsumerProvider( - 786432); - entityStorageVertexConsumerProviders.add(entityStorageVertexConsumerProvider); + StorageVertexConsumerProvider storageVertexConsumerProvider = + new StorageVertexConsumerProvider(WORLD_ENTITY_BUFFER_SIZE); + storageVertexConsumerProviders.add(storageVertexConsumerProvider); - BlockPos blockPos = blockEntity.getPos(); - double entityPosX = blockPos.getX(); - double entityPosY = blockPos.getY(); - double entityPosZ = blockPos.getZ(); - - matrixStack.push(); blockEntityRenderDispatcher.render(blockEntity, tickDelta, matrixStack, - entityStorageVertexConsumerProvider); - matrixStack.pop(); - - processWorldEntityRenderData(entityStorageVertexConsumerProvider, - System.identityHashCode(blockEntity), - entityPosX, - entityPosY, - entityPosZ, - Constants.RayTracingFlags.WORLD, - true, - entityRenderDataList); - } - - queueBuild(entityStorageVertexConsumerProviders, entityRenderDataList); + storageVertexConsumerProvider); - return new Pair<>(crumblingStorageVertexConsumerProviders, crumblingRenderDataList); - } - - public static void queueCrumblingRebuild(Camera camera, - Long2ObjectMap> blockBreakingProgressions, - BlockRenderManager blockRenderManager, - ClientWorld world, - List crumblingStorageVertexConsumerProviders, - EntityRenderDataList crumblingRenderDataList) { - MatrixStack matrixStack = new MatrixStack(); - List blockCrumblingStorageVertexConsumerProviders = new ArrayList<>(); - EntityRenderDataList blockCrumblingRenderDataList = new EntityRenderDataList(); - - Vec3d vec3d = camera.getPos(); - double d = vec3d.getX(); - double e = vec3d.getY(); - double f = vec3d.getZ(); - - for (Long2ObjectMap.Entry> blockBreakingProgression : - blockBreakingProgressions.long2ObjectEntrySet()) { - BlockPos blockPos = BlockPos.fromLong(blockBreakingProgression.getLongKey()); - double entityPosX = blockPos.getX(); - double entityPosY = blockPos.getY(); - double entityPosZ = blockPos.getZ(); - - if (!(blockPos.getSquaredDistanceFromCenter(d, e, f) > 1024.0)) { - SortedSet sortedSet = blockBreakingProgression.getValue(); - if (sortedSet != null && !sortedSet.isEmpty()) { - int - stage = - sortedSet.last() - .getStage(); - - StorageVertexConsumerProvider blockCrumblingStorageVertexConsumerProvider = new StorageVertexConsumerProvider( - 786432); - blockCrumblingStorageVertexConsumerProviders.add( - blockCrumblingStorageVertexConsumerProvider); - - matrixStack.push(); - MatrixStack.Entry entry = matrixStack.peek(); - VertexConsumer - vertexConsumer = - new OverlayVertexConsumer( - blockCrumblingStorageVertexConsumerProvider.getBuffer( - ModelBaker.BLOCK_DESTRUCTION_RENDER_LAYERS.get( - stage)), entry, 1.0F); - blockRenderManager.renderDamage(world.getBlockState(blockPos), blockPos, world, - matrixStack, vertexConsumer); - matrixStack.pop(); - - processWorldEntityRenderData(blockCrumblingStorageVertexConsumerProvider, - 0, - entityPosX, - entityPosY, - entityPosZ, - Constants.RayTracingFlags.WORLD, - true, - blockCrumblingRenderDataList); - } - } + BlockPos blockPos = blockEntity.getPos(); + processWorldEntityRenderData(storageVertexConsumerProvider, + System.identityHashCode(blockEntity), blockPos.getX(), blockPos.getY(), + blockPos.getZ(), Constants.RayTracingFlags.WORLD, true, entityRenderDataList); } - List - storageVertexConsumerProviders = - Stream.concat(crumblingStorageVertexConsumerProviders.stream(), - blockCrumblingStorageVertexConsumerProviders.stream()) - .toList(); - - EntityRenderDataList - renderDataList = - Stream.concat(crumblingRenderDataList.stream(), blockCrumblingRenderDataList.stream()) - .collect(EntityRenderDataList::new, EntityRenderDataList::add, - EntityRenderDataList::addAll); - - queueBuild(storageVertexConsumerProviders, renderDataList, 0.0f, - Constants.Coordinates.WORLD, - true); + queueBuild(storageVertexConsumerProviders, entityRenderDataList, 0.0125f, + Constants.Coordinates.WORLD, false); } public static void queueHandRebuild(BufferBuilderStorage buffers, float tickDelta, @@ -478,227 +253,50 @@ public static void queueHandRebuild(BufferBuilderStorage buffers, float tickDelt List storageVertexConsumerProviders = new ArrayList<>(); EntityRenderDataList renderDataList = new EntityRenderDataList(); - StorageVertexConsumerProvider storageVertexConsumerProvider = new StorageVertexConsumerProvider( - 8192); + StorageVertexConsumerProvider storageVertexConsumerProvider = + new StorageVertexConsumerProvider(8192); storageVertexConsumerProviders.add(storageVertexConsumerProvider); matrixStack.push(); - boolean bl = client.getCameraEntity() instanceof LivingEntity - && ((LivingEntity) client.getCameraEntity()).isSleeping(); - if (client.options.getPerspective() - .isFirstPerson() && !bl && !client.options.hudHidden && - client.interactionManager.getCurrentGameMode() != GameMode.SPECTATOR) { + boolean sleeping = client.getCameraEntity() instanceof LivingEntity livingEntity + && livingEntity.isSleeping(); + if (client.options.getPerspective().isFirstPerson() && !sleeping + && !client.options.hudHidden + && client.interactionManager != null + && client.interactionManager.getCurrentGameMode() != GameMode.SPECTATOR + && client.player != null) { ((IHeldItemRendererExt) firstPersonRenderer).radiance$renderItem(tickDelta, - matrixStack, - storageVertexConsumerProvider, - client.player, - client.getEntityRenderDispatcher() - .getLight(client.player, tickDelta)); + matrixStack, storageVertexConsumerProvider, client.player, + client.getEntityRenderDispatcher().getLight(client.player, tickDelta)); processWorldEntityRenderData(storageVertexConsumerProvider, - System.identityHashCode(Constants.RayTracingFlags.HAND), - 0, - 0, - 0, - Constants.RayTracingFlags.HAND, - true, - renderDataList); + System.identityHashCode(Constants.RayTracingFlags.HAND), 0, 0, 0, + Constants.RayTracingFlags.HAND, true, renderDataList); queueBuild(storageVertexConsumerProviders, renderDataList, 0.0f, - Constants.Coordinates.CAMERA, - false); + Constants.Coordinates.CAMERA, false); } matrixStack.pop(); - if (client.options.getPerspective() - .isFirstPerson() && !bl) { - VertexConsumerProvider.Immediate immediate = buffers.getEntityVertexConsumers(); - InGameOverlayRenderer.renderOverlays(client, matrixStack, immediate); - immediate.draw(); - } - } - - public static void queueParticleRebuild(Camera camera, float tickDelta, Frustum frustum) { - List storageVertexConsumerProviders = new ArrayList<>(); - EntityRenderDataList renderDataList = new EntityRenderDataList(); - - StorageVertexConsumerProvider postStorageVertexConsumerProvider = new StorageVertexConsumerProvider( - 0); - storageVertexConsumerProviders.add(postStorageVertexConsumerProvider); - - ParticleManager particleManager = MinecraftClient.getInstance().particleManager; - IParticleManagerExt particleManagerExt = (IParticleManagerExt) particleManager; - Map> particles = particleManagerExt.radiance$getParticles(); - - for (ParticleTextureSheet particleTextureSheet : particleManagerExt.radiance$getTextureSheets()) { - Queue particleQueue = particles.get(particleTextureSheet); - if (particleQueue != null && !particleQueue.isEmpty()) { - for (Particle particle : particleQueue) { - - VertexConsumer - vertexConsumer = - postStorageVertexConsumerProvider.getBuffer( - Objects.requireNonNull( - particleTextureSheet.renderType())); - - try { - particle.render(vertexConsumer, camera, tickDelta); - } catch (Throwable var11) { - CrashReport crashReport = CrashReport.create(var11, "Rendering Particle"); - CrashReportSection crashReportSection = crashReport.addElement( - "Particle being rendered"); - crashReportSection.add("Particle", particle); - crashReportSection.add("Particle Type", particleTextureSheet); - throw new CrashException(crashReport); - } - } - } - } - - processPostEntityRenderData(postStorageVertexConsumerProvider, 0, 0, 0, 0, renderDataList); - - StorageVertexConsumerProvider storageVertexConsumerProvider = new StorageVertexConsumerProvider( - 0); - storageVertexConsumerProviders.add(storageVertexConsumerProvider); - - Queue customParticleQueue = particles.get(ParticleTextureSheet.CUSTOM); - if (customParticleQueue != null && !customParticleQueue.isEmpty()) { - for (Particle particle : customParticleQueue) { - - MatrixStack matrixStack = new MatrixStack(); - - try { - particle.renderCustom(matrixStack, storageVertexConsumerProvider, camera, - tickDelta); - } catch (Throwable var10) { - CrashReport crashReport = CrashReport.create(var10, "Rendering Particle"); - CrashReportSection crashReportSection = crashReport.addElement( - "Particle being rendered"); - crashReportSection.add("Particle", particle::toString); - crashReportSection.add("Particle Type", "Custom"); - throw new CrashException(crashReport); - } - } - } - - processWorldEntityRenderData(storageVertexConsumerProvider, 0, 0, 0, 0, - Constants.RayTracingFlags.PARTICLE, true, renderDataList); - - queueBuild(storageVertexConsumerProviders, renderDataList, 0.0f, - Constants.Coordinates.CAMERA_SHIFT, false); - } - - public static void queueTargetBlockOutlineRebuild(Camera camera, ClientWorld world) { - List storageVertexConsumerProviders = new ArrayList<>(); - EntityRenderDataList renderDataList = new EntityRenderDataList(); - - MinecraftClient client = MinecraftClient.getInstance(); - MatrixStack matrixStack = new MatrixStack(); - - StorageVertexConsumerProvider storageVertexConsumerProvider = new StorageVertexConsumerProvider( - 0); - storageVertexConsumerProviders.add(storageVertexConsumerProvider); - - if (client.crosshairTarget instanceof BlockHitResult blockHitResult) { - if (blockHitResult.getType() != HitResult.Type.MISS) { - BlockPos blockPos = blockHitResult.getBlockPos(); - BlockState blockState = world.getBlockState(blockPos); - if (!blockState.isAir() && world.getWorldBorder() - .contains(blockPos)) { - Boolean - isHighContrastBlockOutline = - client.options.getHighContrastBlockOutline() - .getValue(); - if (isHighContrastBlockOutline) { - VertexConsumer vertexConsumer = storageVertexConsumerProvider.getBuffer( - RenderLayer.getSecondaryBlockOutline()); - VertexRendering.drawOutline(matrixStack, - vertexConsumer, - blockState.getOutlineShape(world, blockPos, - ShapeContext.of(camera.getFocusedEntity())), - 0, - 0, - 0, - -16777216); - } - - VertexConsumer vertexConsumer = storageVertexConsumerProvider.getBuffer( - RenderLayer.getLines()); - int color = - isHighContrastBlockOutline ? Colors.CYAN - : ColorHelper.withAlpha(102, Colors.BLACK); - VertexRendering.drawOutline(matrixStack, - vertexConsumer, - blockState.getOutlineShape(world, blockPos, - ShapeContext.of(camera.getFocusedEntity())), - 0, - 0, - 0, - color); - - processWorldEntityRenderData(storageVertexConsumerProvider, - 0, - blockPos.getX(), - blockPos.getY(), - blockPos.getZ(), - Constants.RayTracingFlags.FISHING_BOBBER, - false, - renderDataList); - } - } + if (client.options.getPerspective().isFirstPerson() && !sleeping) { + InGameOverlayRenderer.renderOverlays(client, matrixStack); } - - queueBuild(storageVertexConsumerProviders, renderDataList, 0.0075f, - Constants.Coordinates.WORLD, - false); } - public static void queueWeatherBuild(WeatherRendering weatherRendering, - WorldBorderRendering worldBorderRendering, - ClientWorld world, - Camera camera, - int ticks, - float tickDelta) { - List storageVertexConsumerProviders = new ArrayList<>(); - EntityRenderDataList renderDataList = new EntityRenderDataList(); - - StorageVertexConsumerProvider storageVertexConsumerProvider = new StorageVertexConsumerProvider( - 0); - storageVertexConsumerProviders.add(storageVertexConsumerProvider); - - weatherRendering.renderPrecipitation(world, storageVertexConsumerProvider, ticks, tickDelta, - camera.getPos()); - - MinecraftClient client = MinecraftClient.getInstance(); - int clampedViewDistance = client.options.getClampedViewDistance() * 16; - float farPlaneDistance = client.gameRenderer.getFarPlaneDistance(); - worldBorderRendering.render(world.getWorldBorder(), camera.getPos(), clampedViewDistance, - farPlaneDistance); - - processPostEntityRenderData(storageVertexConsumerProvider, 0, 0, 0, 0, renderDataList); - - queueBuild(storageVertexConsumerProviders, renderDataList, 0.0f, - Constants.Coordinates.CAMERA_SHIFT, false); - } - - public static void queueBuild( - List storageVertexConsumerProviders, - EntityRenderDataList entityRenderDataList) { - queueBuild(storageVertexConsumerProviders, entityRenderDataList, 0.0125f, - Constants.Coordinates.WORLD, false); - } - - public static void queueBuild( - List storageVertexConsumerProviders, + private static void queueBuild(List storageVertexConsumerProviders, EntityRenderDataList entityRenderDataList, float lineWidth, Constants.Coordinates coordinate, boolean normalOffset) { - TextureManager - textureManager = - MinecraftClient.getInstance() - .getTextureManager(); + if (entityRenderDataList.isEmpty()) { + for (StorageVertexConsumerProvider storageVertexConsumerProvider : storageVertexConsumerProviders) { + storageVertexConsumerProvider.close(); + } + return; + } + + TextureManager textureManager = MinecraftClient.getInstance().getTextureManager(); int entityHashCodeSize = entityRenderDataList.getTotalEntityCount() * Integer.BYTES; ByteBuffer entityHashCodeBB = MemoryUtil.memAlloc(entityHashCodeSize); @@ -749,8 +347,8 @@ public static void queueBuild( ByteBuffer geometryGroupNameBB = MemoryUtil.memAlloc(geometryGroupNameSize); long geometryGroupNameAddr = memAddress(geometryGroupNameBB); int geometryGroupNameBaseAddr = 0; - List geometryGroupNameBuffers = new ArrayList<>( - entityRenderDataList.getTotalLayersCount()); + List geometryGroupNameBuffers = + new ArrayList<>(entityRenderDataList.getTotalLayersCount()); int geometryTextureSize = entityRenderDataList.getTotalLayersCount() * Integer.BYTES; ByteBuffer geometryTextureBB = MemoryUtil.memAlloc(geometryTextureSize); @@ -777,376 +375,123 @@ public static void queueBuild( long verticesAddr = memAddress(verticesBB); int verticesBaseAddr = 0; - for (EntityRenderData entityRenderData : entityRenderDataList) { - entityHashCodeBB.putInt(entityHashCodeBaseAddr, entityRenderData.hashCode); - entityHashCodeBaseAddr += Integer.BYTES; - - entityPosXBB.putDouble(entityPosXBaseAddr, entityRenderData.x); - entityPosXBaseAddr += Double.BYTES; - - entityPosYBB.putDouble(entityPosYBaseAddr, entityRenderData.y); - entityPosYBaseAddr += Double.BYTES; - - entityPosZBB.putDouble(entityPosZBaseAddr, entityRenderData.z); - entityPosZBaseAddr += Double.BYTES; - - entityRTFlagBB.putInt(entityRTFlagBaseAddr, entityRenderData.rtFlag); - entityRTFlagBaseAddr += Integer.BYTES; - - entityPrebuiltBLASBB.putInt(entityPrebuiltBLASBaseAddr, entityRenderData.prebuiltBLAS); - entityPrebuiltBLASBaseAddr += Integer.BYTES; - - entityPostBB.putInt(entityPostBaseAddr, entityRenderData.post ? 1 : 0); - entityPostBaseAddr += Integer.BYTES; - - entityLayerCountBB.putInt(entityLayerCountBaseAddr, entityRenderData.size()); - entityLayerCountBaseAddr += Integer.BYTES; - - for (EntityRenderLayer entityRenderLayer : entityRenderData) { - RenderLayer renderLayer = entityRenderLayer.renderLayer; - BuiltBuffer vertexBuffer = entityRenderLayer.builtBuffer; - - Identifier - identifier = - ((RenderLayer.MultiPhase) renderLayer).phases.texture.getId() - .orElse(MissingSprite.getMissingSpriteId()); - int - geometryTypeID = - Constants.GeometryTypes.getGeometryType(renderLayer, entityRenderLayer.reflect) - .getValue(); - int - geometryTextureID = - textureManager.getTexture(identifier) - .getGlId(); - int - vertexFormatID = - Constants.VertexFormats.getValue(vertexBuffer.getDrawParameters() - .format()); - int - indexFormatID = - Constants.DrawModes.getValue(vertexBuffer.getDrawParameters() - .mode()); - - BufferProxy.BufferInfo vertexBufferInfo = BufferProxy.getBufferInfo( - vertexBuffer.getBuffer()); - assert vertexBuffer.getDrawParameters() - .indexCount() == vertexBuffer.getDrawParameters() - .vertexCount() / 4 * 6; - - geometryTypeBB.putInt(geometryTypeBaseAddr, geometryTypeID); - geometryTypeBaseAddr += Integer.BYTES; - - ByteBuffer geometryGroupNameBuffer = MemoryUtil.memUTF8(renderLayer.name, true); - geometryGroupNameBuffers.add(geometryGroupNameBuffer); - geometryGroupNameBB.putLong(geometryGroupNameBaseAddr, memAddress(geometryGroupNameBuffer)); - geometryGroupNameBaseAddr += Long.BYTES; - - geometryTextureBB.putInt(geometryTextureBaseAddr, geometryTextureID); - geometryTextureBaseAddr += Integer.BYTES; - - vertexFormatBB.putInt(vertexFormatBaseAddr, vertexFormatID); - vertexFormatBaseAddr += Integer.BYTES; - - indexFormatBB.putInt(indexFormatBaseAddr, indexFormatID); - indexFormatBaseAddr += Integer.BYTES; - - vertexCountBB.putInt(vertexCountBaseAddr, - vertexBuffer.getDrawParameters() - .vertexCount()); - vertexCountBaseAddr += Integer.BYTES; - - verticesBB.putLong(verticesBaseAddr, vertexBufferInfo.addr()); - verticesBaseAddr += Long.BYTES; - } - } - - queueBuild(lineWidth, - coordinate.getValue(), - normalOffset, - entityRenderDataList.getTotalEntityCount(), - entityHashCodeAddr, - entityPosXAddr, - entityPosYAddr, - entityPosZAddr, - entityRTFlagAddr, - entityPrebuiltBLASAddr, - entityPostAddr, - entityLayerCountAddr, - geometryTypeAddr, - geometryGroupNameAddr, - geometryTextureAddr, - vertexFormatAddr, - indexFormatAddr, - vertexCountAddr, - verticesAddr); - - // free - MemoryUtil.memFree(entityPosXBB); - MemoryUtil.memFree(entityPosYBB); - MemoryUtil.memFree(entityPosZBB); - MemoryUtil.memFree(entityRTFlagBB); - MemoryUtil.memFree(entityPrebuiltBLASBB); - MemoryUtil.memFree(entityPostBB); - MemoryUtil.memFree(entityLayerCountBB); - MemoryUtil.memFree(geometryTypeBB); - MemoryUtil.memFree(geometryGroupNameBB); - for (ByteBuffer geometryGroupNameBuffer : geometryGroupNameBuffers) { - MemoryUtil.memFree(geometryGroupNameBuffer); - } - MemoryUtil.memFree(geometryTextureBB); - MemoryUtil.memFree(vertexFormatBB); - MemoryUtil.memFree(indexFormatBB); - MemoryUtil.memFree(vertexCountBB); - MemoryUtil.memFree(verticesBB); - - for (EntityRenderData entityRenderData : entityRenderDataList) { - for (EntityRenderLayer entityRenderLayer : entityRenderData) { - BuiltBuffer vertexBuffer = entityRenderLayer.builtBuffer; - vertexBuffer.close(); - } - } + try { + for (EntityRenderData entityRenderData : entityRenderDataList) { + entityHashCodeBB.putInt(entityHashCodeBaseAddr, entityRenderData.hashCode); + entityHashCodeBaseAddr += Integer.BYTES; - for (StorageVertexConsumerProvider storageVertexConsumerProvider : storageVertexConsumerProviders) { - storageVertexConsumerProvider.close(); - } - } + entityPosXBB.putDouble(entityPosXBaseAddr, entityRenderData.x); + entityPosXBaseAddr += Double.BYTES; - public static void queueBuildWithoutClose(EntityRenderDataList entityRenderDataList) { - queueBuildWithoutClose(entityRenderDataList, 0.0125f, Constants.Coordinates.WORLD, false); - } + entityPosYBB.putDouble(entityPosYBaseAddr, entityRenderData.y); + entityPosYBaseAddr += Double.BYTES; - public static void queueBuildWithoutClose(EntityRenderDataList entityRenderDataList, - float lineWidth, - Constants.Coordinates coordinate, - boolean normalOffset) { - TextureManager - textureManager = - MinecraftClient.getInstance() - .getTextureManager(); + entityPosZBB.putDouble(entityPosZBaseAddr, entityRenderData.z); + entityPosZBaseAddr += Double.BYTES; - int entityHashCodeSize = entityRenderDataList.getTotalEntityCount() * Integer.BYTES; - ByteBuffer entityHashCodeBB = MemoryUtil.memAlloc(entityHashCodeSize); - long entityHashCodeAddr = memAddress(entityHashCodeBB); - int entityHashCodeBaseAddr = 0; + entityRTFlagBB.putInt(entityRTFlagBaseAddr, entityRenderData.rtFlag); + entityRTFlagBaseAddr += Integer.BYTES; - int entityPosXSize = entityRenderDataList.getTotalEntityCount() * Double.BYTES; - ByteBuffer entityPosXBB = MemoryUtil.memAlloc(entityPosXSize); - long entityPosXAddr = memAddress(entityPosXBB); - int entityPosXBaseAddr = 0; + entityPrebuiltBLASBB.putInt(entityPrebuiltBLASBaseAddr, + entityRenderData.prebuiltBLAS); + entityPrebuiltBLASBaseAddr += Integer.BYTES; - int entityPosYSize = entityRenderDataList.getTotalEntityCount() * Double.BYTES; - ByteBuffer entityPosYBB = MemoryUtil.memAlloc(entityPosYSize); - long entityPosYAddr = memAddress(entityPosYBB); - int entityPosYBaseAddr = 0; + entityPostBB.putInt(entityPostBaseAddr, entityRenderData.post ? 1 : 0); + entityPostBaseAddr += Integer.BYTES; - int entityPosZSize = entityRenderDataList.getTotalEntityCount() * Double.BYTES; - ByteBuffer entityPosZBB = MemoryUtil.memAlloc(entityPosZSize); - long entityPosZAddr = memAddress(entityPosZBB); - int entityPosZBaseAddr = 0; + entityLayerCountBB.putInt(entityLayerCountBaseAddr, entityRenderData.size()); + entityLayerCountBaseAddr += Integer.BYTES; - int entityRTFlagSize = entityRenderDataList.getTotalEntityCount() * Integer.BYTES; - ByteBuffer entityRTFlagBB = MemoryUtil.memAlloc(entityRTFlagSize); - long entityRTFlagAddr = memAddress(entityRTFlagBB); - int entityRTFlagBaseAddr = 0; + for (EntityRenderLayer entityRenderLayer : entityRenderData) { + RenderLayer renderLayer = entityRenderLayer.renderLayer; + BufferBuilder.BuiltBuffer vertexBuffer = entityRenderLayer.builtBuffer; + BufferBuilder.DrawParameters drawParameters = vertexBuffer.getParameters(); - int entityPrebuiltBLASSize = entityRenderDataList.getTotalEntityCount() * Integer.BYTES; - ByteBuffer entityPrebuiltBLASBB = MemoryUtil.memAlloc(entityPrebuiltBLASSize); - long entityPrebuiltBLASAddr = memAddress(entityPrebuiltBLASBB); - int entityPrebuiltBLASBaseAddr = 0; + int geometryTypeId = Constants.GeometryTypes.getGeometryType(renderLayer, + entityRenderLayer.reflect).getValue(); + int geometryTextureId = textureManager.getTexture( + renderLayer instanceof RenderLayer.MultiPhase multiPhase ? + multiPhase.phases.texture.getId() + .orElse(MissingSprite.getMissingSpriteId()) : + MissingSprite.getMissingSpriteId()).getGlId(); + int vertexFormatId = Constants.VertexFormats.getValue(drawParameters.format()); + int indexFormatId = Constants.DrawModes.getValue(drawParameters.mode()); - int entityPostSize = entityRenderDataList.getTotalEntityCount() * Integer.BYTES; - ByteBuffer entityPostBB = MemoryUtil.memAlloc(entityPostSize); - long entityPostAddr = memAddress(entityPostBB); - int entityPostBaseAddr = 0; + BufferProxy.BufferInfo vertexBufferInfo = BufferProxy.getBufferInfo( + vertexBuffer.getVertexBuffer()); - int entityLayerCountSize = entityRenderDataList.getTotalEntityCount() * Integer.BYTES; - ByteBuffer entityLayerCountBB = MemoryUtil.memAlloc(entityLayerCountSize); - long entityLayerCountAddr = memAddress(entityLayerCountBB); - int entityLayerCountBaseAddr = 0; + geometryTypeBB.putInt(geometryTypeBaseAddr, geometryTypeId); + geometryTypeBaseAddr += Integer.BYTES; - int geometryTypeSize = entityRenderDataList.getTotalLayersCount() * Integer.BYTES; - ByteBuffer geometryTypeBB = MemoryUtil.memAlloc(geometryTypeSize); - long geometryTypeAddr = memAddress(geometryTypeBB); - int geometryTypeBaseAddr = 0; + ByteBuffer geometryGroupNameBuffer = MemoryUtil.memUTF8(renderLayer.name, true); + geometryGroupNameBuffers.add(geometryGroupNameBuffer); + geometryGroupNameBB.putLong(geometryGroupNameBaseAddr, + memAddress(geometryGroupNameBuffer)); + geometryGroupNameBaseAddr += Long.BYTES; - int geometryGroupNameSize = entityRenderDataList.getTotalLayersCount() * Long.BYTES; - ByteBuffer geometryGroupNameBB = MemoryUtil.memAlloc(geometryGroupNameSize); - long geometryGroupNameAddr = memAddress(geometryGroupNameBB); - int geometryGroupNameBaseAddr = 0; - List geometryGroupNameBuffers = new ArrayList<>( - entityRenderDataList.getTotalLayersCount()); + geometryTextureBB.putInt(geometryTextureBaseAddr, geometryTextureId); + geometryTextureBaseAddr += Integer.BYTES; - int geometryTextureSize = entityRenderDataList.getTotalLayersCount() * Integer.BYTES; - ByteBuffer geometryTextureBB = MemoryUtil.memAlloc(geometryTextureSize); - long geometryTextureAddr = memAddress(geometryTextureBB); - int geometryTextureBaseAddr = 0; + vertexFormatBB.putInt(vertexFormatBaseAddr, vertexFormatId); + vertexFormatBaseAddr += Integer.BYTES; - int vertexFormatSize = entityRenderDataList.getTotalLayersCount() * Integer.BYTES; - ByteBuffer vertexFormatBB = MemoryUtil.memAlloc(vertexFormatSize); - long vertexFormatAddr = memAddress(vertexFormatBB); - int vertexFormatBaseAddr = 0; + indexFormatBB.putInt(indexFormatBaseAddr, indexFormatId); + indexFormatBaseAddr += Integer.BYTES; - int indexFormatSize = entityRenderDataList.getTotalLayersCount() * Integer.BYTES; - ByteBuffer indexFormatBB = MemoryUtil.memAlloc(indexFormatSize); - long indexFormatAddr = memAddress(indexFormatBB); - int indexFormatBaseAddr = 0; + vertexCountBB.putInt(vertexCountBaseAddr, drawParameters.vertexCount()); + vertexCountBaseAddr += Integer.BYTES; - int vertexCountSize = entityRenderDataList.getTotalLayersCount() * Integer.BYTES; - ByteBuffer vertexCountBB = MemoryUtil.memAlloc(vertexCountSize); - long vertexCountAddr = memAddress(vertexCountBB); - int vertexCountBaseAddr = 0; - - int verticesSize = entityRenderDataList.getTotalLayersCount() * Long.BYTES; - ByteBuffer verticesBB = MemoryUtil.memAlloc(verticesSize); - long verticesAddr = memAddress(verticesBB); - int verticesBaseAddr = 0; + verticesBB.putLong(verticesBaseAddr, vertexBufferInfo.addr()); + verticesBaseAddr += Long.BYTES; + } + } - for (EntityRenderData entityRenderData : entityRenderDataList) { - entityHashCodeBB.putInt(entityHashCodeBaseAddr, entityRenderData.hashCode); - entityHashCodeBaseAddr += Integer.BYTES; - - entityPosXBB.putDouble(entityPosXBaseAddr, entityRenderData.x); - entityPosXBaseAddr += Double.BYTES; - - entityPosYBB.putDouble(entityPosYBaseAddr, entityRenderData.y); - entityPosYBaseAddr += Double.BYTES; - - entityPosZBB.putDouble(entityPosZBaseAddr, entityRenderData.z); - entityPosZBaseAddr += Double.BYTES; - - entityRTFlagBB.putInt(entityRTFlagBaseAddr, entityRenderData.rtFlag); - entityRTFlagBaseAddr += Integer.BYTES; - - entityPrebuiltBLASBB.putInt(entityPrebuiltBLASBaseAddr, entityRenderData.prebuiltBLAS); - entityPrebuiltBLASBaseAddr += Integer.BYTES; - - entityPostBB.putInt(entityPostBaseAddr, entityRenderData.post ? 1 : 0); - entityPostBaseAddr += Integer.BYTES; - - entityLayerCountBB.putInt(entityLayerCountBaseAddr, entityRenderData.size()); - entityLayerCountBaseAddr += Integer.BYTES; - - for (EntityRenderLayer entityRenderLayer : entityRenderData) { - RenderLayer renderLayer = entityRenderLayer.renderLayer; - BuiltBuffer vertexBuffer = entityRenderLayer.builtBuffer; - - Identifier - identifier = - ((RenderLayer.MultiPhase) renderLayer).phases.texture.getId() - .orElse(MissingSprite.getMissingSpriteId()); - int - geometryTypeID = - Constants.GeometryTypes.getGeometryType(renderLayer, entityRenderLayer.reflect) - .getValue(); - int - geometryTextureID = - textureManager.getTexture(identifier) - .getGlId(); - int - vertexFormatID = - Constants.VertexFormats.getValue(vertexBuffer.getDrawParameters() - .format()); - int - indexFormatID = - Constants.DrawModes.getValue(vertexBuffer.getDrawParameters() - .mode()); - - BufferProxy.BufferInfo vertexBufferInfo = BufferProxy.getBufferInfo( - vertexBuffer.getBuffer()); - assert vertexBuffer.getDrawParameters() - .indexCount() == vertexBuffer.getDrawParameters() - .vertexCount() / 4 * 6; - - geometryTypeBB.putInt(geometryTypeBaseAddr, geometryTypeID); - geometryTypeBaseAddr += Integer.BYTES; - - ByteBuffer geometryGroupNameBuffer = MemoryUtil.memUTF8(renderLayer.name, true); - geometryGroupNameBuffers.add(geometryGroupNameBuffer); - geometryGroupNameBB.putLong(geometryGroupNameBaseAddr, memAddress(geometryGroupNameBuffer)); - geometryGroupNameBaseAddr += Long.BYTES; - - geometryTextureBB.putInt(geometryTextureBaseAddr, geometryTextureID); - geometryTextureBaseAddr += Integer.BYTES; - - vertexFormatBB.putInt(vertexFormatBaseAddr, vertexFormatID); - vertexFormatBaseAddr += Integer.BYTES; - - indexFormatBB.putInt(indexFormatBaseAddr, indexFormatID); - indexFormatBaseAddr += Integer.BYTES; - - vertexCountBB.putInt(vertexCountBaseAddr, - vertexBuffer.getDrawParameters() - .vertexCount()); - vertexCountBaseAddr += Integer.BYTES; - - verticesBB.putLong(verticesBaseAddr, vertexBufferInfo.addr()); - verticesBaseAddr += Long.BYTES; + queueBuild(lineWidth, coordinate.getValue(), normalOffset, + entityRenderDataList.getTotalEntityCount(), entityHashCodeAddr, entityPosXAddr, + entityPosYAddr, entityPosZAddr, entityRTFlagAddr, entityPrebuiltBLASAddr, + entityPostAddr, entityLayerCountAddr, geometryTypeAddr, geometryGroupNameAddr, + geometryTextureAddr, vertexFormatAddr, indexFormatAddr, vertexCountAddr, + verticesAddr); + } finally { + MemoryUtil.memFree(entityHashCodeBB); + MemoryUtil.memFree(entityPosXBB); + MemoryUtil.memFree(entityPosYBB); + MemoryUtil.memFree(entityPosZBB); + MemoryUtil.memFree(entityRTFlagBB); + MemoryUtil.memFree(entityPrebuiltBLASBB); + MemoryUtil.memFree(entityPostBB); + MemoryUtil.memFree(entityLayerCountBB); + MemoryUtil.memFree(geometryTypeBB); + MemoryUtil.memFree(geometryGroupNameBB); + for (ByteBuffer geometryGroupNameBuffer : geometryGroupNameBuffers) { + MemoryUtil.memFree(geometryGroupNameBuffer); + } + MemoryUtil.memFree(geometryTextureBB); + MemoryUtil.memFree(vertexFormatBB); + MemoryUtil.memFree(indexFormatBB); + MemoryUtil.memFree(vertexCountBB); + MemoryUtil.memFree(verticesBB); + + for (EntityRenderData entityRenderData : entityRenderDataList) { + for (EntityRenderLayer entityRenderLayer : entityRenderData) { + entityRenderLayer.builtBuffer.release(); + } } - } - queueBuild(lineWidth, - coordinate.getValue(), - normalOffset, - entityRenderDataList.getTotalEntityCount(), - entityHashCodeAddr, - entityPosXAddr, - entityPosYAddr, - entityPosZAddr, - entityRTFlagAddr, - entityPrebuiltBLASAddr, - entityPostAddr, - entityLayerCountAddr, - geometryTypeAddr, - geometryGroupNameAddr, - geometryTextureAddr, - vertexFormatAddr, - indexFormatAddr, - vertexCountAddr, - verticesAddr); - - // free - MemoryUtil.memFree(entityPosXBB); - MemoryUtil.memFree(entityPosYBB); - MemoryUtil.memFree(entityPosZBB); - MemoryUtil.memFree(entityRTFlagBB); - MemoryUtil.memFree(entityPrebuiltBLASBB); - MemoryUtil.memFree(entityPostBB); - MemoryUtil.memFree(entityLayerCountBB); - MemoryUtil.memFree(geometryTypeBB); - MemoryUtil.memFree(geometryGroupNameBB); - for (ByteBuffer geometryGroupNameBuffer : geometryGroupNameBuffers) { - MemoryUtil.memFree(geometryGroupNameBuffer); + for (StorageVertexConsumerProvider storageVertexConsumerProvider : storageVertexConsumerProviders) { + storageVertexConsumerProvider.close(); + } } - MemoryUtil.memFree(geometryTextureBB); - MemoryUtil.memFree(vertexFormatBB); - MemoryUtil.memFree(indexFormatBB); - MemoryUtil.memFree(vertexCountBB); - MemoryUtil.memFree(verticesBB); } - private static native void queueBuild(float lineWidth, - int coordinate, - boolean normalOffset, - int size, - long entityHashCodes, - long entityPosXs, - long entityPosYs, - long entityPosZs, - long entityRTFlags, - long entityPrebuiltBLASs, - long entityPosts, - long entityLayerCounts, - long geometryTypes, - long geometryGroupNames, - long geometryTextures, - long vertexFormats, - long indexFormats, - long vertexCounts, - long vertices); - - public static native void build(); + public static void build() { + // The 1.20.1 port does not restore Java-side entity extraction yet. + // Until queueBuild(...) is wired back in, calling native build() only + // produces empty batches and invalid Vulkan allocations. + } - public record EntityRenderLayer(RenderLayer renderLayer, BuiltBuffer builtBuffer, + public record EntityRenderLayer(RenderLayer renderLayer, + BufferBuilder.BuiltBuffer builtBuffer, boolean reflect) { } @@ -1157,21 +502,12 @@ public static class EntityRenderData extends ArrayList { private final int rtFlag; private final int prebuiltBLAS; private final boolean post; - private double x; - private double y; - private double z; - - public EntityRenderData(int hashCode, double x, double y, double z, boolean post) { - this(hashCode, x, y, z, 0, -1, post); - } - - public EntityRenderData(int hashCode, double x, double y, double z, int rtFlag) { - this(hashCode, x, y, z, rtFlag, -1, false); - } + private final double x; + private final double y; + private final double z; public EntityRenderData(int hashCode, double x, double y, double z, int rtFlag, - int prebuiltBLAS, - boolean post) { + int prebuiltBLAS, boolean post) { this.hashCode = hashCode; this.x = x; this.y = y; @@ -1180,46 +516,6 @@ public EntityRenderData(int hashCode, double x, double y, double z, int rtFlag, this.prebuiltBLAS = prebuiltBLAS; this.post = post; } - - public double getX() { - return x; - } - - public void setX(double x) { - this.x = x; - } - - public double getY() { - return y; - } - - public void setY(double y) { - this.y = y; - } - - public double getZ() { - return z; - } - - public void setZ(double z) { - this.z = z; - } - - public int getRtFlag() { - return rtFlag; - } - - public int getPrebuiltBLAS() { - return prebuiltBLAS; - } - - public int getHashCode() { - return hashCode; - } - - public boolean isPost() { - return post; - } } public static class EntityRenderDataList extends ArrayList { diff --git a/src/main/java/com/radiance/client/texture/AuxiliaryTextures.java b/src/main/java/com/radiance/client/texture/AuxiliaryTextures.java index ef1a3ce..81b2f34 100644 --- a/src/main/java/com/radiance/client/texture/AuxiliaryTextures.java +++ b/src/main/java/com/radiance/client/texture/AuxiliaryTextures.java @@ -1,202 +1,15 @@ package com.radiance.client.texture; -import com.mojang.blaze3d.platform.TextureUtil; -import com.radiance.client.proxy.vulkan.TextureProxy; import com.radiance.mixin_related.extensions.vanilla_resource_tracker.INativeImageExt; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.texture.NativeImage; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -public enum AuxiliaryTextures { - SPECULAR("specular", "_s", (identifier, source) -> { - String namespace = identifier.getNamespace(); - String path = identifier.getPath(); - String[] pathComponents = path.split("/"); - String[] fileNameComponents = pathComponents[pathComponents.length - 1].split("\\."); - String specularFileName = String.join("", - new String[]{fileNameComponents[0], "_s.", fileNameComponents[1]}); +public final class AuxiliaryTextures { - pathComponents[pathComponents.length - 1] = specularFileName; - String specularPath = String.join("/", pathComponents); - Identifier specularIdentifier = Identifier.of(namespace, specularPath); - return List.of(specularIdentifier); - }, INativeImageExt::radiance$getSpecularNativeImage, - INativeImageExt::radiance$setSpecularNativeImage, - TextureTracker.GLID2SpecularGLID), - NORMAL("normal", "_n", (identifier, source) -> { - String namespace = identifier.getNamespace(); - String path = identifier.getPath(); - String[] pathComponents = path.split("/"); - String[] fileNameComponents = pathComponents[pathComponents.length - 1].split("\\."); - String normalFileName = String.join("", - new String[]{fileNameComponents[0], "_n.", fileNameComponents[1]}); - - pathComponents[pathComponents.length - 1] = normalFileName; - String normalPath = String.join("/", pathComponents); - Identifier normalIdentifier = Identifier.of(namespace, normalPath); - return List.of(normalIdentifier); - }, INativeImageExt::radiance$getNormalNativeImage, - INativeImageExt::radiance$setNormalNativeImage, TextureTracker.GLID2NormalGLID), - FLAG( - "flag", "_f", (identifier, source) -> { - String namespace = identifier.getNamespace(); - String path = identifier.getPath(); - String[] pathComponents = path.split("/"); - String[] fileNameComponents = pathComponents[pathComponents.length - 1].split("\\."); - String flagFileName = String.join("", - new String[]{fileNameComponents[0], "_f.", fileNameComponents[1]}); - - pathComponents[pathComponents.length - 1] = flagFileName; - String flagPath = String.join("/", pathComponents) - .replace("textures/", "textures/flag/"); - Identifier flagIdentifier = Identifier.of(namespace, flagPath); - return List.of(flagIdentifier); - }, INativeImageExt::radiance$getFlagNativeImage, - INativeImageExt::radiance$setFlagNativeImage, TextureTracker.GLID2FlagGLID); - - private static final List ALL_TEXTURES = Collections.unmodifiableList( - Arrays.stream(values()).collect(Collectors.toList())); - private final String suffix; - private final IdentifierCandidateProvider identifierCandidateProvider; - private final Getter getter; - private final Setter setter; - private final String name; - private final Map GLIDMapping; - - AuxiliaryTextures(String name, String suffix, - IdentifierCandidateProvider identifierCandidateProvider, Getter getter, Setter setter, - Map GLIDMapping) { - this.suffix = suffix; - this.identifierCandidateProvider = identifierCandidateProvider; - this.getter = getter; - this.setter = setter; - this.name = name; - this.GLIDMapping = GLIDMapping; + private AuxiliaryTextures() { } public static void loadAndUpload(NativeImage source, INativeImageExt sourceExt, int level, int offsetX, int offsetY, int unpackSkipPixels, int unpackSkipRows, int regionWidth, int regionHeight, boolean blur) { - int targetId = sourceExt.radiance$getTargetID(); - Identifier identifier = sourceExt.radiance$getIdentifier(); - - ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); - - if (identifier != null) { - if (ALL_TEXTURES.stream().anyMatch(texture -> { - String path = identifier.getPath(); - int dotIndex = path.lastIndexOf('.'); - String baseName = (dotIndex != -1) ? path.substring(0, dotIndex) : path; - - return baseName.endsWith(texture.suffix); - })) { - return; - } - - for (AuxiliaryTextures auxiliaryTexture : ALL_TEXTURES) { - NativeImage auxiliaryTemplateImage = auxiliaryTexture.getter.get(sourceExt); - int auxiliaryTargetId; - - // ensure the texture exists - TextureTracker.Texture texture = TextureTracker.GLID2Texture.get(targetId); - if (!auxiliaryTexture.GLIDMapping.containsKey(targetId)) { - auxiliaryTargetId = TextureProxy.generateTextureId(); -// System.out.println( -// "generate " + auxiliaryTexture.name + " texture for " + targetId + ": " -// + auxiliaryTargetId); - - TextureUtil.prepareImage(texture.format().getNativeImageInternalFormat(), - auxiliaryTargetId, texture.maxLayer(), texture.width(), texture.height()); - auxiliaryTexture.GLIDMapping.put(targetId, auxiliaryTargetId); - } else { - auxiliaryTargetId = auxiliaryTexture.GLIDMapping.get(targetId); - - TextureTracker.Texture auxiliaryTrackerTexture = TextureTracker.GLID2Texture.get( - auxiliaryTargetId); - if (texture.width() != auxiliaryTrackerTexture.width() - || texture.height() != auxiliaryTrackerTexture.height() - || texture.format() != auxiliaryTrackerTexture.format()) { - TextureUtil.prepareImage(texture.format().getNativeImageInternalFormat(), - auxiliaryTargetId, texture.maxLayer(), texture.width(), - texture.height()); - } - } - - if (auxiliaryTemplateImage == null && ( - identifier.getPath().contains("textures/block") || identifier.getPath() - .contains("textures/item") || identifier.getPath() - .contains("textures/entity"))) { - List candidates = auxiliaryTexture.identifierCandidateProvider.get( - identifier, source); - - boolean success = false; - for (Identifier candidate : candidates) { - Optional optionalResource = resourceManager.getResource( - candidate); - if (optionalResource.isPresent()) { - try (NativeImage tmpImage = NativeImage.read( - optionalResource.get().getInputStream())) { - auxiliaryTemplateImage = MipmapUtil.getSpecificMipmapLevelImage( - tmpImage, level); - } catch (IOException e) { - throw new RuntimeException(e); - } - - success = true; - break; - } - } - - if (!success) { - auxiliaryTemplateImage = source.applyToCopy(i -> 0); - } - } - - if (auxiliaryTemplateImage != null) { - NativeImage auxiliaryImage = ((com.radiance.mixin_related.extensions.vulkan_render_integration.INativeImageExt) (Object) auxiliaryTemplateImage).radiance$alignTo( - source); - ((INativeImageExt) (Object) auxiliaryImage).radiance$setTargetID( - auxiliaryTargetId); - if (auxiliaryTemplateImage != auxiliaryImage) { - auxiliaryTemplateImage.close(); - } - - if (auxiliaryImage.getWidth() != source.getWidth() - || auxiliaryImage.getHeight() != source.getHeight() - || auxiliaryImage.getFormat() != source.getFormat()) { - throw new RuntimeException( - auxiliaryTexture.name + " image size / format mismatch"); - } - - auxiliaryImage.upload(level, offsetX, offsetY, unpackSkipPixels, unpackSkipRows, - regionWidth, regionHeight, blur); - auxiliaryTexture.setter.set(sourceExt, auxiliaryImage); - } - } - } - } - - public interface IdentifierCandidateProvider { - - List get(Identifier identifier, NativeImage source); - } - - public interface Getter { - - NativeImage get(INativeImageExt nativeImageExt); - } - - public interface Setter { - - void set(INativeImageExt nativeImageExt, NativeImage nativeImage); } } diff --git a/src/main/java/com/radiance/client/texture/MipmapUtil.java b/src/main/java/com/radiance/client/texture/MipmapUtil.java index 3c455a8..d634475 100644 --- a/src/main/java/com/radiance/client/texture/MipmapUtil.java +++ b/src/main/java/com/radiance/client/texture/MipmapUtil.java @@ -1,163 +1,13 @@ package com.radiance.client.texture; import net.minecraft.client.texture.NativeImage; -import net.minecraft.util.Util; -import net.minecraft.util.math.ColorHelper; -public class MipmapUtil { - - private static final float CUTOUT_ALPHA_COVERAGE_THRESHOLD = 0.5F; - private static final float[] COLOR_FRACTIONS = Util.make(new float[256], list -> { - for (int i = 0; i < list.length; i++) { - list[i] = (float) Math.pow(i / 255.0F, 2.2); - } - }); +public final class MipmapUtil { private MipmapUtil() { } - // straight forward, need speed up - public static NativeImage getSpecificMipmapLevelImage(NativeImage original, int targetLevel) { - if (targetLevel == 0) { - NativeImage ret = new NativeImage(original.getFormat(), original.getWidth(), - original.getHeight(), false); - ret.copyFrom(original); - return ret; - } - - NativeImage currentSource = original; - boolean bl = hasAlpha(original); - - boolean close = false; - - for (int i = 1; i <= targetLevel; i++) { - int newWidth = currentSource.getWidth() >> 1; - int newHeight = currentSource.getHeight() >> 1; - - if (newWidth == 0 || newHeight == 0) { - break; - } - - NativeImage nextLevel = new NativeImage(currentSource.getFormat(), newWidth, newHeight, - false); - - for (int x = 0; x < newWidth; x++) { - for (int y = 0; y < newHeight; y++) { - nextLevel.setColorArgb(x, y, blend(currentSource.getColorArgb(x * 2, y * 2), - currentSource.getColorArgb(x * 2 + 1, y * 2), - currentSource.getColorArgb(x * 2, y * 2 + 1), - currentSource.getColorArgb(x * 2 + 1, y * 2 + 1), bl)); - } - } - - if (close) { - currentSource.close(); - } - - currentSource = nextLevel; - close = true; - } - - return currentSource; - } - - public static NativeImage[] getMipmapLevelsImages(NativeImage[] originals, int mipmap) { - if (mipmap + 1 <= originals.length) { - return originals; - } else { - NativeImage[] nativeImages = new NativeImage[mipmap + 1]; - nativeImages[0] = originals[0]; - boolean bl = hasAlpha(nativeImages[0]); - - for (int i = 1; i <= mipmap; i++) { - if (i < originals.length) { - nativeImages[i] = originals[i]; - } else { - NativeImage nativeImage = nativeImages[i - 1]; - NativeImage nativeImage2 = new NativeImage(nativeImage.getWidth() >> 1, - nativeImage.getHeight() >> 1, false); - int j = nativeImage2.getWidth(); - int k = nativeImage2.getHeight(); - - for (int l = 0; l < j; l++) { - for (int m = 0; m < k; m++) { - nativeImage2.setColorArgb(l, m, - blend(nativeImage.getColorArgb(l * 2, m * 2), - nativeImage.getColorArgb(l * 2 + 1, m * 2), - nativeImage.getColorArgb(l * 2, m * 2 + 1), - nativeImage.getColorArgb(l * 2 + 1, m * 2 + 1), bl)); - } - } - - nativeImages[i] = nativeImage2; - } - } - - return nativeImages; - } - } - - public static boolean hasAlpha(NativeImage image) { - for (int i = 0; i < image.getWidth(); i++) { - for (int j = 0; j < image.getHeight(); j++) { - if (ColorHelper.getAlpha(image.getColorArgb(i, j)) == 0) { - return true; - } - } - } - - return false; - } - - public static int blend(int one, int two, int three, int four, boolean checkAlpha) { - float a1 = getColorFraction(one >> 24), r1 = getColorFraction( - one >> 16), g1 = getColorFraction(one >> 8), b1 = getColorFraction(one >> 0); - float a2 = getColorFraction(two >> 24), r2 = getColorFraction( - two >> 16), g2 = getColorFraction(two >> 8), b2 = getColorFraction(two >> 0); - float a3 = getColorFraction(three >> 24), r3 = getColorFraction( - three >> 16), g3 = getColorFraction(three >> 8), b3 = getColorFraction(three >> 0); - float a4 = getColorFraction(four >> 24), r4 = getColorFraction( - four >> 16), g4 = getColorFraction(four >> 8), b4 = getColorFraction(four >> 0); - - float totalAlpha = a1 + a2 + a3 + a4; - float outA, outR, outG, outB; - - if (totalAlpha > 0) { - outA = totalAlpha / 4.0F; - - outR = (r1 * a1 + r2 * a2 + r3 * a3 + r4 * a4) / totalAlpha; - outG = (g1 * a1 + g2 * a2 + g3 * a3 + g4 * a4) / totalAlpha; - outB = (b1 * a1 + b2 * a2 + b3 * a3 + b4 * a4) / totalAlpha; - } else { - return 0; - } - - double gamma = 0.45454545454545453; - int resA = (int) (Math.pow(outA, gamma) * 255.0); - int resR = (int) (Math.pow(outR, gamma) * 255.0); - int resG = (int) (Math.pow(outG, gamma) * 255.0); - int resB = (int) (Math.pow(outB, gamma) * 255.0); - - if (checkAlpha) { - float alphaCoverage = - (ColorHelper.getAlpha(one) + ColorHelper.getAlpha(two) + ColorHelper.getAlpha(three) - + ColorHelper.getAlpha(four)) / (4.0F * 255.0F); - resA = alphaCoverage >= CUTOUT_ALPHA_COVERAGE_THRESHOLD ? 255 : 0; - } - - return ColorHelper.getArgb(resA, resR, resG, resB); - } - - public static int getColorComponent(int one, int two, int three, int four, int bits) { - float f = getColorFraction(one >> bits); - float g = getColorFraction(two >> bits); - float h = getColorFraction(three >> bits); - float i = getColorFraction(four >> bits); - float j = (float) ((float) Math.pow((f + g + h + i) * 0.25, 0.45454545454545453)); - return (int) (j * 255.0); - } - - public static float getColorFraction(int value) { - return COLOR_FRACTIONS[value & 0xFF]; + public static NativeImage getSpecificMipmapLevelImage(NativeImage source, int level) { + return source; } } diff --git a/src/main/java/com/radiance/client/texture/TextureTracker.java b/src/main/java/com/radiance/client/texture/TextureTracker.java index 424057a..989ab26 100644 --- a/src/main/java/com/radiance/client/texture/TextureTracker.java +++ b/src/main/java/com/radiance/client/texture/TextureTracker.java @@ -13,6 +13,7 @@ public class TextureTracker { public static Map GLID2SpecularGLID = new ConcurrentHashMap<>(); public static Map GLID2NormalGLID = new ConcurrentHashMap<>(); public static Map GLID2FlagGLID = new ConcurrentHashMap<>(); + public static volatile int currentBoundTextureID = -1; public record Texture(int width, int height, int channel, VulkanConstants.VkFormat format, int maxLayer) { diff --git a/src/main/java/com/radiance/client/util/CategoryVideoOptionEntry.java b/src/main/java/com/radiance/client/util/CategoryVideoOptionEntry.java index adcf888..49e49d5 100644 --- a/src/main/java/com/radiance/client/util/CategoryVideoOptionEntry.java +++ b/src/main/java/com/radiance/client/util/CategoryVideoOptionEntry.java @@ -1,48 +1,10 @@ package com.radiance.client.util; -import com.google.common.collect.ImmutableList; -import java.util.List; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.widget.OptionListWidget; import net.minecraft.text.Text; -import net.minecraft.util.Colors; -public class CategoryVideoOptionEntry extends OptionListWidget.WidgetEntry { - - private final Text text; - private final int textWidth; - private final MinecraftClient client; - private final OptionListWidget parent; +public final class CategoryVideoOptionEntry { public CategoryVideoOptionEntry(Text text, OptionListWidget parent) { - super(ImmutableList.of(), null); - - this.client = MinecraftClient.getInstance(); - this.parent = parent; - - this.text = text; - this.textWidth = this.client.textRenderer.getWidth(this.text); - } - - @Override - public void render(DrawContext context, int index, int y, int x, int entryWidth, - int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - context.drawTextWithShadow( - this.client.textRenderer, this.text, parent.getWidth() / 2 - this.textWidth / 2, - y + entryHeight - 9 - 1, Colors.WHITE - ); - } - - @Override - public List children() { - return ImmutableList.of(); - } - - @Override - public List selectableChildren() { - return ImmutableList.of(); } } diff --git a/src/main/java/com/radiance/client/vertex/PBRVertexConsumer.java b/src/main/java/com/radiance/client/vertex/PBRVertexConsumer.java index 28ea831..ab37d06 100644 --- a/src/main/java/com/radiance/client/vertex/PBRVertexConsumer.java +++ b/src/main/java/com/radiance/client/vertex/PBRVertexConsumer.java @@ -1,42 +1,20 @@ package com.radiance.client.vertex; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_ALBEDO_EMISSION; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_COLOR_LAYER; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_GLINT_TEXTURE; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_GLINT_UV; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_LIGHT_UV; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_NORM; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_OVERLAY_UV; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_POS; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_POST_BASE; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_TEXTURE_ID; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_TEXTURE_UV; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_COLOR_LAYER; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_GLINT; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_LIGHT; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_NORM; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_OVERLAY; -import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_TEXTURE; - import java.nio.ByteOrder; -import java.util.stream.Collectors; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BuiltBuffer; +import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderPhase; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormatElement; import net.minecraft.client.texture.MissingSprite; -import net.minecraft.client.util.BufferAllocator; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; import net.minecraft.util.math.Direction; +import com.radiance.mixins.vulkan_render_integration.BufferBuilderMixins; import org.jetbrains.annotations.Nullable; import org.joml.Matrix3f; import org.joml.Matrix4f; import org.joml.Vector3f; -import org.lwjgl.system.MemoryUtil; public class PBRVertexConsumer implements VertexConsumer { @@ -44,48 +22,61 @@ public class PBRVertexConsumer implements VertexConsumer { private static final int ALPHA_MODE_OPAQUE = 0; private static final int ALPHA_MODE_CUTOUT = 1; private static final int ALPHA_MODE_TRANSPARENT = 2; + private static final int DEFAULT_INITIAL_BUFFER_SIZE = 32 * 1024; - private final BufferAllocator allocator; + private final BufferBuilder bufferBuilder; private final VertexFormat format; private final VertexFormat.DrawMode drawMode; - - private final int vertexSizeByte; - private final int writableMask; - private final int requiredMask; - private final int[] offsetsByElementId; - private final float albedoEmission = 0; - private long vertexPointer = -1L; private int vertexCount = 0; - private int currentMask = 0; private boolean building = true; private int textureID; private final int alphaMode; private float baseX = 0; private float baseY = 0; private float baseZ = 0; + private boolean hasPendingVertex; + private float pendingX; + private float pendingY; + private float pendingZ; + private boolean useNorm; + private float normX; + private float normY; + private float normZ; + private boolean useColorLayer; + private float colorR; + private float colorG; + private float colorB; + private float colorA; + private boolean useTexture; + private float textureU; + private float textureV; + private boolean useOverlay; + private int overlayU; + private int overlayV; + private boolean useGlint; + private float glintU; + private float glintV; + private int glintTextureID; + private boolean useLight; + private int lightU; + private int lightV; + private float albedoEmission; + + public PBRVertexConsumer(int initialSize, RenderLayer renderLayer) { + this(VertexFormat.DrawMode.QUADS, PBRVertexFormats.PBR_TRIANGLE, + Math.max(256, Math.min(initialSize, DEFAULT_INITIAL_BUFFER_SIZE)), renderLayer); + } - public PBRVertexConsumer(BufferAllocator allocator, RenderLayer renderLayer) { - this(allocator, VertexFormat.DrawMode.QUADS, PBRVertexFormats.PBR_TRIANGLE, renderLayer); + public PBRVertexConsumer(RenderLayer renderLayer) { + this(DEFAULT_INITIAL_BUFFER_SIZE, renderLayer); } - private PBRVertexConsumer(BufferAllocator allocator, VertexFormat.DrawMode drawMode, - VertexFormat format, RenderLayer renderLayer) { - this.allocator = allocator; + private PBRVertexConsumer(VertexFormat.DrawMode drawMode, VertexFormat format, int initialSize, + RenderLayer renderLayer) { + this.bufferBuilder = new BufferBuilder(initialSize); this.drawMode = drawMode; this.format = format; - - this.vertexSizeByte = format.getVertexSizeByte(); - this.writableMask = format.getRequiredMask() & ~PBR_POS.getBit(); - this.requiredMask = 0; - this.offsetsByElementId = format.getOffsetsByElementId(); - - if (this.vertexSizeByte != 128) { - throw new IllegalStateException( - "PBR vertex stride must be 128, got " + this.vertexSizeByte); - } - if (!format.has(PBR_POS)) { - throw new IllegalArgumentException("PBR format must contain POSITION element"); - } + this.bufferBuilder.begin(drawMode, format); if (renderLayer instanceof RenderLayer.MultiPhase) { Identifier @@ -102,12 +93,7 @@ private PBRVertexConsumer(BufferAllocator allocator, VertexFormat.DrawMode drawM } private static void putInt(long ptr, int v) { - if (LITTLE_ENDIAN) { - MemoryUtil.memPutInt(ptr, v); - } else { - MemoryUtil.memPutShort(ptr, (short) (v & 0xFFFF)); - MemoryUtil.memPutShort(ptr + 2L, (short) ((v >>> 16) & 0xFFFF)); - } + throw new UnsupportedOperationException("Pointer writes are not used on 1.20.1"); } private static int getAlphaMode(RenderLayer renderLayer) { @@ -123,11 +109,9 @@ private static int getAlphaMode(RenderLayer renderLayer) { return ALPHA_MODE_CUTOUT; } - if (RenderPhase.NO_TRANSPARENCY.equals(multiPhase.phases.transparency)) { - return ALPHA_MODE_CUTOUT; - } - - return ALPHA_MODE_TRANSPARENT; + return multiPhase.name.contains("translucent") || multiPhase.name.contains("glint") + || multiPhase.name.contains("lightning") ? ALPHA_MODE_TRANSPARENT : + ALPHA_MODE_CUTOUT; } public VertexFormat getFormat() { @@ -151,269 +135,248 @@ private void ensureBuilding() { } @Nullable - public BuiltBuffer endNullable() { + public BufferBuilder.BuiltBuffer endNullable() { ensureBuilding(); - endVertex(); - BuiltBuffer built = build(); + flushPendingVertex(); + BufferBuilder.BuiltBuffer built = this.vertexCount == 0 ? null : this.bufferBuilder.endNullable(); building = false; - vertexPointer = -1L; return built; } - public BuiltBuffer end() { - BuiltBuffer built = endNullable(); + public BufferBuilder.BuiltBuffer end() { + BufferBuilder.BuiltBuffer built = endNullable(); if (built == null) { throw new IllegalStateException("PBRBufferBuilder was empty"); } return built; } - @Nullable - private BuiltBuffer build() { - if (vertexCount == 0) { - return null; + public void close() { + if (this.building) { + this.bufferBuilder.clear(); + this.building = false; } + } - BufferAllocator.CloseableBuffer buf = allocator.getAllocated(); - if (buf == null) { - return null; + private void writeInt(int offset, int value) { + if (LITTLE_ENDIAN) { + this.bufferBuilder.putByte(offset, (byte) (value & 0xFF)); + this.bufferBuilder.putByte(offset + 1, (byte) ((value >>> 8) & 0xFF)); + this.bufferBuilder.putByte(offset + 2, (byte) ((value >>> 16) & 0xFF)); + this.bufferBuilder.putByte(offset + 3, (byte) ((value >>> 24) & 0xFF)); + } else { + this.bufferBuilder.putByte(offset, (byte) ((value >>> 24) & 0xFF)); + this.bufferBuilder.putByte(offset + 1, (byte) ((value >>> 16) & 0xFF)); + this.bufferBuilder.putByte(offset + 2, (byte) ((value >>> 8) & 0xFF)); + this.bufferBuilder.putByte(offset + 3, (byte) (value & 0xFF)); } - - int indexCount = drawMode.getIndexCount(vertexCount); - VertexFormat.IndexType indexType = VertexFormat.IndexType.smallestFor(vertexCount); - return new BuiltBuffer(buf, - new BuiltBuffer.DrawParameters(format, vertexCount, indexCount, drawMode, indexType)); } - private long beginVertex() { - ensureBuilding(); - endVertex(); - - vertexCount++; - long ptr = allocator.allocate(vertexSizeByte); - vertexPointer = ptr; - MemoryUtil.memSet(ptr, 0, vertexSizeByte); - - if (this.textureID != 0) { - int off = this.offsetsByElementId[PBR_TEXTURE_ID.id()]; - if (off >= 0) { - putInt(ptr + off, this.textureID); - } - } + private void writeFlag(boolean enabled) { + writeInt(0, enabled ? 1 : 0); + this.bufferBuilder.nextElement(); + } - int offBase = this.offsetsByElementId[PBR_POST_BASE.id()]; - if (offBase >= 0) { - MemoryUtil.memPutFloat(ptr + offBase, baseX); - MemoryUtil.memPutFloat(ptr + offBase + 4L, baseY); - MemoryUtil.memPutFloat(ptr + offBase + 8L, baseZ); - // Reuse the trailing padding word after postBase for alpha mode. - putInt(ptr + offBase + 12L, this.alphaMode); + private void flushPendingVertex() { + if (!this.hasPendingVertex) { + return; } - return ptr; + ensureBuilding(); + ((BufferBuilderMixins) (Object) this.bufferBuilder).radiance$grow(this.format.getVertexSizeByte()); + + this.bufferBuilder.putFloat(0, pendingX); + this.bufferBuilder.putFloat(4, pendingY); + this.bufferBuilder.putFloat(8, pendingZ); + this.bufferBuilder.nextElement(); + + writeFlag(this.useNorm); + this.bufferBuilder.putFloat(0, this.normX); + this.bufferBuilder.putFloat(4, this.normY); + this.bufferBuilder.putFloat(8, this.normZ); + this.bufferBuilder.nextElement(); + + writeFlag(this.useColorLayer); + this.bufferBuilder.putFloat(0, this.colorR); + this.bufferBuilder.putFloat(4, this.colorG); + this.bufferBuilder.putFloat(8, this.colorB); + this.bufferBuilder.putFloat(12, this.colorA); + this.bufferBuilder.nextElement(); + + writeFlag(this.useTexture); + writeFlag(this.useOverlay); + this.bufferBuilder.putFloat(0, this.textureU); + this.bufferBuilder.putFloat(4, this.textureV); + this.bufferBuilder.nextElement(); + + writeInt(0, this.overlayU); + writeInt(4, this.overlayV); + this.bufferBuilder.nextElement(); + + writeFlag(this.useGlint); + writeInt(0, this.textureID); + this.bufferBuilder.nextElement(); + + this.bufferBuilder.putFloat(0, this.glintU); + this.bufferBuilder.putFloat(4, this.glintV); + this.bufferBuilder.nextElement(); + + writeInt(0, this.glintTextureID); + this.bufferBuilder.nextElement(); + writeFlag(this.useLight); + writeInt(0, this.lightU); + writeInt(4, this.lightV); + this.bufferBuilder.nextElement(); + + writeInt(0, 0); + this.bufferBuilder.nextElement(); + this.bufferBuilder.putFloat(0, this.albedoEmission); + this.bufferBuilder.nextElement(); + + this.bufferBuilder.putFloat(0, this.baseX); + this.bufferBuilder.putFloat(4, this.baseY); + this.bufferBuilder.putFloat(8, this.baseZ); + writeInt(12, this.alphaMode); + this.bufferBuilder.nextElement(); + this.bufferBuilder.next(); + + this.vertexCount++; + this.hasPendingVertex = false; } - private long beginVertex(int glintTextureID) { + private void beginVertex(float x, float y, float z, int glintTextureID) { + flushPendingVertex(); ensureBuilding(); - endVertex(); - - vertexCount++; - long ptr = allocator.allocate(vertexSizeByte); - vertexPointer = ptr; - MemoryUtil.memSet(ptr, 0, vertexSizeByte); - - if (this.textureID != 0) { - int off = this.offsetsByElementId[PBR_TEXTURE_ID.id()]; - if (off >= 0) { - putInt(ptr + off, this.textureID); - } - } - - int offBase = this.offsetsByElementId[PBR_POST_BASE.id()]; - if (offBase >= 0) { - MemoryUtil.memPutFloat(ptr + offBase, baseX); - MemoryUtil.memPutFloat(ptr + offBase + 4L, baseY); - MemoryUtil.memPutFloat(ptr + offBase + 8L, baseZ); - // Reuse the trailing padding word after postBase for alpha mode. - putInt(ptr + offBase + 12L, this.alphaMode); - } - - if (glintTextureID != 0) { - int off = this.offsetsByElementId[PBR_GLINT_TEXTURE.id()]; - if (off >= 0) { - putInt(ptr + off, glintTextureID); - } - } - - return ptr; + this.hasPendingVertex = true; + this.pendingX = Float.isNaN(x) ? 0 : x; + this.pendingY = Float.isNaN(y) ? 0 : y; + this.pendingZ = Float.isNaN(z) ? 0 : z; + this.useNorm = false; + this.normX = 0; + this.normY = 0; + this.normZ = 0; + this.useColorLayer = false; + this.colorR = 0; + this.colorG = 0; + this.colorB = 0; + this.colorA = 0; + this.useTexture = false; + this.textureU = 0; + this.textureV = 0; + this.useOverlay = false; + this.overlayU = 0; + this.overlayV = 0; + this.useGlint = false; + this.glintU = 0; + this.glintV = 0; + this.glintTextureID = glintTextureID; + this.useLight = false; + this.lightU = 0; + this.lightV = 0; + this.albedoEmission = 0; } - private long beginElement(VertexFormatElement element) { - int mask = currentMask; - int bit = element.getBit(); - if ((mask & bit) == 0) { - return -1L; - } + void useGlint(float u, float v) { + this.useGlint = true; + this.glintU = u; + this.glintV = v; + } - currentMask = mask & ~bit; + void useGlintTexture(int glintTextureID) { + this.glintTextureID = glintTextureID; + this.useGlint = glintTextureID != 0; + } - long base = vertexPointer; - if (base == -1L) { + private void ensureVertexStarted() { + if (!this.hasPendingVertex) { throw new IllegalStateException("Not currently building vertex"); } - - int id = element.id(); - int off = offsetsByElementId[id]; - if (off < 0) { - throw new IllegalStateException( - "Element present in mask but not in format: " + element); - } - return base + off; } - private void endVertex() { - if (vertexCount == 0) { - return; - } - - int missing = currentMask & requiredMask; - if (missing != 0) { - String - s = - VertexFormatElement.streamFromMask(currentMask) - .map(format::getName) - .collect(Collectors.joining(", ")); - throw new IllegalStateException("Missing elements in vertex: " + s); - } + @Override + public VertexConsumer vertex(double x, double y, double z) { + beginVertex((float) x, (float) y, (float) z, 0); + return this; } - @Override public VertexConsumer vertex(float x, float y, float z) { - long base = beginVertex(); - currentMask = writableMask; - - int posOff = offsetsByElementId[PBR_POS.id()]; - long p = base + posOff; - - if (Float.isNaN(x) || Float.isNaN(y) || Float.isNaN(z)) { - MemoryUtil.memPutFloat(p, 0); - MemoryUtil.memPutFloat(p + 4L, 0); - MemoryUtil.memPutFloat(p + 8L, 0); - } else { - MemoryUtil.memPutFloat(p, x); - MemoryUtil.memPutFloat(p + 4L, y); - MemoryUtil.memPutFloat(p + 8L, z); - } - + beginVertex(x, y, z, 0); return this; } public VertexConsumer vertex(float x, float y, float z, int glintTextureID) { - long base = beginVertex(glintTextureID); - currentMask = writableMask; - - int posOff = offsetsByElementId[PBR_POS.id()]; - long p = base + posOff; - - if (Float.isNaN(x) || Float.isNaN(y) || Float.isNaN(z)) { - MemoryUtil.memPutFloat(p, 0); - MemoryUtil.memPutFloat(p + 4L, 0); - MemoryUtil.memPutFloat(p + 8L, 0); - } else { - MemoryUtil.memPutFloat(p, x); - MemoryUtil.memPutFloat(p + 4L, y); - MemoryUtil.memPutFloat(p + 8L, z); - } - + beginVertex(x, y, z, glintTextureID); return this; } @Override public VertexConsumer color(int red, int green, int blue, int alpha) { - long f = beginElement(PBR_USE_COLOR_LAYER); - if (f != -1L) { - putInt(f, 1); - } - - long p = beginElement(PBR_COLOR_LAYER); - if (p != -1L) { - MemoryUtil.memPutFloat(p, red / 255.0f); - MemoryUtil.memPutFloat(p + 4L, green / 255.0f); - MemoryUtil.memPutFloat(p + 8L, blue / 255.0f); - MemoryUtil.memPutFloat(p + 12L, alpha / 255.0f); - } + ensureVertexStarted(); + this.useColorLayer = true; + this.colorR = red / 255.0f; + this.colorG = green / 255.0f; + this.colorB = blue / 255.0f; + this.colorA = alpha / 255.0f; return this; } @Override public VertexConsumer texture(float u, float v) { - long f = beginElement(PBR_USE_TEXTURE); - if (f != -1L) { - putInt(f, 1); - } - - long p = beginElement(PBR_TEXTURE_UV); - if (p != -1L) { - MemoryUtil.memPutFloat(p, u); - MemoryUtil.memPutFloat(p + 4L, v); - } + ensureVertexStarted(); + this.useTexture = true; + this.textureU = u; + this.textureV = v; return this; } @Override public VertexConsumer overlay(int u, int v) { - long f = beginElement(PBR_USE_OVERLAY); - if (f != -1L) { - putInt(f, 1); - } - - long p = beginElement(PBR_OVERLAY_UV); - if (p != -1L) { - putInt(p, u); - putInt(p + 4L, v); - } + ensureVertexStarted(); + this.useOverlay = true; + this.overlayU = u; + this.overlayV = v; return this; } @Override public VertexConsumer light(int u, int v) { - long f = beginElement(PBR_USE_LIGHT); - if (f != -1L) { - putInt(f, 1); - } - - long p = beginElement(PBR_LIGHT_UV); - if (p != -1L) { - putInt(p, u); - putInt(p + 4L, v); - } + ensureVertexStarted(); + this.useLight = true; + this.lightU = u; + this.lightV = v; return this; } @Override public VertexConsumer normal(float x, float y, float z) { - long f = beginElement(PBR_USE_NORM); - if (f != -1L) { - putInt(f, 1); - } - - long p = beginElement(PBR_NORM); - if (p != -1L) { - MemoryUtil.memPutFloat(p, x); - MemoryUtil.memPutFloat(p + 4L, y); - MemoryUtil.memPutFloat(p + 8L, z); - } + ensureVertexStarted(); + this.useNorm = true; + this.normX = x; + this.normY = y; + this.normZ = z; return this; } public VertexConsumer albedoEmission(float emission) { - long p = beginElement(PBR_ALBEDO_EMISSION); - if (p != -1L) { - MemoryUtil.memPutFloat(p, emission); - } + ensureVertexStarted(); + this.albedoEmission = emission; return this; } + @Override + public void next() { + flushPendingVertex(); + } + + @Override + public void fixedColor(int red, int green, int blue, int alpha) { + this.color(red, green, blue, alpha); + } + + @Override + public void unfixColor() { + } + public static class GLint implements VertexConsumer { private final PBRVertexConsumer delegate; @@ -435,8 +398,9 @@ public GLint(PBRVertexConsumer delegate, RenderLayer glintRenderLayer) { } @Override - public VertexConsumer vertex(float x, float y, float z) { - delegate.vertex(x, y, z, this.glintTextureID); + public VertexConsumer vertex(double x, double y, double z) { + delegate.useGlintTexture(this.glintTextureID); + delegate.vertex((float) x, (float) y, (float) z, this.glintTextureID); return this; } @@ -449,17 +413,7 @@ public VertexConsumer color(int red, int green, int blue, int alpha) { @Override public VertexConsumer texture(float u, float v) { delegate.texture(u, v); - - long f = delegate.beginElement(PBR_USE_GLINT); - if (f != -1L) { - putInt(f, 1); - } - - long p = delegate.beginElement(PBR_GLINT_UV); - if (p != -1L) { - MemoryUtil.memPutFloat(p, u); - MemoryUtil.memPutFloat(p + 4L, v); - } + delegate.useGlint(u, v); return this; } @@ -480,6 +434,21 @@ public VertexConsumer normal(float x, float y, float z) { delegate.normal(x, y, z); return this; } + + @Override + public void next() { + delegate.next(); + } + + @Override + public void fixedColor(int red, int green, int blue, int alpha) { + delegate.fixedColor(red, green, blue, alpha); + } + + @Override + public void unfixColor() { + delegate.unfixColor(); + } } public static class GLintOverlay implements VertexConsumer { @@ -516,10 +485,20 @@ public GLintOverlay(PBRVertexConsumer delegate, RenderLayer glintRenderLayer, } @Override + public VertexConsumer vertex(double x, double y, double z) { + this.x = (float) x; + this.y = (float) y; + this.z = (float) z; + delegate.useGlintTexture(this.glintTextureID); + delegate.vertex(this.x, this.y, this.z, this.glintTextureID); + return this; + } + public VertexConsumer vertex(float x, float y, float z) { this.x = x; this.y = y; this.z = z; + delegate.useGlintTexture(this.glintTextureID); delegate.vertex(x, y, z, this.glintTextureID); return this; } @@ -558,18 +537,24 @@ public VertexConsumer normal(float x, float y, float z) { vector3f2.rotateY((float) Math.PI); vector3f2.rotateX((float) (-Math.PI / 2)); vector3f2.rotate(direction.getRotationQuaternion()); + delegate.useGlint(-vector3f2.x() * this.textureScale, + -vector3f2.y() * this.textureScale); + return this; + } - long f = delegate.beginElement(PBR_USE_GLINT); - if (f != -1L) { - putInt(f, 1); - } + @Override + public void next() { + delegate.next(); + } - long p = delegate.beginElement(PBR_GLINT_UV); - if (p != -1L) { - MemoryUtil.memPutFloat(p, -vector3f2.x() * this.textureScale); - MemoryUtil.memPutFloat(p + 4L, -vector3f2.y() * this.textureScale); - } - return this; + @Override + public void fixedColor(int red, int green, int blue, int alpha) { + delegate.fixedColor(red, green, blue, alpha); + } + + @Override + public void unfixColor() { + delegate.unfixColor(); } } } diff --git a/src/main/java/com/radiance/client/vertex/PBRVertexFormatElements.java b/src/main/java/com/radiance/client/vertex/PBRVertexFormatElements.java index 9a9309b..b46591c 100644 --- a/src/main/java/com/radiance/client/vertex/PBRVertexFormatElements.java +++ b/src/main/java/com/radiance/client/vertex/PBRVertexFormatElements.java @@ -6,91 +6,96 @@ public class PBRVertexFormatElements { public static final VertexFormatElement PBR_POS = - VertexFormatElement.register(6, 0, VertexFormatElement.ComponentType.FLOAT, - VertexFormatElement.Usage.GENERIC, 3); + new VertexFormatElement(0, VertexFormatElement.ComponentType.FLOAT, + VertexFormatElement.Type.GENERIC, 3); public static final VertexFormatElement PBR_USE_NORM = - VertexFormatElement.register(7, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_NORM = - VertexFormatElement.register(8, 0, VertexFormatElement.ComponentType.FLOAT, - VertexFormatElement.Usage.GENERIC, 3); + new VertexFormatElement(0, VertexFormatElement.ComponentType.FLOAT, + VertexFormatElement.Type.GENERIC, 3); public static final VertexFormatElement PBR_USE_COLOR_LAYER = - VertexFormatElement.register(9, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_COLOR_LAYER = - VertexFormatElement.register(10, 0, VertexFormatElement.ComponentType.FLOAT, - VertexFormatElement.Usage.GENERIC, 4); + new VertexFormatElement(0, VertexFormatElement.ComponentType.FLOAT, + VertexFormatElement.Type.GENERIC, 4); public static final VertexFormatElement PBR_USE_TEXTURE = - VertexFormatElement.register(11, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_USE_OVERLAY = - VertexFormatElement.register(12, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_TEXTURE_UV = - VertexFormatElement.register(13, 0, VertexFormatElement.ComponentType.FLOAT, - VertexFormatElement.Usage.GENERIC, 2); + new VertexFormatElement(0, VertexFormatElement.ComponentType.FLOAT, + VertexFormatElement.Type.GENERIC, 2); public static final VertexFormatElement PBR_OVERLAY_UV = - VertexFormatElement.register(14, 0, VertexFormatElement.ComponentType.INT, - VertexFormatElement.Usage.UV, 2); + new VertexFormatElement(0, VertexFormatElement.ComponentType.INT, + VertexFormatElement.Type.UV, 2); public static final VertexFormatElement PBR_USE_GLINT = - VertexFormatElement.register(15, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_TEXTURE_ID = - VertexFormatElement.register(16, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_GLINT_UV = - VertexFormatElement.register(17, 0, VertexFormatElement.ComponentType.FLOAT, - VertexFormatElement.Usage.GENERIC, 2); + new VertexFormatElement(0, VertexFormatElement.ComponentType.FLOAT, + VertexFormatElement.Type.GENERIC, 2); public static final VertexFormatElement PBR_GLINT_TEXTURE = - VertexFormatElement.register(18, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_USE_LIGHT = - VertexFormatElement.register(19, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_LIGHT_UV = - VertexFormatElement.register(20, 0, VertexFormatElement.ComponentType.INT, - VertexFormatElement.Usage.UV, 2); + new VertexFormatElement(0, VertexFormatElement.ComponentType.INT, + VertexFormatElement.Type.UV, 2); public static final VertexFormatElement PBR_COORDINATE = - VertexFormatElement.register(21, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); public static final VertexFormatElement PBR_POST_BASE = - VertexFormatElement.register(22, 0, VertexFormatElement.ComponentType.FLOAT, - VertexFormatElement.Usage.GENERIC, 3); + new VertexFormatElement(0, VertexFormatElement.ComponentType.FLOAT, + VertexFormatElement.Type.GENERIC, 3); public static final VertexFormatElement PBR_ALBEDO_EMISSION = - VertexFormatElement.register(23, 0, VertexFormatElement.ComponentType.UINT, - VertexFormatElement.Usage.UV, 1); + new VertexFormatElement(0, VertexFormatElement.ComponentType.UINT, + VertexFormatElement.Type.UV, 1); + + public static final VertexFormatElement + PBR_PADDING = + new VertexFormatElement(0, VertexFormatElement.ComponentType.BYTE, + VertexFormatElement.Type.PADDING, 4); } diff --git a/src/main/java/com/radiance/client/vertex/PBRVertexFormats.java b/src/main/java/com/radiance/client/vertex/PBRVertexFormats.java index 4057d00..1946ebd 100644 --- a/src/main/java/com/radiance/client/vertex/PBRVertexFormats.java +++ b/src/main/java/com/radiance/client/vertex/PBRVertexFormats.java @@ -8,6 +8,7 @@ import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_LIGHT_UV; import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_NORM; import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_OVERLAY_UV; +import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_PADDING; import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_POS; import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_POST_BASE; import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_TEXTURE_ID; @@ -19,39 +20,33 @@ import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_OVERLAY; import static com.radiance.client.vertex.PBRVertexFormatElements.PBR_USE_TEXTURE; +import com.google.common.collect.ImmutableMap; import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormatElement; public class PBRVertexFormats { public static final VertexFormat PBR_TRIANGLE = - VertexFormat.builder() - .add("Pos", PBR_POS) - .add("UseNorm", PBR_USE_NORM) - - .add("Norm", PBR_NORM) - .add("UseColorLayer", PBR_USE_COLOR_LAYER) - - .add("ColorLayer", PBR_COLOR_LAYER) - - .add("UseTexture", PBR_USE_TEXTURE) - .add("UseOverlay", PBR_USE_OVERLAY) - .add("TextureUV", PBR_TEXTURE_UV) - - .add("OverlayUV", PBR_OVERLAY_UV) - .add("UseGlint", PBR_USE_GLINT) - .add("TextureID", PBR_TEXTURE_ID) - - .add("GlintUV", PBR_GLINT_UV) - .add("GlintTexture", PBR_GLINT_TEXTURE) - .add("UseLight", PBR_USE_LIGHT) - - .add("LightUV", PBR_LIGHT_UV) - .add("Coordinate", PBR_COORDINATE) - .add("AlbedoEmission", PBR_ALBEDO_EMISSION) - - .add("PostBase", PBR_POST_BASE) - - .skip(4) - .build(); + new VertexFormat(ImmutableMap.builder() + .put("Pos", PBR_POS) + .put("UseNorm", PBR_USE_NORM) + .put("Norm", PBR_NORM) + .put("UseColorLayer", PBR_USE_COLOR_LAYER) + .put("ColorLayer", PBR_COLOR_LAYER) + .put("UseTexture", PBR_USE_TEXTURE) + .put("UseOverlay", PBR_USE_OVERLAY) + .put("TextureUV", PBR_TEXTURE_UV) + .put("OverlayUV", PBR_OVERLAY_UV) + .put("UseGlint", PBR_USE_GLINT) + .put("TextureID", PBR_TEXTURE_ID) + .put("GlintUV", PBR_GLINT_UV) + .put("GlintTexture", PBR_GLINT_TEXTURE) + .put("UseLight", PBR_USE_LIGHT) + .put("LightUV", PBR_LIGHT_UV) + .put("Coordinate", PBR_COORDINATE) + .put("AlbedoEmission", PBR_ALBEDO_EMISSION) + .put("PostBase", PBR_POST_BASE) + .put("Padding", PBR_PADDING) + .build()); } diff --git a/src/main/java/com/radiance/client/vertex/StorageOutlineVertexConsumerProvider.java b/src/main/java/com/radiance/client/vertex/StorageOutlineVertexConsumerProvider.java index ce32e44..c24f866 100644 --- a/src/main/java/com/radiance/client/vertex/StorageOutlineVertexConsumerProvider.java +++ b/src/main/java/com/radiance/client/vertex/StorageOutlineVertexConsumerProvider.java @@ -57,11 +57,11 @@ record OutlineVertexConsumer(VertexConsumer delegate, int color) implements Vert public OutlineVertexConsumer(VertexConsumer delegate, int red, int green, int blue, int alpha) { - this(delegate, ColorHelper.getArgb(alpha, red, green, blue)); + this(delegate, ColorHelper.Argb.getArgb(alpha, red, green, blue)); } @Override - public VertexConsumer vertex(float x, float y, float z) { + public VertexConsumer vertex(double x, double y, double z) { this.delegate.vertex(x, y, z) .color(this.color); return this; @@ -92,5 +92,18 @@ public VertexConsumer light(int u, int v) { public VertexConsumer normal(float x, float y, float z) { return this; } + + @Override + public void next() { + this.delegate.next(); + } + + @Override + public void fixedColor(int red, int green, int blue, int alpha) { + } + + @Override + public void unfixColor() { + } } } diff --git a/src/main/java/com/radiance/client/vertex/StorageVertexConsumerProvider.java b/src/main/java/com/radiance/client/vertex/StorageVertexConsumerProvider.java index 05223e3..0454fc1 100644 --- a/src/main/java/com/radiance/client/vertex/StorageVertexConsumerProvider.java +++ b/src/main/java/com/radiance/client/vertex/StorageVertexConsumerProvider.java @@ -10,13 +10,11 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.util.BufferAllocator; @Environment(EnvType.CLIENT) public class StorageVertexConsumerProvider implements VertexConsumerProvider { protected final Map pending = new HashMap<>(); - protected final Map allocated = new HashMap<>(); private int size = 0; @@ -24,27 +22,22 @@ public StorageVertexConsumerProvider(int size) { this.size = size; } - private static void assignBufferBuilder( - Object2ObjectLinkedOpenHashMap builderStorage, - RenderLayer layer) { - builderStorage.put(layer, new BufferAllocator(layer.getExpectedBufferSize())); - } - @Override public VertexConsumer getBuffer(RenderLayer renderLayer) { VertexConsumer vertexConsumer = this.pending.get(renderLayer); if (vertexConsumer == null) { - BufferAllocator bufferAllocator = new BufferAllocator(size); - allocated.put(renderLayer, bufferAllocator); - VertexFormat.DrawMode drawMode = renderLayer.getDrawMode(); VertexFormat vertexFormat = renderLayer.getVertexFormat(); + int initialSize = Math.max(256, + Math.min(this.size, renderLayer.getExpectedBufferSize())); if (drawMode == VertexFormat.DrawMode.QUADS) { - vertexConsumer = new PBRVertexConsumer(bufferAllocator, renderLayer); + vertexConsumer = new PBRVertexConsumer(initialSize, renderLayer); } else { - vertexConsumer = new BufferBuilder(bufferAllocator, drawMode, vertexFormat); + BufferBuilder bufferBuilder = new BufferBuilder(initialSize); + bufferBuilder.begin(drawMode, vertexFormat); + vertexConsumer = bufferBuilder; } this.pending.put(renderLayer, vertexConsumer); } @@ -56,10 +49,13 @@ public Map getLayers() { } public void close() { - for (Map.Entry entry : this.allocated.entrySet()) { - entry.getValue() - .close(); + for (VertexConsumer vertexConsumer : this.pending.values()) { + if (vertexConsumer instanceof PBRVertexConsumer pbrVertexConsumer) { + pbrVertexConsumer.close(); + } else if (vertexConsumer instanceof BufferBuilder bufferBuilder) { + bufferBuilder.clear(); + } } this.pending.clear(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/radiance/mixin_related/extensions/vanilla_resource_tracker/IGlyphAtlasTextureExt.java b/src/main/java/com/radiance/mixin_related/extensions/vanilla_resource_tracker/IGlyphAtlasTextureExt.java index 8b1009c..3307121 100644 --- a/src/main/java/com/radiance/mixin_related/extensions/vanilla_resource_tracker/IGlyphAtlasTextureExt.java +++ b/src/main/java/com/radiance/mixin_related/extensions/vanilla_resource_tracker/IGlyphAtlasTextureExt.java @@ -1,8 +1,4 @@ package com.radiance.mixin_related.extensions.vanilla_resource_tracker; -import net.minecraft.client.font.BakedGlyph; - public interface IGlyphAtlasTextureExt { - - BakedGlyph radiance$bake(IRenderableGlyphExt glyph); } diff --git a/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderBuiltChunkExt.java b/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderBuiltChunkExt.java index 5a1aae8..7acbeb1 100644 --- a/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderBuiltChunkExt.java +++ b/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderBuiltChunkExt.java @@ -1,8 +1,12 @@ package com.radiance.mixin_related.extensions.vulkan_render_integration; +import java.util.Collection; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.render.chunk.ChunkBuilder; public interface IChunkBuilderBuiltChunkExt { ChunkBuilder radiance$getChunkBuilder(); + + void radiance$setNoCullingBlockEntities(Collection blockEntities); } diff --git a/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderExt.java b/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderExt.java index e660b7f..e30b183 100644 --- a/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderExt.java +++ b/src/main/java/com/radiance/mixin_related/extensions/vulkan_render_integration/IChunkBuilderExt.java @@ -1,14 +1,8 @@ package com.radiance.mixin_related.extensions.vulkan_render_integration; -import net.minecraft.client.render.chunk.BlockBufferAllocatorStorage; -import net.minecraft.client.render.chunk.SectionBuilder; import net.minecraft.client.world.ClientWorld; public interface IChunkBuilderExt { - SectionBuilder radiance$getSectionBuilder(); - ClientWorld radiance$getWorld(); - - BlockBufferAllocatorStorage radiance$getBuffers(); } diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BitmapFontGlyphMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BitmapFontGlyphMixins.java index 544c5e8..b90bdf2 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BitmapFontGlyphMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BitmapFontGlyphMixins.java @@ -1,93 +1,8 @@ package com.radiance.mixins.vanilla_resource_tracker; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.INativeImageExt; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IRenderableGlyphExt; -import java.util.function.Function; -import net.minecraft.client.font.BakedGlyph; -import net.minecraft.client.font.BitmapFont; -import net.minecraft.client.font.RenderableGlyph; -import net.minecraft.client.texture.NativeImage; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; +// TODO 1.20.1: revisit glyph baking integration once the legacy font API is remapped. +public final class BitmapFontGlyphMixins { -@Mixin(BitmapFont.BitmapFontGlyph.class) -public abstract class BitmapFontGlyphMixins { - - @Shadow - @Final - float scaleFactor; - - @Shadow - @Final - int x; - - @Shadow - @Final - int y; - - @Shadow - @Final - int width; - - @Shadow - @Final - int height; - - @Shadow - @Final - int ascent; - - @Shadow - @Final - NativeImage image; - - /** - * @author LJIONG - * @reason to pass image targetID - */ - @Overwrite - public BakedGlyph bake(Function function) { - return function.apply(new IRenderableGlyphExt() { - @Override - public float getOversample() { - return 1.0f / scaleFactor; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public float getAscent() { - return ascent; - } - - @Override - public void upload(int u, int v) { - // 这里的反编译有坑! - // u,v 是写入到目标纹理图集的坐标;x, y 是从字形位图中取像素的起点 - image.upload(0, u, v, x, y, width, height, false); - } - - @Override - public void upload(int id, int u, int v) { - ((INativeImageExt) (Object) image).radiance$setTargetID(id); - upload(u, v); - } - - @Override - public boolean hasColor() { - return image.getFormat() - .getChannelCount() > 1; - } - }); + private BitmapFontGlyphMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BuiltinEmptyGlyphMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BuiltinEmptyGlyphMixins.java index 603aac4..0b6021c 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BuiltinEmptyGlyphMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/BuiltinEmptyGlyphMixins.java @@ -1,62 +1,8 @@ package com.radiance.mixins.vanilla_resource_tracker; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.INativeImageExt; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IRenderableGlyphExt; -import java.util.function.Function; -import net.minecraft.client.font.BakedGlyph; -import net.minecraft.client.font.BuiltinEmptyGlyph; -import net.minecraft.client.font.RenderableGlyph; -import net.minecraft.client.texture.NativeImage; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; +// TODO 1.20.1: revisit glyph baking integration once the legacy font API is remapped. +public final class BuiltinEmptyGlyphMixins { -@Mixin(BuiltinEmptyGlyph.class) -public abstract class BuiltinEmptyGlyphMixins { - - @Final - @Shadow - NativeImage image; - - /** - * @author LJIONG - * @reason to pass image targetID - */ - @Overwrite - public BakedGlyph bake(Function function) { - return function.apply(new IRenderableGlyphExt() { - - @Override - public int getWidth() { - return image.getWidth(); - } - - @Override - public int getHeight() { - return image.getHeight(); - } - - @Override - public float getOversample() { - return 1.0f; - } - - @Override - public void upload(int x, int y) { - image.upload(0, x, y, false); - } - - @Override - public void upload(int id, int x, int y) { - ((INativeImageExt) (Object) image).radiance$setTargetID(id); - upload(x, y); - } - - @Override - public boolean hasColor() { - return true; - } - }); + private BuiltinEmptyGlyphMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/FontStorageMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/FontStorageMixins.java index 2237eef..12ffd2f 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/FontStorageMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/FontStorageMixins.java @@ -1,36 +1,8 @@ package com.radiance.mixins.vanilla_resource_tracker; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IGlyphAtlasTextureExt; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IRenderableGlyphExt; -import net.minecraft.client.font.BakedGlyph; -import net.minecraft.client.font.FontStorage; -import net.minecraft.client.font.GlyphAtlasTexture; -import net.minecraft.client.font.RenderableGlyph; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +// TODO 1.20.1: revisit glyph baking integration once the legacy font API is remapped. +public final class FontStorageMixins { -@Mixin(FontStorage.class) -public class FontStorageMixins { - - @Inject(method = "bake(Lnet/minecraft/client/font/RenderableGlyph;)Lnet/minecraft/client/font/BakedGlyph;", at = @At(value = "HEAD")) - public void ensureIRenderableGlyph(RenderableGlyph c, CallbackInfoReturnable cir) { - if (!(c instanceof IRenderableGlyphExt)) { - throw new RuntimeException( - "RenderableGlyph expected to be instance of IRenderableGlyphExt"); - } - } - - @Redirect(method = "bake(Lnet/minecraft/client/font/RenderableGlyph;)Lnet/minecraft/client/font/BakedGlyph;", - at = @At(value = "INVOKE", - target = - "Lnet/minecraft/client/font/GlyphAtlasTexture;bake(Lnet/minecraft/client/font/RenderableGlyph;)" - + - "Lnet/minecraft/client/font/BakedGlyph;")) - public BakedGlyph redirectBakeToOneWithID(GlyphAtlasTexture instance, RenderableGlyph glyph) { - IRenderableGlyphExt renderableGlyphExt = (IRenderableGlyphExt) glyph; - return ((IGlyphAtlasTextureExt) instance).radiance$bake(renderableGlyphExt); + private FontStorageMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/GlyphAtlasTextureMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/GlyphAtlasTextureMixins.java index a7cc03c..e0e0634 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/GlyphAtlasTextureMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/GlyphAtlasTextureMixins.java @@ -1,50 +1,8 @@ package com.radiance.mixins.vanilla_resource_tracker; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IGlyphAtlasTextureExt; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IRenderableGlyphExt; -import net.minecraft.client.font.BakedGlyph; -import net.minecraft.client.font.GlyphAtlasTexture; -import net.minecraft.client.font.TextRenderLayerSet; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; +// TODO 1.20.1: revisit glyph baking integration once the legacy font API is remapped. +public final class GlyphAtlasTextureMixins { -@Mixin(GlyphAtlasTexture.class) -public abstract class GlyphAtlasTextureMixins extends AbstractTextureMixins implements - IGlyphAtlasTextureExt { - - @Final - @Shadow - private TextRenderLayerSet textRenderLayers; - @Final - @Shadow - private boolean hasColor; - @Final - @Shadow - private GlyphAtlasTexture.Slot rootSlot; - - @Override - public BakedGlyph radiance$bake(IRenderableGlyphExt glyph) { - if (glyph.hasColor() != this.hasColor) { - return null; - } - GlyphAtlasTexture.Slot slot = this.rootSlot.findSlotFor(glyph); - if (slot != null) { - this.bindTexture(); - glyph.upload(this.getGlId(), slot.x, slot.y); - float f = 256.0f; - float g = 256.0f; - float h = 0.01f; - return new BakedGlyph(this.textRenderLayers, - ((float) slot.x + 0.01f) / 256.0f, - ((float) slot.x - 0.01f + (float) glyph.getWidth()) / 256.0f, - ((float) slot.y + 0.01f) / 256.0f, - ((float) slot.y - 0.01f + (float) glyph.getHeight()) / 256.0f, - glyph.getXMin(), - glyph.getXMax(), - glyph.getYMin(), - glyph.getYMax()); - } - return null; + private GlyphAtlasTextureMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/OverlayTextureMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/OverlayTextureMixins.java index b2209fe..98161dc 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/OverlayTextureMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/OverlayTextureMixins.java @@ -19,7 +19,9 @@ public abstract class OverlayTextureMixins { @Shadow private NativeImageBackedTexture texture; - @Inject(method = "()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/NativeImage;upload(IIIIIIIZ)V")) + @Inject(method = "()V", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/texture/NativeImage;upload(IIIIIIIZZZZ)V")) public void setImageTargetIDBeforeUpload(CallbackInfo ci, @Local NativeImage nativeImage) { int id = texture.getGlId(); ((INativeImageExt) (Object) nativeImage).radiance$setTargetID(id); diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/ReloadableTextureMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/ReloadableTextureMixins.java index 1991a23..5dfb580 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/ReloadableTextureMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/ReloadableTextureMixins.java @@ -2,17 +2,17 @@ import com.radiance.mixin_related.extensions.vanilla_resource_tracker.INativeImageExt; import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.ReloadableTexture; +import net.minecraft.client.texture.ResourceTexture; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ReloadableTexture.class) +@Mixin(ResourceTexture.class) public abstract class ReloadableTextureMixins extends AbstractTextureMixins { - @Inject(method = "load(Lnet/minecraft/client/texture/NativeImage;ZZ)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/NativeImage;upload(IIIIIIIZ)V")) + @Inject(method = "upload(Lnet/minecraft/client/texture/NativeImage;ZZ)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/NativeImage;upload(IIIIIIIZZZZ)V")) public void setTargetIDBeforeUpload(NativeImage image, boolean blur, boolean clamp, CallbackInfo ci) { int id = getGlId(); diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/SpriteContentsMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/SpriteContentsMixins.java index 3cb913a..8e1dcf4 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/SpriteContentsMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/SpriteContentsMixins.java @@ -28,7 +28,8 @@ public class SpriteContentsMixins implements ISpriteContentsExt { } @Inject(method = "upload(IIII[Lnet/minecraft/client/texture/NativeImage;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/NativeImage;upload(IIIIIIIZ)V")) + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/texture/NativeImage;upload(IIIIIIIZZ)V")) public void setImageTargetIDBeforeUpload(int x, int y, int unpackSkipPixels, diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/TtfGlyphMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/TtfGlyphMixins.java index eb36fa0..a5056e7 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/TtfGlyphMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/TtfGlyphMixins.java @@ -1,104 +1,8 @@ package com.radiance.mixins.vanilla_resource_tracker; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.INativeImageExt; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IRenderableGlyphExt; -import java.util.function.Function; -import net.minecraft.client.font.BakedGlyph; -import net.minecraft.client.font.RenderableGlyph; -import net.minecraft.client.font.TrueTypeFont; -import net.minecraft.client.texture.NativeImage; -import org.lwjgl.util.freetype.FT_Face; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; +// TODO 1.20.1: revisit glyph baking integration once the legacy font API is remapped. +public final class TtfGlyphMixins { -@Mixin(TrueTypeFont.TtfGlyph.class) -public class TtfGlyphMixins { - - @Shadow - @Final - TrueTypeFont field_2336; - - @Final - @Shadow - int width; - - @Final - @Shadow - int height; - - @Final - @Shadow - float bearingX; - - @Final - @Shadow - float ascent; - - @Final - @Shadow - int glyphIndex; - - @Final - @Shadow - private float advance; - - /** - * @author LJIONG - * @reason to pass image targetID - */ - @Overwrite - public BakedGlyph bake(Function function) { - return function.apply(new IRenderableGlyphExt() { - - @Override - public int getWidth() { - return width; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public float getOversample() { - return field_2336.oversample; - } - - @Override - public float getBearingX() { - return bearingX; - } - - @Override - public float getAscent() { - return ascent; - } - - @Override - public void upload(int x, int y) { - throw new UnsupportedOperationException("Deprecated"); - } - - @Override - public void upload(int id, int x, int y) { - NativeImage nativeImage = new NativeImage(NativeImage.Format.LUMINANCE, width, - height, false); - FT_Face fT_Face = field_2336.getInfo(); - if (nativeImage.makeGlyphBitmapSubpixel(fT_Face, glyphIndex)) { - ((INativeImageExt) (Object) nativeImage).radiance$setTargetID(id); - nativeImage.upload(0, x, y, 0, 0, width, height, true); - } else { - nativeImage.close(); - } - } - - @Override - public boolean hasColor() { - return false; - } - }); + private TtfGlyphMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/UnicodeTextureGlyphMixins.java b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/UnicodeTextureGlyphMixins.java index c17a8c4..c16b15e 100644 --- a/src/main/java/com/radiance/mixins/vanilla_resource_tracker/UnicodeTextureGlyphMixins.java +++ b/src/main/java/com/radiance/mixins/vanilla_resource_tracker/UnicodeTextureGlyphMixins.java @@ -1,132 +1,8 @@ package com.radiance.mixins.vanilla_resource_tracker; -import com.mojang.blaze3d.systems.RenderSystem; -import com.radiance.client.proxy.vulkan.TextureProxy; -import com.radiance.mixin_related.extensions.vanilla_resource_tracker.IRenderableGlyphExt; -import java.nio.IntBuffer; -import java.util.function.Consumer; -import java.util.function.Function; -import net.minecraft.client.font.BakedGlyph; -import net.minecraft.client.font.RenderableGlyph; -import net.minecraft.client.font.UnihexFont; -import net.minecraft.client.texture.NativeImage; -import org.lwjgl.system.MemoryUtil; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; +// TODO 1.20.1: revisit glyph baking integration once the legacy font API is remapped. +public final class UnicodeTextureGlyphMixins { -@Mixin(UnihexFont.UnicodeTextureGlyph.class) -public abstract class UnicodeTextureGlyphMixins { - - @Final - @Shadow - public UnihexFont.BitmapGlyph contents; - - @Final - @Shadow - public int left; - - @Final - @Shadow - public int right; - - @Unique - private static void _upload(int id, - int level, - int offsetX, - int offsetY, - int width, - int height, - NativeImage.Format format, - IntBuffer pixels, - Consumer closer) { - try { - RenderSystem.assertOnRenderThreadOrInit(); - - if (!pixels.isDirect()) { - throw new IllegalArgumentException("pixels must be a direct buffer"); - } - long srcPointer = MemoryUtil.memAddress(pixels); - - int bytesPerPixel = switch (format) { - case NativeImage.Format.RGBA -> 4; - default -> throw new IllegalArgumentException("Unsupported format: " + format); - }; - - int srcSizeInBytes = width * height * bytesPerPixel; - int srcRowPixels = width; - int srcOffsetX = 0, srcOffsetY = 0; - - assert level == 0; - TextureProxy.queueUpload(srcPointer, srcSizeInBytes, srcRowPixels, id, srcOffsetX, - srcOffsetY, offsetX, offsetY, width, height, 0); - } finally { - closer.accept(pixels); - } - - } - - @Shadow - public abstract int width(); - - /** - * @author LJIONG - * @reason to pass image targetID - */ - @Overwrite - public BakedGlyph bake(Function function) { - return function.apply(new IRenderableGlyphExt() { - public float getOversample() { - return 2.0F; - } - - public int getWidth() { - return width(); - } - - public int getHeight() { - return 16; - } - - public void upload(int x, int y) { - throw new RuntimeException("Should never be called"); - } - - @Override - public void upload(int id, int u, int v) { - IntBuffer intBuffer = MemoryUtil.memAllocInt(width() * 16); - UnihexFont.addGlyphPixels(intBuffer, contents, left, right); - intBuffer.rewind(); - - if (id < 0) { - throw new IllegalArgumentException("Target ID has not been set"); - } - - intBuffer.rewind(); - - int level = 0; - int offsetX = u; - int offsetY = v; - int width = width(); - int height = 16; - NativeImage.Format format = NativeImage.Format.RGBA; - IntBuffer pixels = intBuffer; - Consumer closer = MemoryUtil::memFree; - - if (!RenderSystem.isOnRenderThreadOrInit()) { - RenderSystem.recordRenderCall( - () -> _upload(id, level, offsetX, offsetY, width, height, format, pixels, - closer)); - } else { - _upload(id, level, offsetX, offsetY, width, height, format, pixels, closer); - } - } - - public boolean hasColor() { - return true; - } - }); + private UnicodeTextureGlyphMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_options/GameOptionsScreenMixins.java b/src/main/java/com/radiance/mixins/vulkan_options/GameOptionsScreenMixins.java deleted file mode 100644 index d2d443b..0000000 --- a/src/main/java/com/radiance/mixins/vulkan_options/GameOptionsScreenMixins.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.radiance.mixins.vulkan_options; - -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.widget.OptionListWidget; -import net.minecraft.client.option.GameOptions; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(GameOptionsScreen.class) -public abstract class GameOptionsScreenMixins { - - @Shadow - protected OptionListWidget body; - - @Final - @Shadow - protected GameOptions gameOptions; -} diff --git a/src/main/java/com/radiance/mixins/vulkan_options/VideoOptionsScreenMixins.java b/src/main/java/com/radiance/mixins/vulkan_options/VideoOptionsScreenMixins.java index a8ee6fa..8e9e374 100644 --- a/src/main/java/com/radiance/mixins/vulkan_options/VideoOptionsScreenMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_options/VideoOptionsScreenMixins.java @@ -1,219 +1,74 @@ package com.radiance.mixins.vulkan_options; import static net.minecraft.client.option.GameOptions.getGenericValueText; -import static net.minecraft.client.option.InactivityFpsLimit.AFK; -import com.google.common.collect.ImmutableList; import com.mojang.serialization.Codec; import com.radiance.client.gui.PotentialValuesBasedCallbacksNoValue; import com.radiance.client.gui.RenderPipelineScreen; import com.radiance.client.option.Options; -import com.radiance.client.util.CategoryVideoOptionEntry; -import java.util.Arrays; -import java.util.Optional; +import java.util.List; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.VideoOptionsScreen; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.option.InactivityFpsLimit; +import net.minecraft.client.gui.widget.OptionListWidget; import net.minecraft.client.option.SimpleOption; -import net.minecraft.client.util.Monitor; -import net.minecraft.client.util.VideoMode; -import net.minecraft.client.util.Window; import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(VideoOptionsScreen.class) -public class VideoOptionsScreenMixins extends GameOptionsScreenMixins { +public abstract class VideoOptionsScreenMixins { @Unique - private static final Text INACTIVITY_FPS_LIMIT_MINIMIZED_TOOLTIP = Text.translatable( - "options.inactivityFpsLimit.minimized.tooltip"); - @Unique - private static final Text INACTIVITY_FPS_LIMIT_AFK_TOOLTIP = Text.translatable( - "options.inactivityFpsLimit.afk.tooltip"); - - @Unique - private static final PotentialValuesBasedCallbacksNoValue BOOLEAN_NO_KEY = new PotentialValuesBasedCallbacksNoValue<>( - ImmutableList.of(Boolean.TRUE, Boolean.FALSE), Codec.BOOL - ); - - @Inject(method = "addOptions()V", at = @At(value = "HEAD"), cancellable = true) - public void redirectAddOptions(CallbackInfo ci) { - SimpleOption - maxFps = - new SimpleOption<>("options.framerateLimit", - SimpleOption.emptyTooltip(), - (optionText, value) -> value == 260 ? - getGenericValueText(optionText, Text.translatable("options.framerateLimit.max")) - : - getGenericValueText(optionText, - Text.translatable("options.framerate", value)), - new SimpleOption.ValidatingIntSliderCallbacks(1, 26).withModifier( - value -> value * 10, value -> value / 10), - Codec.intRange(10, 260), - Options.maxFps, - value -> { - MinecraftClient.getInstance() - .getInactivityFpsLimiter() - .setMaxFps(value); - Options.setMaxFps(value, true); - }); - - int i = -1; - Window - window = - MinecraftClient.getInstance() - .getWindow(); - Monitor monitor = window.getMonitor(); - int j; - if (monitor == null) { - j = -1; - } else { - Optional optional = window.getFullscreenVideoMode(); - j = - optional.map(monitor::findClosestVideoModeIndex) - .orElse(-1); - } - - SimpleOption - fullScreenResolutionOption = - new SimpleOption<>("options.fullscreen.resolution", SimpleOption.emptyTooltip(), - (optionText, value) -> { - if (monitor == null) { - return Text.translatable("options.fullscreen.unavailable"); - } else if (value == -1) { - return getGenericValueText(optionText, - Text.translatable("options.fullscreen.current")); - } else { - VideoMode videoMode = monitor.getVideoMode(value); - return getGenericValueText(optionText, - Text.translatable("options.fullscreen.entry", - videoMode.getWidth(), - videoMode.getHeight(), - videoMode.getRefreshRate(), - videoMode.getRedBits() + videoMode.getGreenBits() + - videoMode.getBlueBits())); - } - }, new SimpleOption.ValidatingIntSliderCallbacks(-1, - monitor != null ? monitor.getVideoModeCount() - 1 : -1), j, value -> { - if (monitor != null) { - window.setFullscreenVideoMode( - value == -1 ? Optional.empty() : Optional.of(monitor.getVideoMode(value))); - } - }); - - SimpleOption inactivityFpsLimit = new SimpleOption<>( - "options.inactivityFpsLimit", - option -> { - return switch (option) { - case MINIMIZED -> Tooltip.of( - INACTIVITY_FPS_LIMIT_MINIMIZED_TOOLTIP); - case AFK -> Tooltip.of(INACTIVITY_FPS_LIMIT_AFK_TOOLTIP); - }; - }, - SimpleOption.enumValueText(), - new SimpleOption.PotentialValuesBasedCallbacks<>(Arrays.asList( - InactivityFpsLimit.values()), - InactivityFpsLimit.Codec), - AFK, - inactivityLimit -> { - Options.setInactivityFpsLimit( - inactivityLimit == AFK ? 30 : 9, true); - }); - - SimpleOption enableVsync = SimpleOption.ofBoolean("options.vsync", Options.vsync, - value -> { - if (MinecraftClient.getInstance() - .getWindow() != null) { - Options.setVsync(value, true); - } - }); - - SimpleOption - chunkBuildingBatchSize = - new SimpleOption<>(Options.CHUNK_BUILDING_BATCH_SIZE_KEY, - SimpleOption.emptyTooltip(), - (optionText, value) -> getGenericValueText(optionText, - Text.literal(Integer.toString(value))), - new SimpleOption.ValidatingIntSliderCallbacks(1, 32), - Codec.intRange(1, 32), - Options.chunkBuildingBatchSize, - value -> { - Options.setChunkBuildingBatchSize(value, true); - }); - - SimpleOption - chunkBuildingTotalBatches = - new SimpleOption<>(Options.CHUNK_BUILDING_TOTAL_BATCHES_KEY, - SimpleOption.emptyTooltip(), - (optionText, value) -> getGenericValueText(optionText, - Text.literal(Integer.toString(value))), - new SimpleOption.ValidatingIntSliderCallbacks(1, 32), - Codec.intRange(1, 32), - Options.chunkBuildingTotalBatches, - value -> { - Options.setChunkBuildingTotalBatches(value, true); - }); - - SimpleOption pipelineSettings = new SimpleOption<>(Options.PIPELINE_SETUP_KEY, + private static final PotentialValuesBasedCallbacksNoValue BOOLEAN_NO_KEY = + new PotentialValuesBasedCallbacksNoValue<>(List.of(Boolean.TRUE, Boolean.FALSE), + Codec.BOOL); + + @Shadow + @Final + private OptionListWidget list; + + @Inject(method = "init", at = @At("TAIL")) + private void addRadianceOptions(CallbackInfo ci) { + SimpleOption chunkBuildingBatchSize = new SimpleOption<>( + Options.CHUNK_BUILDING_BATCH_SIZE_KEY, + SimpleOption.emptyTooltip(), + (optionText, value) -> getGenericValueText(optionText, + Text.literal(Integer.toString(value))), + new SimpleOption.ValidatingIntSliderCallbacks(1, 32), + Codec.intRange(1, 32), + Options.chunkBuildingBatchSize, + value -> Options.setChunkBuildingBatchSize(value, true) + ); + + SimpleOption chunkBuildingTotalBatches = new SimpleOption<>( + Options.CHUNK_BUILDING_TOTAL_BATCHES_KEY, + SimpleOption.emptyTooltip(), + (optionText, value) -> getGenericValueText(optionText, + Text.literal(Integer.toString(value))), + new SimpleOption.ValidatingIntSliderCallbacks(1, 32), + Codec.intRange(1, 32), + Options.chunkBuildingTotalBatches, + value -> Options.setChunkBuildingTotalBatches(value, true) + ); + + SimpleOption pipelineSettings = new SimpleOption<>( + Options.PIPELINE_SETUP_KEY, SimpleOption.emptyTooltip(), (optionText, value) -> optionText, BOOLEAN_NO_KEY, false, - value -> { - MinecraftClient.getInstance() - .setScreen(new RenderPipelineScreen((VideoOptionsScreen) (Object) this)); - }); - - // Adding categories and options - this.body.addEntry( - new CategoryVideoOptionEntry(Text.translatable(Options.CATEGORY_GAMEPLAY), body)); - SimpleOption[] optionsGameplay = new SimpleOption[]{ // - gameOptions.getGraphicsMode(), // - gameOptions.getViewDistance(), // - gameOptions.getSimulationDistance(), // - gameOptions.getGuiScale(), // - gameOptions.getAttackIndicator(), // - gameOptions.getGamma(), // - gameOptions.getCloudRenderMode(), // - gameOptions.getParticles(), // - gameOptions.getDistortionEffectScale(), // - gameOptions.getEntityDistanceScaling(), // - gameOptions.getFovEffectScale(), // - gameOptions.getShowAutosaveIndicator(), // - gameOptions.getGlintSpeed(), // - gameOptions.getGlintStrength(), // - gameOptions.getMenuBackgroundBlurriness(), // - gameOptions.getBobView(), // - }; - this.body.addSingleOptionEntry(gameOptions.getBiomeBlendRadius()); - this.body.addSingleOptionEntry(gameOptions.getMipmapLevels()); - this.body.addAll(optionsGameplay); - - this.body.addEntry( - new CategoryVideoOptionEntry(Text.translatable(Options.CATEGORY_WINDOW), body)); - SimpleOption[] optionsWindow = new SimpleOption[]{ // - maxFps, // - inactivityFpsLimit, // - enableVsync, // - gameOptions.getFullscreen(), // - }; - this.body.addAll(optionsWindow); - this.body.addSingleOptionEntry(fullScreenResolutionOption); - - this.body.addEntry( - new CategoryVideoOptionEntry(Text.translatable(Options.CATEGORY_TERRAIN), body)); - this.body.addSingleOptionEntry(chunkBuildingBatchSize); - this.body.addSingleOptionEntry(chunkBuildingTotalBatches); - - this.body.addEntry( - new CategoryVideoOptionEntry(Text.translatable(Options.CATEGORY_PIPELINE), body)); - this.body.addSingleOptionEntry(pipelineSettings); + value -> MinecraftClient.getInstance() + .setScreen(new RenderPipelineScreen((Screen) (Object) this)) + ); - ci.cancel(); + this.list.addSingleOptionEntry(chunkBuildingBatchSize); + this.list.addSingleOptionEntry(chunkBuildingTotalBatches); + this.list.addSingleOptionEntry(pipelineSettings); } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/AbstractTextureMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/AbstractTextureMixins.java index 2be180d..856f9a2 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/AbstractTextureMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/AbstractTextureMixins.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.platform.TextureUtil; import com.radiance.client.constant.VulkanConstants; import com.radiance.client.proxy.vulkan.TextureProxy; +import com.radiance.client.texture.TextureTracker; import com.radiance.mixin_related.extensions.vulkan_render_integration.IAbstractTextureExt; import net.minecraft.client.texture.AbstractTexture; import org.spongepowered.asm.mixin.Mixin; @@ -18,14 +19,22 @@ public class AbstractTextureMixins implements IAbstractTextureExt { @Shadow protected int glId; + private int radiance$ensureGlId() { + if (this.glId == -1) { + this.glId = TextureUtil.generateTextureId(); + } + return this.glId; + } + @Inject(method = "bindTexture()V", at = @At(value = "HEAD"), cancellable = true) public void cancelBindTexture(CallbackInfo ci) { + TextureTracker.currentBoundTextureID = radiance$ensureGlId(); ci.cancel(); } @Inject(method = "setFilter(ZZ)V", at = @At(value = "HEAD"), cancellable = true) public void redirectSetFilter(boolean bilinear, boolean mipmap, CallbackInfo ci) { - TextureProxy.setFilter(glId, + TextureProxy.setFilter(radiance$ensureGlId(), (bilinear ? VulkanConstants.VkFilter.VK_FILTER_LINEAR : VulkanConstants.VkFilter.VK_FILTER_NEAREST).getValue(), mipmap ? (bilinear @@ -35,18 +44,11 @@ public void redirectSetFilter(boolean bilinear, boolean mipmap, CallbackInfo ci) ci.cancel(); } - @Inject(method = "setClamp(Z)V", at = @At(value = "HEAD"), cancellable = true) - public void redirectSetClamp(boolean clamp, CallbackInfo ci) { - TextureProxy.setClamp(glId, - clamp - ? VulkanConstants.VkSamplerAddressMode.VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.getValue() - : - VulkanConstants.VkSamplerAddressMode.VK_SAMPLER_ADDRESS_MODE_REPEAT.getValue()); - ci.cancel(); - } - @Inject(method = "clearGlId()V", at = @At(value = "HEAD"), cancellable = true) public void cancelClearGlId(CallbackInfo ci) { + if (TextureTracker.currentBoundTextureID == this.glId) { + TextureTracker.currentBoundTextureID = -1; + } ci.cancel(); } @@ -58,14 +60,10 @@ public void cancelClearGlId(CallbackInfo ci) { return this.glId; } - @Inject(method = "Lnet/minecraft/client/texture/AbstractTexture;getGlId()I", at = @At(value = "HEAD"), cancellable = true) + @Inject(method = "getGlId()I", at = @At(value = "HEAD"), cancellable = true) public void redirectGetGlId(CallbackInfoReturnable cir) { synchronized (AbstractTextureMixins.class) { - if (this.glId == -1) { - this.glId = TextureUtil.generateTextureId(); - } - - cir.setReturnValue(this.glId); + cir.setReturnValue(radiance$ensureGlId()); } } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/BannerBlockEntityRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/BannerBlockEntityRendererMixins.java index 80c1038..b2c2a02 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/BannerBlockEntityRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/BannerBlockEntityRendererMixins.java @@ -1,80 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BannerBlockEntityRenderer; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.component.type.BannerPatternsComponent; -import net.minecraft.util.DyeColor; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +// TODO 1.20.1: banner canvas rendering uses older overloads and needs a fresh port. +public final class BannerBlockEntityRendererMixins { -@Mixin(BannerBlockEntityRenderer.class) -public class BannerBlockEntityRendererMixins { - - @Redirect(method = "renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLnet/minecraft/util/DyeColor;Lnet/minecraft/component/type/BannerPatternsComponent;ZZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/ModelPart;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;II)V")) - private static void cancelSolidRender(ModelPart canvas, MatrixStack matrices, - VertexConsumer vertices, - int light, int overlay, @Local(ordinal = 0, argsOnly = true) boolean isBanner, - @Local(argsOnly = true) VertexConsumerProvider vertexConsumers, - @Local(argsOnly = true) SpriteIdentifier baseSprite, - @Local(ordinal = 1, argsOnly = true) boolean glint, @Local(ordinal = 2, argsOnly = true) - boolean solid) { - if (!isBanner) { - canvas.render(matrices, - baseSprite.getVertexConsumer(vertexConsumers, RenderLayer::getEntitySolid, solid, - glint), light, overlay); - } - } - - @Inject(method = "renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLnet/minecraft/util/DyeColor;Lnet/minecraft/component/type/BannerPatternsComponent;ZZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderLayer(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;Lnet/minecraft/util/DyeColor;)V", ordinal = 0)) - private static void expandModelPre0(MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light, int overlay, ModelPart canvas, SpriteIdentifier baseSprite, boolean isBanner, - DyeColor color, BannerPatternsComponent patterns, boolean glint, boolean solid, - CallbackInfo ci) { - matrices.push(); - if (!isBanner) { - matrices.translate(0.0f, 0.0f, -0.001f); - } - } - - @Inject(method = "renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLnet/minecraft/util/DyeColor;Lnet/minecraft/component/type/BannerPatternsComponent;ZZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderLayer(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;Lnet/minecraft/util/DyeColor;)V", ordinal = 0, shift = Shift.AFTER)) - private static void expandModelPost0(MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light, int overlay, ModelPart canvas, SpriteIdentifier baseSprite, boolean isBanner, - DyeColor color, BannerPatternsComponent patterns, boolean glint, boolean solid, - CallbackInfo ci) { - matrices.pop(); - } - - @Inject(method = "renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLnet/minecraft/util/DyeColor;Lnet/minecraft/component/type/BannerPatternsComponent;ZZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderLayer(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;Lnet/minecraft/util/DyeColor;)V", ordinal = 1)) - private static void expandModelPre1(MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light, int overlay, ModelPart canvas, SpriteIdentifier baseSprite, boolean isBanner, - DyeColor color, BannerPatternsComponent patterns, boolean glint, boolean solid, - CallbackInfo ci, @Local(ordinal = 2) int i) { - matrices.push(); - if (!isBanner) { - matrices.translate(0.0f, 0.0f, -0.001f); - } - matrices.scale(1.001f, 1.001f, 1.0f + 0.001f * (i + 1)); - } - - @Inject(method = "renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLnet/minecraft/util/DyeColor;Lnet/minecraft/component/type/BannerPatternsComponent;ZZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderLayer(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;Lnet/minecraft/util/DyeColor;)V", ordinal = 1, shift = Shift.AFTER)) - private static void expandModelPost1(MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light, int overlay, ModelPart canvas, SpriteIdentifier baseSprite, boolean isBanner, - DyeColor color, BannerPatternsComponent patterns, boolean glint, boolean solid, - CallbackInfo ci) { - matrices.pop(); + private BannerBlockEntityRendererMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/BillboardParticleMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/BillboardParticleMixins.java index 5ed18c9..4c98028 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/BillboardParticleMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/BillboardParticleMixins.java @@ -1,73 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import net.minecraft.client.particle.BillboardParticle; -import net.minecraft.client.particle.WhiteAshParticle; -import net.minecraft.client.render.VertexConsumer; -import org.joml.Quaternionf; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +// TODO 1.20.1: WhiteAshParticle geometry customization needs a dedicated accessor-based port. +public final class BillboardParticleMixins { -@Mixin(BillboardParticle.class) -public abstract class BillboardParticleMixins { - - @Inject(method = "method_60374(Lnet/minecraft/client/render/VertexConsumer;Lorg/joml/Quaternionf;FFFF)V", - at = @At(value = "HEAD"), - cancellable = true) - public void resizeParticle(VertexConsumer vertexConsumer, - Quaternionf quaternionf, - float f, - float g, - float h, - float i, - CallbackInfo ci) { - if (((BillboardParticle) (Object) this) instanceof WhiteAshParticle) { - float j = this.getSize(i); - float k = this.getMinU(); - float l = this.getMaxU(); - float m = this.getMinV(); - float n = this.getMaxV(); - int o = 0; - this.method_60375(vertexConsumer, quaternionf, f, g, h, 1.0F / 8.0F, -1.0F / 8.0F, j, l, - n, o); - this.method_60375(vertexConsumer, quaternionf, f, g, h, 1.0F / 8.0F, 1.0F / 8.0F, j, l, - m, o); - this.method_60375(vertexConsumer, quaternionf, f, g, h, -1.0F / 8.0F, 1.0F / 8.0F, j, k, - m, o); - this.method_60375(vertexConsumer, quaternionf, f, g, h, -1.0F / 8.0F, -1.0F / 8.0F, j, - k, n, o); - - ci.cancel(); - } + private BillboardParticleMixins() { } - - @Shadow - public abstract float getSize(float i); - - @Shadow - protected abstract float getMinU(); - - @Shadow - protected abstract float getMaxU(); - - @Shadow - protected abstract float getMinV(); - - @Shadow - protected abstract float getMaxV(); - - @Shadow - protected abstract void method_60375(VertexConsumer vertexConsumer, - Quaternionf quaternionf, - float f, - float g, - float h, - float i, - float j, - float k, - float l, - float m, - int n); } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/BlockModelRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/BlockModelRendererMixins.java index 926b8f2..5173733 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/BlockModelRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/BlockModelRendererMixins.java @@ -1,88 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import com.radiance.client.vertex.PBRVertexConsumer; -import com.radiance.mixin_related.extensions.vulkan_render_integration.IBlockColorsExt; -import net.minecraft.block.BlockState; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.block.BlockModelRenderer; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockRenderView; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +// TODO 1.20.1: block model quad emission changed and needs a dedicated pass. +public final class BlockModelRendererMixins { -@Mixin(BlockModelRenderer.class) -public class BlockModelRendererMixins { - - @Final - @Shadow - private BlockColors colors; - - @Inject(method = - "renderQuad(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;" - + - "Lnet/minecraft/client/render/VertexConsumer;Lnet/minecraft/client/util/math/MatrixStack$Entry;" - + - "Lnet/minecraft/client/render/model/BakedQuad;FFFFIIIII)V", - at = @At(value = "HEAD"), - cancellable = true) - public void redirectRenderQuad(BlockRenderView world, - BlockState state, - BlockPos pos, - VertexConsumer vertexConsumer, - MatrixStack.Entry matrixEntry, - BakedQuad quad, - float brightness0, - float brightness1, - float brightness2, - float brightness3, - int light0, - int light1, - int light2, - int light3, - int overlay, - CallbackInfo ci) { - float f; - float g; - float h; - float emission; - if (quad.hasTint()) { - int i = this.colors.getColor(state, world, pos, quad.getTintIndex()); - f = (i >> 16 & 0xFF) / 255.0F; - g = (i >> 8 & 0xFF) / 255.0F; - h = (i & 0xFF) / 255.0F; - - emission = ((IBlockColorsExt) this.colors).radiance$getEmission(state, world, pos, - quad.getTintIndex()); - } else { - f = 1.0F; - g = 1.0F; - h = 1.0F; - - emission = 0.0F; - } - - vertexConsumer.quad(matrixEntry, - quad, - new float[]{brightness0, brightness1, brightness2, brightness3}, - f, - g, - h, - 1.0F, - new int[]{light0, light1, light2, light3}, - overlay, - true); - - if (vertexConsumer instanceof PBRVertexConsumer pbrVertexConsumer) { - pbrVertexConsumer.albedoEmission(emission); - } - - ci.cancel(); + private BlockModelRendererMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/BufferBuilderMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/BufferBuilderMixins.java new file mode 100644 index 0000000..ef72ec6 --- /dev/null +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/BufferBuilderMixins.java @@ -0,0 +1,12 @@ +package com.radiance.mixins.vulkan_render_integration; + +import net.minecraft.client.render.BufferBuilder; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BufferBuilder.class) +public interface BufferBuilderMixins { + + @Invoker("grow") + void radiance$grow(int size); +} diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/BufferRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/BufferRendererMixins.java index b899ec2..749f201 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/BufferRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/BufferRendererMixins.java @@ -1,9 +1,14 @@ package com.radiance.mixins.vulkan_render_integration; +import com.mojang.blaze3d.systems.RenderSystem; import com.radiance.client.proxy.vulkan.BufferProxy; import com.radiance.client.proxy.vulkan.RendererProxy; +import java.util.Locale; +import net.minecraft.client.gl.ShaderProgram; import net.minecraft.client.render.BufferRenderer; -import net.minecraft.client.render.BuiltBuffer; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormats; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -12,23 +17,120 @@ @Mixin(BufferRenderer.class) public class BufferRendererMixins { - @Inject(method = "drawWithGlobalProgram(Lnet/minecraft/client/render/BuiltBuffer;)V", - at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;assertOnRenderThread()V", shift = At.Shift.AFTER, remap = false), + @Inject(method = "drawWithGlobalProgramInternal(Lnet/minecraft/client/render/BufferBuilder$BuiltBuffer;)V", + at = @At("HEAD"), cancellable = true) - private static void rewriteDrawWithGlobalProgram(BuiltBuffer buffer, CallbackInfo ci) { + private static void rewriteDrawWithGlobalProgram(BufferBuilder.BuiltBuffer buffer, + CallbackInfo ci) { + int pipelineType = resolveOverlayPipelineType(buffer); + if (pipelineType < 0 && RendererProxy.hasOverlayPipeline()) { + pipelineType = RendererProxy.getOverlayPipelineType(); + } + if (pipelineType < 0) { + return; + } + + RendererProxy.bindOverlayPipeline(pipelineType); + BufferProxy.VertexIndexBufferHandle handle = BufferProxy.createAndUploadVertexIndexBuffer( buffer); BufferProxy.updateOverlayDrawUniform(); RendererProxy.drawOverlay(handle, - buffer.getDrawParameters() + buffer.getParameters() .indexCount(), - buffer.getDrawParameters() + pipelineType, + buffer.getParameters() .indexType()); - buffer.close(); + buffer.release(); ci.cancel(); } + + private static int resolveOverlayPipelineType(BufferBuilder.BuiltBuffer buffer) { + ShaderProgram shaderProgram = RenderSystem.getShader(); + if (shaderProgram != null) { + int shaderPipeline = mapShaderPipeline(shaderProgram.getName()); + if (shaderPipeline >= 0) { + return shaderPipeline; + } + } + + VertexFormat format = buffer.getParameters().format(); + if (format == VertexFormats.POSITION_TEXTURE_COLOR) { + return 2; + } + if (format == VertexFormats.POSITION_COLOR) { + return 1; + } + if (format == VertexFormats.POSITION_TEXTURE) { + return 0; + } + if (format == VertexFormats.POSITION_COLOR_TEXTURE_LIGHT + || format == VertexFormats.POSITION_TEXTURE_LIGHT_COLOR) { + return 3; + } + if (format == VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL) { + return 4; + } + if (format == VertexFormats.POSITION) { + return 7; + } + + return -1; + } + + private static int mapShaderPipeline(String shaderName) { + String normalized = normalizeShaderName(shaderName); + + return switch (normalized) { + case "rendertype_glint", "rendertype_glint_direct", "rendertype_glint_translucent", + "rendertype_entity_glint", "rendertype_entity_glint_direct", + "rendertype_armor_glint", "rendertype_armor_entity_glint", "position_tex" -> 0; + case "position_color", "rendertype_gui", "rendertype_gui_overlay", + "rendertype_gui_text_highlight", "rendertype_gui_ghost_recipe_overlay", + "rendertype_lines" -> 1; + case "position_tex_color", "rendertype_lightning" -> 2; + case "rendertype_text", "rendertype_text_background", + "rendertype_text_background_see_through", "rendertype_text_intensity", + "rendertype_text_intensity_see_through", "rendertype_text_see_through", + "particle" -> 3; + case "rendertype_entity_cutout", "rendertype_entity_cutout_no_cull", + "rendertype_entity_cutout_no_cull_z_offset", + "rendertype_entity_translucent", "rendertype_entity_translucent_cull", + "rendertype_entity_translucent_emissive", + "rendertype_item_entity_translucent_cull", "rendertype_entity_solid", + "rendertype_entity_smooth_cutout", "rendertype_entity_shadow", + "rendertype_entity_alpha", "rendertype_entity_decal", + "rendertype_energy_swirl", "rendertype_eyes", "rendertype_beacon_beam" -> 4; + case "rendertype_entity_no_outline", "rendertype_armor_cutout_no_cull" -> 5; + case "rendertype_end_portal", "rendertype_end_gateway" -> 6; + case "position" -> 7; + default -> -1; + }; + } + + private static String normalizeShaderName(String shaderName) { + if (shaderName == null) { + return ""; + } + + String normalized = shaderName.toLowerCase(Locale.ROOT).replace('\\', '/'); + int namespaceSeparator = normalized.indexOf(':'); + if (namespaceSeparator >= 0) { + normalized = normalized.substring(namespaceSeparator + 1); + } + if (normalized.startsWith("core/")) { + normalized = normalized.substring("core/".length()); + } + if (normalized.startsWith("minecraft/shaders/core/")) { + normalized = normalized.substring("minecraft/shaders/core/".length()); + } + if (normalized.endsWith(".json")) { + normalized = normalized.substring(0, normalized.length() - ".json".length()); + } + return normalized; + } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/BuiltBufferMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/BuiltBufferMixins.java index b8051a2..317b4f3 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/BuiltBufferMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/BuiltBufferMixins.java @@ -1,52 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import com.radiance.client.vertex.PBRVertexFormatElements; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import net.minecraft.client.render.BuiltBuffer; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormatElement; -import org.joml.Vector3f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +// TODO 1.20.1: quad centroid handling lives in the legacy BufferBuilder path. +public final class BuiltBufferMixins { -@Mixin(BuiltBuffer.class) -public class BuiltBufferMixins { - - @Inject(method = "collectCentroids(Ljava/nio/ByteBuffer;ILnet/minecraft/client/render/VertexFormat;)[Lorg/joml/Vector3f;", - at = @At(value = "HEAD"), - cancellable = true) - private static void addPBRPosition(ByteBuffer buf, int vertexCount, VertexFormat format, - CallbackInfoReturnable cir) { - int i = format.getOffset(VertexFormatElement.POSITION); - if (i == -1) { - i = format.getOffset(PBRVertexFormatElements.PBR_POS); - } - if (i == -1) { - throw new IllegalArgumentException( - "Cannot identify quad centers with no position element"); - } else { - FloatBuffer floatBuffer = buf.asFloatBuffer(); - int j = format.getVertexSizeByte() / 4; - int k = j * 4; - int l = vertexCount / 4; - Vector3f[] vector3fs = new Vector3f[l]; - - for (int m = 0; m < l; m++) { - int n = m * k + i; - int o = n + j * 2; - float f = floatBuffer.get(n); - float g = floatBuffer.get(n + 1); - float h = floatBuffer.get(n + 2); - float p = floatBuffer.get(o); - float q = floatBuffer.get(o + 1); - float r = floatBuffer.get(o + 2); - vector3fs[m] = new Vector3f((f + p) / 2.0F, (g + q) / 2.0F, (h + r) / 2.0F); - } - - cir.setReturnValue(vector3fs); - } + private BuiltBufferMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderBuiltChunkMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderBuiltChunkMixins.java index a95a62e..8430284 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderBuiltChunkMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderBuiltChunkMixins.java @@ -2,8 +2,10 @@ import com.radiance.client.proxy.world.ChunkProxy; import com.radiance.mixin_related.extensions.vulkan_render_integration.IChunkBuilderBuiltChunkExt; +import java.util.Collection; import java.util.stream.Collector; import java.util.stream.Stream; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.render.chunk.ChunkBuilder; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -12,10 +14,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ChunkBuilder.BuiltChunk.class) -public class ChunkBuilderBuiltChunkMixins implements IChunkBuilderBuiltChunkExt { +public abstract class ChunkBuilderBuiltChunkMixins implements IChunkBuilderBuiltChunkExt { @Shadow @Final @@ -26,6 +29,11 @@ public class ChunkBuilderBuiltChunkMixins implements IChunkBuilderBuiltChunkExt return field_20833; } + @Override + @Invoker("setNoCullingBlockEntities") + public abstract void radiance$setNoCullingBlockEntities( + Collection blockEntities); + @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;collect(Ljava/util/stream/Collector;)Ljava/lang/Object;")) private Object cancelCollect(Stream stream, Collector collector) { diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderMixins.java index dd8a87e..1572597 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/ChunkBuilderMixins.java @@ -1,40 +1,19 @@ package com.radiance.mixins.vulkan_render_integration; import com.radiance.mixin_related.extensions.vulkan_render_integration.IChunkBuilderExt; -import net.minecraft.client.render.chunk.BlockBufferAllocatorStorage; import net.minecraft.client.render.chunk.ChunkBuilder; -import net.minecraft.client.render.chunk.SectionBuilder; import net.minecraft.client.world.ClientWorld; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ChunkBuilder.class) public class ChunkBuilderMixins implements IChunkBuilderExt { - @Final - @Shadow - SectionBuilder sectionBuilder; - - @Final - @Shadow - BlockBufferAllocatorStorage buffers; - @Shadow ClientWorld world; - @Override - public SectionBuilder radiance$getSectionBuilder() { - return sectionBuilder; - } - @Override public ClientWorld radiance$getWorld() { - return world; - } - - @Override - public BlockBufferAllocatorStorage radiance$getBuffers() { - return buffers; + return this.world; } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/CloudRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/CloudRendererMixins.java index 498bd64..517f62d 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/CloudRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/CloudRendererMixins.java @@ -1,452 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import com.radiance.client.UnsafeManager; -import com.radiance.client.constant.Constants; -import com.radiance.client.proxy.world.EntityProxy; -import com.radiance.client.vertex.PBRVertexConsumer; -import com.radiance.client.vertex.StorageVertexConsumerProvider; -import net.minecraft.client.gl.GlUsage; -import net.minecraft.client.gl.VertexBuffer; -import net.minecraft.client.option.CloudRenderMode; -import net.minecraft.client.render.BuiltBuffer; -import net.minecraft.client.render.CloudRenderer; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.util.math.ColorHelper; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import org.joml.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +// TODO 1.20.1: cloud rendering moved back into WorldRenderer and needs a dedicated port. +public final class CloudRendererMixins { -@Mixin(CloudRenderer.class) -public class CloudRendererMixins { - - @Shadow - private boolean field_53052; - - @Shadow - private int centerX; - - @Shadow - private int centerZ; - - @Shadow - private CloudRenderer.ViewMode viewMode; - - @Shadow - private CloudRenderMode renderMode; - - @Shadow - private CloudRenderer.CloudCells cells; - - @Shadow - private boolean renderClouds; - - @Unique - private StorageVertexConsumerProvider storageVertexConsumerProvider = null; - - @Unique - private EntityProxy.EntityRenderDataList entityRenderDataList = null; - - @Unique - private static int unpackColor(long packed) { - return (int) (packed >> 4 & 4294967295L); - } - - @Unique - private static boolean hasBorderNorth(long packed) { - return (packed >> 3 & 1L) != 0L; - } - - @Unique - private static boolean hasBorderEast(long packed) { - return (packed >> 2 & 1L) != 0L; - } - - @Unique - private static boolean hasBorderSouth(long packed) { - return (packed >> 1 & 1L) != 0L; - } - - @Unique - private static boolean hasBorderWest(long packed) { - return (packed >> 0 & 1L) != 0L; - } - - @Redirect(method = "", at = @At(value = "NEW", target = "net/minecraft/client/gl/VertexBuffer")) - private VertexBuffer cancelBufferInit(GlUsage usage) { - return UnsafeManager.INSTANCE.allocateInstance(VertexBuffer.class); - } - - @Inject(method = - "renderClouds(ILnet/minecraft/client/option/CloudRenderMode;FLorg/joml/Matrix4f;Lorg/joml/Matrix4f;" - + - "Lnet/minecraft/util/math/Vec3d;F)V", at = @At(value = "HEAD"), cancellable = true) - public void redirectCloudRendering(int color, - CloudRenderMode cloudRenderMode, - float cloudHeight, - Matrix4f positionMatrix, - Matrix4f projectionMatrix, - Vec3d cameraPos, - float ticks, - CallbackInfo ci) { - if (this.cells != null) { - float f = (float) (cloudHeight - cameraPos.y); - float g = f + 4.0F; - CloudRenderer.ViewMode viewMode; - if (g < 0.0F) { - viewMode = CloudRenderer.ViewMode.ABOVE_CLOUDS; - } else if (f > 0.0F) { - viewMode = CloudRenderer.ViewMode.BELOW_CLOUDS; - } else { - viewMode = CloudRenderer.ViewMode.INSIDE_CLOUDS; - } - - double d = cameraPos.x + ticks * 0.030000001F; - double e = cameraPos.z + 3.96F; - double h = this.cells.width() * 12.0; - double i = this.cells.height() * 12.0; - d -= MathHelper.floor(d / h) * h; - e -= MathHelper.floor(e / i) * i; - int j = MathHelper.floor(d / 12.0); - int k = MathHelper.floor(e / 12.0); - float l = (float) (d - j * 12.0F); - float m = (float) (e - k * 12.0F); - RenderLayer - renderLayer = - cloudRenderMode == CloudRenderMode.FANCY ? RenderLayer.getFastClouds() - : RenderLayer.getNoCullingClouds(); - - if (this.field_53052 || j != this.centerX || k != this.centerZ - || viewMode != this.viewMode || - cloudRenderMode != this.renderMode) { - this.field_53052 = false; - this.centerX = j; - this.centerZ = k; - this.viewMode = viewMode; - this.renderMode = cloudRenderMode; - - this.tessellateClouds(color, j, k, cloudRenderMode, viewMode, renderLayer); - } - - if (storageVertexConsumerProvider != null) { - for (EntityProxy.EntityRenderData data : entityRenderDataList) { - data.setX((float) (cameraPos.x - l)); - data.setY(cloudHeight); - data.setZ((float) (cameraPos.z - m)); - } - - EntityProxy.queueBuildWithoutClose(entityRenderDataList); - } - - } - - ci.cancel(); - } - - @Unique - private void tessellateClouds(int color, int x, int z, CloudRenderMode renderMode, - CloudRenderer.ViewMode viewMode, RenderLayer layer) { - float red = ColorHelper.getRedFloat(color); - float green = ColorHelper.getGreenFloat(color); - float blue = ColorHelper.getBlueFloat(color); - int i = ColorHelper.fromFloats(0.8F, red, green, blue); - int j = ColorHelper.fromFloats(0.8F, 0.9F * red, 0.9F * green, 0.9F * blue); - int k = ColorHelper.fromFloats(0.8F, 0.7F * red, 0.7F * green, 0.7F * blue); - int l = ColorHelper.fromFloats(0.8F, 0.8F * red, 0.8F * green, 0.8F * blue); - - if (storageVertexConsumerProvider != null) { - for (EntityProxy.EntityRenderData entityRenderData : entityRenderDataList) { - for (EntityProxy.EntityRenderLayer entityRenderLayer : entityRenderData) { - BuiltBuffer vertexBuffer = entityRenderLayer.builtBuffer(); - vertexBuffer.close(); - } - } - - storageVertexConsumerProvider.close(); - } - - storageVertexConsumerProvider = new StorageVertexConsumerProvider(0); - entityRenderDataList = new EntityProxy.EntityRenderDataList(); - - VertexConsumer vertexConsumer = storageVertexConsumerProvider.getBuffer(layer); - if (vertexConsumer instanceof PBRVertexConsumer pbrVertexConsumer) { - this.buildCloudCells(viewMode, pbrVertexConsumer, x, z, k, i, j, l, - renderMode == CloudRenderMode.FANCY); - } else { - throw new RuntimeException("CloudRenderer only supports PBRVertexConsumer"); - } - - EntityProxy.processWorldEntityRenderData(storageVertexConsumerProvider, - System.identityHashCode("clouds"), - 0, - 0, - 0, - Constants.RayTracingFlags.CLOUD, - false, - entityRenderDataList); - } - - @Unique - private void buildCloudCells(CloudRenderer.ViewMode viewMode, - VertexConsumer builder, - int x, - int z, - int bottomColor, - int topColor, - int northSouthColor, - int eastWestColor, - boolean fancy) { - if (this.cells != null) { - int i = 32; - long[] ls = this.cells.cells(); - int j = this.cells.width(); - int k = this.cells.height(); - - for (int l = -32; l <= 32; l++) { - for (int m = -32; m <= 32; m++) { - int n = Math.floorMod(x + m, j); - int o = Math.floorMod(z + l, k); - long p = ls[n + o * j]; - if (p != 0L) { - int q = unpackColor(p); - if (fancy) { - this.buildCloudCellFancy(viewMode, - builder, - ColorHelper.mix(bottomColor, q), - ColorHelper.mix(topColor, q), - ColorHelper.mix(northSouthColor, q), - ColorHelper.mix(eastWestColor, q), - m, - l, - p); - } else { - this.buildCloudCellFast(builder, ColorHelper.mix(topColor, q), m, l); - } - } - } - } - } - } - - @Unique - private void buildCloudCellFast(VertexConsumer builder, int color, int x, int z) { - float f = x * 12.0F; - float g = f + 12.0F; - float h = z * 12.0F; - float i = h + 12.0F; - - builder.vertex(f, 0.0F, h) - .normal(0.0F, 1.0F, 0.0F) - .color(color); - builder.vertex(f, 0.0F, i) - .normal(0.0F, 1.0F, 0.0F) - .color(color); - builder.vertex(g, 0.0F, i) - .normal(0.0F, 1.0F, 0.0F) - .color(color); - builder.vertex(g, 0.0F, h) - .normal(0.0F, 1.0F, 0.0F) - .color(color); - } - - @Unique - private void buildCloudCellFancy(CloudRenderer.ViewMode viewMode, - VertexConsumer builder, - int bottomColor, - int topColor, - int northSouthColor, - int eastWestColor, - int x, - int z, - long cell) { - float f = x * 12.0F; - float g = f + 12.0F; - float h = 0.0F; - float i = 4.0F; - float j = z * 12.0F; - float k = j + 12.0F; - - if (viewMode != CloudRenderer.ViewMode.BELOW_CLOUDS) { - builder.vertex(f, 4.0F, j) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - builder.vertex(f, 4.0F, k) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - builder.vertex(g, 4.0F, k) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - builder.vertex(g, 4.0F, j) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - } - - if (viewMode != CloudRenderer.ViewMode.ABOVE_CLOUDS) { - builder.vertex(g, 0.0F, j) - .normal(0.0F, -1.0F, 0.0F) - .color(bottomColor); - builder.vertex(g, 0.0F, k) - .normal(0.0F, -1.0F, 0.0F) - .color(bottomColor); - builder.vertex(f, 0.0F, k) - .normal(0.0F, -1.0F, 0.0F) - .color(bottomColor); - builder.vertex(f, 0.0F, j) - .normal(0.0F, -1.0F, 0.0F) - .color(bottomColor); - } - - if (hasBorderNorth(cell) && z > 0) { - builder.vertex(f, 0.0F, j) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - builder.vertex(f, 4.0F, j) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - builder.vertex(g, 4.0F, j) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - builder.vertex(g, 0.0F, j) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - } - - if (hasBorderSouth(cell) && z < 0) { - builder.vertex(g, 0.0F, k) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - builder.vertex(g, 4.0F, k) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - builder.vertex(f, 4.0F, k) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - builder.vertex(f, 0.0F, k) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - } - - if (hasBorderWest(cell) && x > 0) { - builder.vertex(f, 0.0F, k) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(f, 4.0F, k) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(f, 4.0F, j) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(f, 0.0F, j) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - } - - if (hasBorderEast(cell) && x < 0) { - builder.vertex(g, 0.0F, j) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(g, 4.0F, j) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(g, 4.0F, k) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(g, 0.0F, k) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - } - - boolean bl = Math.abs(x) <= 1 && Math.abs(z) <= 1; - if (bl) { - builder.vertex(g, 4.0F, j) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - builder.vertex(g, 4.0F, k) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - builder.vertex(f, 4.0F, k) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - builder.vertex(f, 4.0F, j) - .normal(0.0F, 1.0F, 0.0F) - .color(topColor); - - builder.vertex(f, 0.0F, j) - .normal(0.0F, 1.0F, 0.0F) - .color(bottomColor); - builder.vertex(f, 0.0F, k) - .normal(0.0F, 1.0F, 0.0F) - .color(bottomColor); - builder.vertex(g, 0.0F, k) - .normal(0.0F, 1.0F, 0.0F) - .color(bottomColor); - builder.vertex(g, 0.0F, j) - .normal(0.0F, 1.0F, 0.0F) - .color(bottomColor); - - builder.vertex(g, 0.0F, j) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - builder.vertex(g, 4.0F, j) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - builder.vertex(f, 4.0F, j) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - builder.vertex(f, 0.0F, j) - .normal(0.0F, 0.0F, 1.0F) - .color(eastWestColor); - - builder.vertex(f, 0.0F, k) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - builder.vertex(f, 4.0F, k) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - builder.vertex(g, 4.0F, k) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - builder.vertex(g, 0.0F, k) - .normal(0.0F, 0.0F, -1.0F) - .color(eastWestColor); - - builder.vertex(f, 0.0F, j) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(f, 4.0F, j) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(f, 4.0F, k) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(f, 0.0F, k) - .normal(1.0F, 0.0F, 0.0F) - .color(northSouthColor); - - builder.vertex(g, 0.0F, k) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(g, 4.0F, k) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(g, 4.0F, j) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - builder.vertex(g, 0.0F, j) - .normal(-1.0F, 0.0F, 0.0F) - .color(northSouthColor); - } - } - - @Inject(method = "close()V", at = @At(value = "HEAD"), cancellable = true) - public void cancelBufferClose(CallbackInfo ci) { - ci.cancel(); + private CloudRendererMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/EntityRenderDispatcherMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/EntityRenderDispatcherMixins.java index 692a8bf..f1cf28a 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/EntityRenderDispatcherMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/EntityRenderDispatcherMixins.java @@ -2,8 +2,8 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.state.EntityRenderState; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; import net.minecraft.world.WorldView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -15,13 +15,12 @@ public class EntityRenderDispatcherMixins { @Inject(method = "renderShadow(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;" - + - "Lnet/minecraft/client/render/entity/state/EntityRenderState;FFLnet/minecraft/world/WorldView;F)V", + + "Lnet/minecraft/entity/Entity;FFLnet/minecraft/world/WorldView;F)V", at = @At(value = "HEAD"), cancellable = true) private static void cancelRenderShadow(MatrixStack matrices, VertexConsumerProvider vertexConsumers, - EntityRenderState renderState, + Entity entity, float opacity, float tickDelta, WorldView world, diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/FluidRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/FluidRendererMixins.java index 833ed2c..98a3e3e 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/FluidRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/FluidRendererMixins.java @@ -1,676 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import static net.minecraft.client.render.block.FluidRenderer.shouldRenderSide; +// TODO 1.20.1: fluid renderer hooks changed and need a dedicated pass. +public final class FluidRendererMixins { -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.TranslucentBlock; -import net.minecraft.client.color.world.BiomeColors; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.block.FluidRenderer; -import net.minecraft.client.texture.Sprite; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockRenderView; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(FluidRenderer.class) -public abstract class FluidRendererMixins { - - @Final - @Shadow - private Sprite[] lavaSprites; - - @Final - @Shadow - private Sprite[] waterSprites; - - @Shadow - private Sprite waterOverlaySprite; - - @Shadow - private static boolean isSameFluid(FluidState a, FluidState b) { - return false; - } - - @Shadow - private static boolean isSideCovered(Direction direction, float f, BlockState blockState) { - VoxelShape voxelShape = blockState.getCullingFace(direction.getOpposite()); - if (voxelShape == VoxelShapes.empty()) { - return false; - } else if (voxelShape == VoxelShapes.fullCube()) { - boolean bl = f == 1.0F; - return direction != Direction.UP || bl; - } else { - VoxelShape voxelShape2 = VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, f, 1.0); - return VoxelShapes.isSideCovered(voxelShape2, voxelShape, direction); - } - } - - @Shadow - private static boolean method_3344(Direction direction, float f, BlockState blockState) { - return false; - } - - @Shadow - private static boolean isOppositeSideCovered(BlockState blockState, Direction direction) { - return false; - } - - @Shadow - protected abstract float calculateFluidHeight(BlockRenderView world, - Fluid fluid, - float originHeight, - float northSouthHeight, - float eastWestHeight, - BlockPos pos); - - @Shadow - protected abstract void addHeight(float[] weightedAverageHeight, float height); - - @Shadow - protected abstract float getFluidHeight(BlockRenderView world, Fluid fluid, BlockPos pos); - - @Shadow - protected abstract float getFluidHeight(BlockRenderView world, Fluid fluid, BlockPos pos, - BlockState blockState, FluidState fluidState); - - @Shadow - protected abstract int getLight(BlockRenderView world, BlockPos pos); - - @Unique - private void vertex(VertexConsumer vertexConsumer, - float x, - float y, - float z, - float red, - float green, - float blue, - float u, - float v, - int light, - float nx, - float ny, - float nz) { - vertexConsumer.vertex(x, y, z) - .color(red, green, blue, 1.0F) - .texture(u, v) - .light(light) - .normal(nx, ny, nz); - } - - @Inject(method = - "render(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/util/math/BlockPos;" + - "Lnet/minecraft/client/render/VertexConsumer;Lnet/minecraft/block/BlockState;Lnet/minecraft/fluid/FluidState;)V", - at = @At(value = "HEAD"), - cancellable = true) - public void addNormalToVertex(BlockRenderView world, - BlockPos pos, - VertexConsumer vertexConsumer, - BlockState blockState, - FluidState fluidState, - CallbackInfo ci) { - boolean isLava = fluidState.isIn(FluidTags.LAVA); - Sprite[] fluidSprites = isLava ? this.lavaSprites : this.waterSprites; - int tintColor = isLava ? 16777215 : BiomeColors.getWaterColor(world, pos); - float red = (tintColor >> 16 & 0xFF) / 255.0F; - float green = (tintColor >> 8 & 0xFF) / 255.0F; - float blue = (tintColor & 0xFF) / 255.0F; - - BlockState stateDown = world.getBlockState(pos.offset(Direction.DOWN)); - FluidState fluidDown = stateDown.getFluidState(); - BlockState stateUp = world.getBlockState(pos.offset(Direction.UP)); - FluidState fluidUp = stateUp.getFluidState(); - BlockState stateNorth = world.getBlockState(pos.offset(Direction.NORTH)); - FluidState fluidNorth = stateNorth.getFluidState(); - BlockState stateSouth = world.getBlockState(pos.offset(Direction.SOUTH)); - FluidState fluidSouth = stateSouth.getFluidState(); - BlockState stateWest = world.getBlockState(pos.offset(Direction.WEST)); - FluidState fluidWest = stateWest.getFluidState(); - BlockState stateEast = world.getBlockState(pos.offset(Direction.EAST)); - FluidState fluidEast = stateEast.getFluidState(); - - boolean renderTop = !isSameFluid(fluidState, fluidUp); - boolean - renderBottom = - shouldRenderSide(fluidState, blockState, Direction.DOWN, fluidDown) && !method_3344( - Direction.DOWN, 0.8888889F, stateDown); - boolean renderNorth = shouldRenderSide(fluidState, blockState, Direction.NORTH, fluidNorth); - boolean renderSouth = shouldRenderSide(fluidState, blockState, Direction.SOUTH, fluidSouth); - boolean renderWest = shouldRenderSide(fluidState, blockState, Direction.WEST, fluidWest); - boolean renderEast = shouldRenderSide(fluidState, blockState, Direction.EAST, fluidEast); - - if (renderTop || renderBottom || renderEast || renderWest || renderNorth || renderSouth) { - float lightDown = world.getBrightness(Direction.DOWN, true); - float lightUp = world.getBrightness(Direction.UP, true); - float lightNorth = world.getBrightness(Direction.NORTH, true); - float lightWest = world.getBrightness(Direction.WEST, true); // 用于侧面阴影计算 - - Fluid fluid = fluidState.getFluid(); - float currentHeight = this.getFluidHeight(world, fluid, pos, blockState, fluidState); - float heightNE; - float heightNW; - float heightSE; - float heightSW; - - if (currentHeight >= 1.0F) { - heightNE = 1.0F; - heightNW = 1.0F; - heightSE = 1.0F; - heightSW = 1.0F; - } else { - float hNorth = this.getFluidHeight(world, fluid, pos.north(), stateNorth, - fluidNorth); - float hSouth = this.getFluidHeight(world, fluid, pos.south(), stateSouth, - fluidSouth); - float hEast = this.getFluidHeight(world, fluid, pos.east(), stateEast, fluidEast); - float hWest = this.getFluidHeight(world, fluid, pos.west(), stateWest, fluidWest); - - heightNE = - this.calculateFluidHeight(world, - fluid, - currentHeight, - hNorth, - hEast, - pos.offset(Direction.NORTH) - .offset(Direction.EAST)); - heightNW = - this.calculateFluidHeight(world, - fluid, - currentHeight, - hNorth, - hWest, - pos.offset(Direction.NORTH) - .offset(Direction.WEST)); - heightSE = - this.calculateFluidHeight(world, - fluid, - currentHeight, - hSouth, - hEast, - pos.offset(Direction.SOUTH) - .offset(Direction.EAST)); - heightSW = - this.calculateFluidHeight(world, - fluid, - currentHeight, - hSouth, - hWest, - pos.offset(Direction.SOUTH) - .offset(Direction.WEST)); - } - - float x = pos.getX() & 15; - float y = pos.getY() & 15; - float z = pos.getZ() & 15; - float bottomYOffset = renderBottom ? 0.001F : 0.0F; - - // ========================================== - // 1. 渲染顶面 (Surface) - // ========================================== - if (renderTop && !method_3344(Direction.UP, - Math.min(Math.min(heightNW, heightSW), Math.min(heightSE, heightNE)), stateUp)) { - // 稍微调低一点避免 Z-Fighting - heightNW -= 0.001F; - heightSW -= 0.001F; - heightSE -= 0.001F; - heightNE -= 0.001F; - - Vec3d flowVector = fluidState.getVelocity(world, pos); - float u1, v1, u2, v2, u3, v3, u4, v4; // 对应四个角的UV - - if (flowVector.x == 0.0 && flowVector.z == 0.0) { - Sprite stillSprite = fluidSprites[0]; - u1 = stillSprite.getFrameU(0.0F); - v1 = stillSprite.getFrameV(0.0F); - u2 = u1; - v2 = stillSprite.getFrameV(1.0F); - u3 = stillSprite.getFrameU(1.0F); - v3 = v2; - u4 = u3; - v4 = v1; - } else { - Sprite flowSprite = fluidSprites[1]; - float angle = - (float) MathHelper.atan2(flowVector.z, flowVector.x) - (float) (Math.PI - / 2); - float sin = MathHelper.sin(angle) * 0.25F; - float cos = MathHelper.cos(angle) * 0.25F; - - u1 = flowSprite.getFrameU(0.5F + (-cos - sin)); - v1 = flowSprite.getFrameV(0.5F + (-cos + sin)); - u2 = flowSprite.getFrameU(0.5F + (-cos + sin)); - v2 = flowSprite.getFrameV(0.5F + (cos + sin)); - u3 = flowSprite.getFrameU(0.5F + (cos + sin)); - v3 = flowSprite.getFrameV(0.5F + (cos - sin)); - u4 = flowSprite.getFrameU(0.5F + (cos - sin)); - v4 = flowSprite.getFrameV(0.5F + (-cos - sin)); - } - - float uAvg = (u1 + u2 + u3 + u4) / 4.0F; - float vAvg = (v1 + v2 + v3 + v4) / 4.0F; - float animationDelta = fluidSprites[0].getAnimationFrameDelta(); - - u1 = MathHelper.lerp(animationDelta, u1, uAvg); - u2 = MathHelper.lerp(animationDelta, u2, uAvg); - u3 = MathHelper.lerp(animationDelta, u3, uAvg); - u4 = MathHelper.lerp(animationDelta, u4, uAvg); - v1 = MathHelper.lerp(animationDelta, v1, vAvg); - v2 = MathHelper.lerp(animationDelta, v2, vAvg); - v3 = MathHelper.lerp(animationDelta, v3, vAvg); - v4 = MathHelper.lerp(animationDelta, v4, vAvg); - - int packedLight = this.getLight(world, pos); - float shadedRed = lightUp * red; - float shadedGreen = lightUp * green; - float shadedBlue = lightUp * blue; - - // --- 法线计算 (顶面) --- - // 坐标系:NW(0,0), NE(1,0), SW(0,1), SE(1,1) - // X轴斜率贡献: (左 - 右) => (NW - NE) + (SW - SE) - // Z轴斜率贡献: (上 - 下) => (NW - SW) + (NE - SE) - float normalX = (heightNW - heightNE) + (heightSW - heightSE); - float normalZ = (heightNW - heightSW) + (heightNE - heightSE); - float normalY = 1.0F; // 基础垂直分量 - - // 归一化 - float length = MathHelper.sqrt( - normalX * normalX + normalY * normalY + normalZ * normalZ); - normalX /= length; - normalY /= length; - normalZ /= length; - - // 绘制顶面 (四个顶点) - // 0: NW (0, 0) -> heightNW - this.vertex(vertexConsumer, - x + 0.0F, - y + heightNW, - z + 0.0F, - shadedRed, - shadedGreen, - shadedBlue, - u1, - v1, - packedLight, - normalX, - normalY, - normalZ); - // 1: SW (0, 1) -> heightSW - this.vertex(vertexConsumer, - x + 0.0F, - y + heightSW, - z + 1.0F, - shadedRed, - shadedGreen, - shadedBlue, - u2, - v2, - packedLight, - normalX, - normalY, - normalZ); - // 2: SE (1, 1) -> heightSE - this.vertex(vertexConsumer, - x + 1.0F, - y + heightSE, - z + 1.0F, - shadedRed, - shadedGreen, - shadedBlue, - u3, - v3, - packedLight, - normalX, - normalY, - normalZ); - // 3: NE (1, 0) -> heightNE - this.vertex(vertexConsumer, - x + 1.0F, - y + heightNE, - z + 0.0F, - shadedRed, - shadedGreen, - shadedBlue, - u4, - v4, - packedLight, - normalX, - normalY, - normalZ); - - if (fluidState.canFlowTo(world, pos.up())) { - // 绘制内顶面 (Backface),法线取反 - this.vertex(vertexConsumer, - x + 0.0F, - y + heightNW, - z + 0.0F, - shadedRed, - shadedGreen, - shadedBlue, - u1, - v1, - packedLight, - -normalX, - -normalY, - -normalZ); - this.vertex(vertexConsumer, - x + 1.0F, - y + heightNE, - z + 0.0F, - shadedRed, - shadedGreen, - shadedBlue, - u4, - v4, - packedLight, - -normalX, - -normalY, - -normalZ); - this.vertex(vertexConsumer, - x + 1.0F, - y + heightSE, - z + 1.0F, - shadedRed, - shadedGreen, - shadedBlue, - u3, - v3, - packedLight, - -normalX, - -normalY, - -normalZ); - this.vertex(vertexConsumer, - x + 0.0F, - y + heightSW, - z + 1.0F, - shadedRed, - shadedGreen, - shadedBlue, - u2, - v2, - packedLight, - -normalX, - -normalY, - -normalZ); - } - } - - // ========================================== - // 2. 渲染底面 (Bottom) - // ========================================== - if (renderBottom) { - float minU = fluidSprites[0].getMinU(); - float maxU = fluidSprites[0].getMaxU(); - float minV = fluidSprites[0].getMinV(); - float maxV = fluidSprites[0].getMaxV(); - - int packedLightDown = this.getLight(world, pos.down()); - float shadedRedDown = lightDown * red; - float shadedGreenDown = lightDown * green; - float shadedBlueDown = lightDown * blue; - - // 法线向下 (0, -1, 0) - this.vertex(vertexConsumer, - x, - y + bottomYOffset, - z + 1.0F, - shadedRedDown, - shadedGreenDown, - shadedBlueDown, - minU, - maxV, - packedLightDown, - 0.0F, - -1.0F, - 0.0F); - this.vertex(vertexConsumer, - x, - y + bottomYOffset, - z, - shadedRedDown, - shadedGreenDown, - shadedBlueDown, - minU, - minV, - packedLightDown, - 0.0F, - -1.0F, - 0.0F); - this.vertex(vertexConsumer, - x + 1.0F, - y + bottomYOffset, - z, - shadedRedDown, - shadedGreenDown, - shadedBlueDown, - maxU, - minV, - packedLightDown, - 0.0F, - -1.0F, - 0.0F); - this.vertex(vertexConsumer, - x + 1.0F, - y + bottomYOffset, - z + 1.0F, - shadedRedDown, - shadedGreenDown, - shadedBlueDown, - maxU, - maxV, - packedLightDown, - 0.0F, - -1.0F, - 0.0F); - } - - int packedLightCenter = this.getLight(world, pos); - - // ========================================== - // 3. 渲染侧面 (Sides) - // ========================================== - for (Direction direction : Direction.Type.HORIZONTAL) { - float yStart, yEnd, xStart, xEnd, zStart, zEnd; - boolean shouldRenderSide; - - switch (direction) { - case NORTH: - yStart = heightNW; - yEnd = heightNE; - xStart = x; - xEnd = x + 1.0F; - zStart = z + 0.001F; - zEnd = z + 0.001F; - shouldRenderSide = renderNorth; - break; - case SOUTH: - yStart = heightSE; - yEnd = heightSW; - xStart = x + 1.0F; - xEnd = x; - zStart = z + 1.0F - 0.001F; - zEnd = z + 1.0F - 0.001F; - shouldRenderSide = renderSouth; - break; - case WEST: - yStart = heightSW; - yEnd = heightNW; - xStart = x + 0.001F; - xEnd = x + 0.001F; - zStart = z + 1.0F; - zEnd = z; - shouldRenderSide = renderWest; - break; - default: // EAST - yStart = heightNE; - yEnd = heightSE; - xStart = x + 1.0F - 0.001F; - xEnd = x + 1.0F - 0.001F; - zStart = z; - zEnd = z + 1.0F; - shouldRenderSide = renderEast; - } - - if (shouldRenderSide && !method_3344(direction, Math.max(yStart, yEnd), - world.getBlockState(pos.offset(direction)))) { - BlockPos sidePos = pos.offset(direction); - Sprite sideSprite = fluidSprites[1]; - if (!isLava) { - Block - sideBlock = - world.getBlockState(sidePos) - .getBlock(); - if (sideBlock instanceof TranslucentBlock - || sideBlock instanceof LeavesBlock) { - sideSprite = this.waterOverlaySprite; - } - } - - float uStart = sideSprite.getFrameU(0.0F); - float uCenter = sideSprite.getFrameU(0.5F); - float vStart = sideSprite.getFrameV((1.0F - yStart) * 0.5F); - float vEnd = sideSprite.getFrameV((1.0F - yEnd) * 0.5F); - float vCenter = sideSprite.getFrameV(0.5F); - - // MC 使用 lightNorth (0.8) 或 lightWest (0.6) 模拟侧面阴影 - float sideDimming = - direction.getAxis() == Direction.Axis.Z ? lightNorth : lightWest; - float sideRed = lightUp * sideDimming * red; - float sideGreen = lightUp * sideDimming * green; - float sideBlue = lightUp * sideDimming * blue; - - // 侧面法线 - float dirX = (float) direction.getOffsetX(); - float dirY = (float) direction.getOffsetY(); // 0 - float dirZ = (float) direction.getOffsetZ(); - - this.vertex(vertexConsumer, - xStart, - y + yStart, - zStart, - sideRed, - sideGreen, - sideBlue, - uStart, - vStart, - packedLightCenter, - dirX, - dirY, - dirZ); - this.vertex(vertexConsumer, - xEnd, - y + yEnd, - zEnd, - sideRed, - sideGreen, - sideBlue, - uCenter, - vEnd, - packedLightCenter, - dirX, - dirY, - dirZ); - this.vertex(vertexConsumer, - xEnd, - y + bottomYOffset, - zEnd, - sideRed, - sideGreen, - sideBlue, - uCenter, - vCenter, - packedLightCenter, - dirX, - dirY, - dirZ); - this.vertex(vertexConsumer, - xStart, - y + bottomYOffset, - zStart, - sideRed, - sideGreen, - sideBlue, - uStart, - vCenter, - packedLightCenter, - dirX, - dirY, - dirZ); - - if (sideSprite != this.waterOverlaySprite) { - // 双面渲染(通常用于查看背面时),法线保持几何方向或取反均可。 - // 这里为了保持光照一致性,通常使用与面朝向相同的法线。 - this.vertex(vertexConsumer, - xStart, - y + bottomYOffset, - zStart, - sideRed, - sideGreen, - sideBlue, - uStart, - vCenter, - packedLightCenter, - dirX, - dirY, - dirZ); - this.vertex(vertexConsumer, - xEnd, - y + bottomYOffset, - zEnd, - sideRed, - sideGreen, - sideBlue, - uCenter, - vCenter, - packedLightCenter, - dirX, - dirY, - dirZ); - this.vertex(vertexConsumer, - xEnd, - y + yEnd, - zEnd, - sideRed, - sideGreen, - sideBlue, - uCenter, - vEnd, - packedLightCenter, - dirX, - dirY, - dirZ); - this.vertex(vertexConsumer, - xStart, - y + yStart, - zStart, - sideRed, - sideGreen, - sideBlue, - uStart, - vStart, - packedLightCenter, - dirX, - dirY, - dirZ); - } - } - } - } - - ci.cancel(); + private FluidRendererMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/GameRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/GameRendererMixins.java index d466303..028707e 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/GameRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/GameRendererMixins.java @@ -1,166 +1,98 @@ package com.radiance.mixins.vulkan_render_integration; -import com.llamalad7.mixinextras.sugar.Local; -import com.radiance.client.proxy.vulkan.BufferProxy; import com.radiance.client.proxy.vulkan.RendererProxy; import com.radiance.client.proxy.world.EntityProxy; -import com.radiance.mixin_related.extensions.vulkan_render_integration.IGameRendererExt; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.ShaderLoader; -import net.minecraft.client.gl.ShaderProgramKey; import net.minecraft.client.render.BufferBuilderStorage; import net.minecraft.client.render.Camera; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.LightmapTextureManager; -import net.minecraft.client.render.RenderTickCounter; -import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.util.ObjectAllocator; -import net.minecraft.client.util.Pool; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.resource.ResourceFactory; -import org.joml.Matrix4f; -import org.joml.Matrix4fc; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GameRenderer.class) -public class GameRendererMixins implements IGameRendererExt { +public class GameRendererMixins { @Shadow @Final - public HeldItemRenderer firstPersonRenderer; - @Mutable - @Final + private HeldItemRenderer firstPersonRenderer; + @Shadow - private LightmapTextureManager lightmapTextureManager; @Final + private LightmapTextureManager lightmapTextureManager; + @Shadow - private MinecraftClient client; @Final - @Shadow - private Pool pool; + private MinecraftClient client; + @Shadow @Final private BufferBuilderStorage buffers; - @Unique - private Matrix4f viewMatrix; - - @Redirect(method = "preloadPrograms(Lnet/minecraft/resource/ResourceFactory;)V", - at = @At(value = "INVOKE", - target = - "Lnet/minecraft/client/gl/ShaderLoader;preload(Lnet/minecraft/resource/ResourceFactory;" - + - "[Lnet/minecraft/client/gl/ShaderProgramKey;)V")) - public void cancelPreloadShader(ShaderLoader instance, ResourceFactory factory, - ShaderProgramKey[] keys) { - - } - - @Inject(method = "renderBlur()V", at = @At(value = "HEAD"), cancellable = true) - public void redirectRenderBlur(CallbackInfo ci) { - float f = this.client.options.getMenuBackgroundBlurrinessValue(); - - //if (this.client.world == null && this.client.currentScreen != null && !(f < 1.0F)) { - if (!(f < 1.0F)) { - BufferProxy.updateOverlayPostUniform(f); - RendererProxy.postBlur(); - } + @Inject(method = "preloadPrograms(Lnet/minecraft/resource/ResourceFactory;)V", + at = @At("HEAD"), cancellable = true) + private void cancelPreloadPrograms(ResourceFactory factory, CallbackInfo ci) { ci.cancel(); } - @Redirect(method = "renderWorld(Lnet/minecraft/client/render/RenderTickCounter;)V", - at = @At(value = "INVOKE", target = "Lorg/joml/Matrix4f;mul(Lorg/joml/Matrix4fc;)Lorg/joml/Matrix4f;", remap = false)) - public Matrix4f cancelPTimesB(Matrix4f instance, Matrix4fc right) { - return instance; - } - - @Redirect(method = "renderWorld(Lnet/minecraft/client/render/RenderTickCounter;)V", - at = @At(value = "INVOKE", - target = - "Lnet/minecraft/client/render/WorldRenderer;render(Lnet/minecraft/client/util/ObjectAllocator;" - + - "Lnet/minecraft/client/render/RenderTickCounter;ZLnet/minecraft/client/render/Camera;" - + - "Lnet/minecraft/client/render/GameRenderer;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V")) - public void performBTimesV(WorldRenderer instance, - ObjectAllocator allocator, - RenderTickCounter tickCounter, - boolean renderBlockOutline, - Camera camera, - GameRenderer gameRenderer, - Matrix4f viewMatrix, - Matrix4f projectionMatrix, - @Local boolean shouldRenderBlockOutline, - @Local MatrixStack matrixStack) { - Matrix4f - B = - new Matrix4f(matrixStack.peek() - .getPositionMatrix()); - this.viewMatrix = new Matrix4f(viewMatrix); - viewMatrix = new Matrix4f(B.mul(viewMatrix)); - instance.render(this.pool, tickCounter, shouldRenderBlockOutline, camera, gameRenderer, - viewMatrix, projectionMatrix); - } - - @Inject(method = "renderWorld(Lnet/minecraft/client/render/RenderTickCounter;)V", at = @At(value = "TAIL")) - public void buildEntities(RenderTickCounter renderTickCounter, CallbackInfo ci) { - EntityProxy.build(); - } - - @Redirect(method = "renderWorld(Lnet/minecraft/client/render/RenderTickCounter;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;beginWrite(Z)V")) - public void cancelFramebufferBeginWrite(Framebuffer instance, boolean setViewport) { - + @Inject(method = "loadPrograms(Lnet/minecraft/resource/ResourceFactory;)V", + at = @At("HEAD"), cancellable = true) + private void cancelLoadPrograms(ResourceFactory factory, CallbackInfo ci) { + ci.cancel(); } - @Inject(method = "renderWorld(Lnet/minecraft/client/render/RenderTickCounter;)V", at = @At(value = "TAIL")) - public void fuseWorld(RenderTickCounter renderTickCounter, CallbackInfo ci) { + @Inject(method = "renderWorld(FJLnet/minecraft/client/util/math/MatrixStack;)V", + at = @At("TAIL")) + private void buildAndFuseWorld(float tickDelta, long limitTime, MatrixStack matrices, + CallbackInfo ci) { RendererProxy.fuseWorld(); } - @Inject(method = "renderHand(Lnet/minecraft/client/render/Camera;FLorg/joml/Matrix4f;)V", at = @At(value = "HEAD"), cancellable = true) - public void redirectRenderHand(Camera camera, float tickDelta, Matrix4f matrix4f, + @Inject(method = "renderHand(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/Camera;F)V", + at = @At("HEAD"), cancellable = true) + private void redirectRenderHand(MatrixStack matrices, Camera camera, float tickDelta, CallbackInfo ci) { - EntityProxy.queueHandRebuild(buffers, tickDelta, firstPersonRenderer); + EntityProxy.queueHandRebuild(this.buffers, tickDelta, this.firstPersonRenderer); ci.cancel(); } - @Redirect(method = "render(Lnet/minecraft/client/render/RenderTickCounter;Z)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;beginWrite(Z)V")) - public void cancelRenderFramebufferBeginWrite(Framebuffer instance, boolean setViewport) { + @Inject(method = "render(FJZ)V", at = @At("HEAD")) + private void shouldRenderWorld(float tickDelta, long startTime, boolean tick, CallbackInfo ci) { + RendererProxy.shouldRenderWorld( + !this.client.skipGameRender && tick && this.client.world != null); + } + @Redirect(method = "render(FJZ)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;beginWrite(Z)V")) + private void cancelFramebufferBeginWrite(Framebuffer framebuffer, boolean setViewport) { } - @Inject(method = "render(Lnet/minecraft/client/render/RenderTickCounter;Z)V", at = @At(value = "HEAD")) - public void shouldRenderWorld(RenderTickCounter tickCounter, boolean tick, CallbackInfo ci) { - RendererProxy.shouldRenderWorld( - !this.client.skipGameRender && client.isFinishedLoading() && tick - && client.world != null); + @Redirect(method = "render(FJZ)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;endWrite()V"), + require = 0) + private void cancelFramebufferEndWrite(Framebuffer framebuffer) { } - @Override - public Matrix4f radiance$getRotationMatrix() { - return viewMatrix; + @Redirect(method = "render(FJZ)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;draw(II)V"), + require = 0) + private void cancelFramebufferDraw(Framebuffer framebuffer, int width, int height) { } @Redirect(method = "updateWorldIcon(Ljava/nio/file/Path;)V", at = @At(value = "INVOKE", - target = - "Lnet/minecraft/client/util/ScreenshotRecorder;takeScreenshot(Lnet/minecraft/client/gl/Framebuffer;)" - + - "Lnet/minecraft/client/texture/NativeImage;")) - public NativeImage redirectScreenshot(Framebuffer framebuffer) { + target = "Lnet/minecraft/client/util/ScreenshotRecorder;takeScreenshot(Lnet/minecraft/client/gl/Framebuffer;)Lnet/minecraft/client/texture/NativeImage;")) + private NativeImage redirectScreenshot(Framebuffer framebuffer) { return RendererProxy.takeScreenshotWithoutUI(); } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/GlStateManagerMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/GlStateManagerMixins.java index 7dacf31..43ea648 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/GlStateManagerMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/GlStateManagerMixins.java @@ -319,11 +319,11 @@ private static void redirectClearStencil(int stencil, CallbackInfo ci) { // endregion // region - @Inject(method = "_clear(I)V", + @Inject(method = "_clear(IZ)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;assertOnRenderThreadOrInit()V", shift = At.Shift.AFTER), cancellable = true, remap = false) - private static void redirectClear(int mask, CallbackInfo ci) { + private static void redirectClear(int mask, boolean getError, CallbackInfo ci) { DrawCommandProxy.Overlay.glClear(mask); ci.cancel(); } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/HeldItemRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/HeldItemRendererMixins.java index 5b5ac48..f4229b1 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/HeldItemRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/HeldItemRendererMixins.java @@ -53,30 +53,36 @@ protected abstract void renderFirstPersonItem(AbstractClientPlayerEntity player, VertexConsumerProvider vertexConsumers, ClientPlayerEntity player, int light) { - float f = player.getHandSwingProgress(tickDelta); + float swingProgress = player.getHandSwingProgress(tickDelta); Hand hand = MoreObjects.firstNonNull(player.preferredHand, Hand.MAIN_HAND); - float g = player.getLerpedPitch(tickDelta); - HeldItemRenderer.HandRenderType handRenderType = HeldItemRenderer.getHandRenderType(player); - float h = MathHelper.lerp(tickDelta, player.lastRenderPitch, player.renderPitch); - float i = MathHelper.lerp(tickDelta, player.lastRenderYaw, player.renderYaw); + float pitch = MathHelper.lerp(tickDelta, player.prevPitch, player.getPitch()); + HeldItemRenderer.HandRenderType handRenderType = HeldItemRenderer.getHandRenderType( + player); + float renderPitch = MathHelper.lerp(tickDelta, player.lastRenderPitch, + player.renderPitch); + float renderYaw = MathHelper.lerp(tickDelta, player.lastRenderYaw, player.renderYaw); + matrices.multiply( - RotationAxis.POSITIVE_X.rotationDegrees((player.getPitch(tickDelta) - h) * 0.1F)); + RotationAxis.POSITIVE_X.rotationDegrees((player.getPitch(tickDelta) - renderPitch) + * 0.1F)); matrices.multiply( - RotationAxis.POSITIVE_Y.rotationDegrees((player.getYaw(tickDelta) - i) * 0.1F)); + RotationAxis.POSITIVE_Y.rotationDegrees((player.getYaw(tickDelta) - renderYaw) + * 0.1F)); + if (handRenderType.renderMainHand) { - float j = hand == Hand.MAIN_HAND ? f : 0.0F; - float k = 1.0F - MathHelper.lerp(tickDelta, this.prevEquipProgressMainHand, - this.equipProgressMainHand); - this.renderFirstPersonItem(player, tickDelta, g, Hand.MAIN_HAND, j, this.mainHand, k, - matrices, vertexConsumers, light); + float handSwing = hand == Hand.MAIN_HAND ? swingProgress : 0.0F; + float equipProgress = 1.0F - MathHelper.lerp(tickDelta, + this.prevEquipProgressMainHand, this.equipProgressMainHand); + this.renderFirstPersonItem(player, tickDelta, pitch, Hand.MAIN_HAND, handSwing, + this.mainHand, equipProgress, matrices, vertexConsumers, light); } if (handRenderType.renderOffHand) { - float j = hand == Hand.OFF_HAND ? f : 0.0F; - float k = 1.0F - MathHelper.lerp(tickDelta, this.prevEquipProgressOffHand, - this.equipProgressOffHand); - this.renderFirstPersonItem(player, tickDelta, g, Hand.OFF_HAND, j, this.offHand, k, - matrices, vertexConsumers, light); + float handSwing = hand == Hand.OFF_HAND ? swingProgress : 0.0F; + float equipProgress = 1.0F - MathHelper.lerp(tickDelta, + this.prevEquipProgressOffHand, this.equipProgressOffHand); + this.renderFirstPersonItem(player, tickDelta, pitch, Hand.OFF_HAND, handSwing, + this.offHand, equipProgress, matrices, vertexConsumers, light); } } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/ItemRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/ItemRendererMixins.java index f35687c..43bea48 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/ItemRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/ItemRendererMixins.java @@ -1,115 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import com.radiance.client.vertex.PBRVertexConsumer; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.OverlayVertexConsumer; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.TexturedRenderLayers; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.VertexConsumers; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +// TODO 1.20.1: item/glint consumer hooks changed and need a dedicated pass. +public final class ItemRendererMixins { -@Mixin(ItemRenderer.class) -public class ItemRendererMixins { - - @Inject(method = - "getArmorGlintConsumer(Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/client/render/RenderLayer;" - + - "Z)Lnet/minecraft/client/render/VertexConsumer;", at = @At(value = "HEAD"), cancellable = true) - private static void redirectGetArmorGlintConsumer(VertexConsumerProvider provider, - RenderLayer layer, - boolean glint, - CallbackInfoReturnable cir) { - VertexConsumer vertexConsumer = provider.getBuffer(layer); - - if (vertexConsumer instanceof PBRVertexConsumer pbrVertexConsumer) { - if (glint) { - cir.setReturnValue(new PBRVertexConsumer.GLint(pbrVertexConsumer, - RenderLayer.getArmorEntityGlint())); - } else { - cir.setReturnValue(vertexConsumer); - } - } else { - if (glint) { - cir.setReturnValue( - VertexConsumers.union(provider.getBuffer(RenderLayer.getArmorEntityGlint()), - vertexConsumer)); - } else { - cir.setReturnValue(vertexConsumer); - } - } - } - - @Inject(method = - "getDynamicDisplayGlintConsumer(Lnet/minecraft/client/render/VertexConsumerProvider;" + - "Lnet/minecraft/client/render/RenderLayer;Lnet/minecraft/client/util/math/MatrixStack$Entry;)" - + - "Lnet/minecraft/client/render/VertexConsumer;", at = @At(value = "HEAD"), cancellable = true) - private static void redirectGetDynamicDisplayGlintConsumer(VertexConsumerProvider provider, - RenderLayer layer, - MatrixStack.Entry entry, - CallbackInfoReturnable cir) { - VertexConsumer vertexConsumer = provider.getBuffer(layer); - - if (vertexConsumer instanceof PBRVertexConsumer pbrVertexConsumer) { - cir.setReturnValue( - new PBRVertexConsumer.GLintOverlay(pbrVertexConsumer, RenderLayer.getGlint(), entry, - 0.0078125F)); - } else { - cir.setReturnValue(VertexConsumers.union( - new OverlayVertexConsumer(provider.getBuffer(RenderLayer.getGlint()), - entry, - 0.0078125F), vertexConsumer)); - } - } - - @Inject(method = - "getItemGlintConsumer(Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/client/render/RenderLayer;" - + - "ZZ)Lnet/minecraft/client/render/VertexConsumer;", - at = @At(value = "HEAD"), - cancellable = true) - private static void redirectGetItemGlintConsumer(VertexConsumerProvider vertexConsumers, - RenderLayer layer, - boolean solid, - boolean glint, - CallbackInfoReturnable cir) { - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(layer); - - if (vertexConsumer instanceof PBRVertexConsumer pbrVertexConsumer) { - if (glint) { - RenderLayer - glintRenderLayer = - MinecraftClient.isFabulousGraphicsOrBetter() - && layer == TexturedRenderLayers.getItemEntityTranslucentCull() ? - RenderLayer.getGlintTranslucent() - : (solid ? RenderLayer.getGlint() : RenderLayer.getEntityGlint()); - - cir.setReturnValue( - new PBRVertexConsumer.GLint(pbrVertexConsumer, glintRenderLayer)); - } else { - cir.setReturnValue(vertexConsumer); - } - } else { - if (glint) { - cir.setReturnValue( - MinecraftClient.isFabulousGraphicsOrBetter() - && layer == TexturedRenderLayers.getItemEntityTranslucentCull() ? - VertexConsumers.union( - vertexConsumers.getBuffer(RenderLayer.getGlintTranslucent()), - vertexConsumer) : - VertexConsumers.union(vertexConsumers.getBuffer( - solid ? RenderLayer.getGlint() : RenderLayer.getEntityGlint()), - vertexConsumer)); - } else { - cir.setReturnValue(vertexConsumer); - } - } + private ItemRendererMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/LightmapTextureManagerMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/LightmapTextureManagerMixins.java index 71d93ed..6d155bd 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/LightmapTextureManagerMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/LightmapTextureManagerMixins.java @@ -1,235 +1,171 @@ package com.radiance.mixins.vulkan_render_integration; -import com.radiance.client.UnsafeManager; import com.radiance.mixin_related.extensions.vulkan_render_integration.ILightMapManagerExt; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.SimpleFramebuffer; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.util.profiler.Profiler; -import net.minecraft.util.profiler.Profilers; import org.joml.Vector3f; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LightmapTextureManager.class) public abstract class LightmapTextureManagerMixins implements ILightMapManagerExt { @Unique - private float ambientLightFactor = 0; + private float ambientLightFactor = 0.0F; + @Unique - private float skyFactor = 0; + private float skyFactor = 0.0F; + @Unique - private float blockFactor = 0; + private float blockFactor = 0.0F; + @Unique private boolean useBrightLightmap = false; + @Unique - private Vector3f skyLightColor = new Vector3f(0.0f, 0.0f, 0.0f); + private Vector3f skyLightColor = new Vector3f(0.0F, 0.0F, 0.0F); + @Unique - private float nightVisionFactor = 0; + private float nightVisionFactor = 0.0F; + @Unique - private float darknessScale = 0; + private float darknessScale = 0.0F; + @Unique - private float darkenWorldFactor = 0; + private float darkenWorldFactor = 0.0F; + @Unique - private float brightnessFactor = 0; + private float brightnessFactor = 0.0F; - @Mutable - @Final - @Shadow - private SimpleFramebuffer lightmapFramebuffer; @Shadow private boolean dirty; + @Shadow private float flickerIntensity; + @Final @Shadow private GameRenderer renderer; + @Final @Shadow private MinecraftClient client; - // region - @Redirect(method = "(Lnet/minecraft/client/render/GameRenderer;Lnet/minecraft/client/MinecraftClient;)V", - at = @At(value = "NEW", target = "net/minecraft/client/gl/SimpleFramebuffer")) - public SimpleFramebuffer cancelFramebufferConstruction(int width, int height, - boolean useDepth) { - return UnsafeManager.INSTANCE.allocateInstance(SimpleFramebuffer.class); - } - - @Redirect(method = "", - at = @At(value = "FIELD", - target = "Lnet/minecraft/client/render/LightmapTextureManager;" + - "lightmapFramebuffer:Lnet/minecraft/client/gl/SimpleFramebuffer;", - opcode = Opcodes.PUTFIELD)) - public void writeNullFramebuffer(LightmapTextureManager instance, SimpleFramebuffer value) { - this.lightmapFramebuffer = null; - } - - @Redirect(method = "(Lnet/minecraft/client/render/GameRenderer;Lnet/minecraft/client/MinecraftClient;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/SimpleFramebuffer;setTexFilter(I)V")) - public void cancelFramebufferSetTexFilter(SimpleFramebuffer instance, int i) { - - } - - @Redirect(method = "(Lnet/minecraft/client/render/GameRenderer;Lnet/minecraft/client/MinecraftClient;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/SimpleFramebuffer;setClearColor(FFFF)V")) - public void cancelFramebufferSetClearColor(SimpleFramebuffer instance, float r, float g, - float b, float a) { - - } - - @Redirect(method = "(Lnet/minecraft/client/render/GameRenderer;Lnet/minecraft/client/MinecraftClient;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/SimpleFramebuffer;clear()V")) - public void cancelFramebufferClear(SimpleFramebuffer instance) { - - } - // endregion - - // region - @Redirect(method = "close()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/SimpleFramebuffer;delete()V")) - public void cancelFramebufferDelete(SimpleFramebuffer instance) { - - } - // endregion - - // region - @Redirect(method = "disable()V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderTexture(II)V")) - public void cancelDisable(int texture, int glId) { - - } - // endregion - - // region - @Redirect(method = "enable()V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderTexture(II)V")) - public void cancelEnable(int texture, int glId) { - - } - // endregion - - // region @Shadow protected abstract float getDarknessFactor(float delta); @Shadow protected abstract float getDarkness(LivingEntity entity, float factor, float delta); - @Inject(method = "update(F)V", at = @At(value = "HEAD"), cancellable = true) - public void redirectUpdate(float delta, CallbackInfo ci) { + @Inject(method = "update(F)V", at = @At("HEAD"), cancellable = true) + private void redirectUpdate(float delta, CallbackInfo ci) { if (this.dirty) { this.dirty = false; - Profiler profiler = Profilers.get(); + Profiler profiler = this.client.getProfiler(); profiler.push("lightTex"); ClientWorld clientWorld = this.client.world; - if (clientWorld != null) { - float f = clientWorld.getSkyBrightness(1.0F); - float skyFactor; - if (clientWorld.getLightningTicksLeft() > 0) { - skyFactor = 1.0F; - } else { - skyFactor = f * 0.95F + 0.05F; - } - - float - h = - this.client.options.getDarknessEffectScale() - .getValue() - .floatValue(); - float i = this.getDarknessFactor(delta) * h; - float darknessScale = this.getDarkness(this.client.player, i, delta) * h; - float k = this.client.player.getUnderwaterVisibility(); - float nightVisionFactor; + if (clientWorld != null && this.client.player != null) { + float skyBrightness = clientWorld.getSkyBrightness(1.0F); + float computedSkyFactor = clientWorld.getLightningTicksLeft() > 0 ? 1.0F + : skyBrightness * 0.95F + 0.05F; + + float darknessEffectScale = this.client.options.getDarknessEffectScale() + .getValue() + .floatValue(); + float darknessFactor = this.getDarknessFactor(delta) * darknessEffectScale; + float computedDarknessScale = this.getDarkness(this.client.player, darknessFactor, + delta) * darknessEffectScale; + float underwaterVisibility = this.client.player.getUnderwaterVisibility(); + float computedNightVisionFactor; if (this.client.player.hasStatusEffect(StatusEffects.NIGHT_VISION)) { - nightVisionFactor = GameRenderer.getNightVisionStrength(this.client.player, - delta); - } else if (k > 0.0F && this.client.player.hasStatusEffect( + computedNightVisionFactor = GameRenderer.getNightVisionStrength( + this.client.player, delta); + } else if (underwaterVisibility > 0.0F && this.client.player.hasStatusEffect( StatusEffects.CONDUIT_POWER)) { - nightVisionFactor = k; + computedNightVisionFactor = underwaterVisibility; } else { - nightVisionFactor = 0.0F; + computedNightVisionFactor = 0.0F; } - Vector3f skyLightColor = new Vector3f(f, f, 1.0F).lerp( - new Vector3f(1.0F, 1.0F, 1.0F), 0.35F); - float blockFactor = this.flickerIntensity + 1.5F; - float - ambientLightFactor = - clientWorld.getDimension() - .ambientLight(); - boolean - useBrightLightmap = - clientWorld.getDimensionEffects() - .shouldBrightenLighting(); - float - o = - this.client.options.getGamma() - .getValue() - .floatValue(); - - float darkenWorldFactor = this.renderer.getSkyDarkness(delta); - float brightnessFactor = Math.max(0.0F, o - i); - - this.ambientLightFactor = ambientLightFactor; - this.skyFactor = skyFactor; - this.blockFactor = blockFactor; - this.useBrightLightmap = useBrightLightmap; - this.skyLightColor = skyLightColor; - this.nightVisionFactor = nightVisionFactor; - this.darknessScale = darknessScale; - this.darkenWorldFactor = darkenWorldFactor; - this.brightnessFactor = brightnessFactor; - - profiler.pop(); + Vector3f computedSkyLightColor = new Vector3f(skyBrightness, skyBrightness, 1.0F) + .lerp(new Vector3f(1.0F, 1.0F, 1.0F), 0.35F); + float computedBlockFactor = this.flickerIntensity + 1.5F; + float computedAmbientLightFactor = clientWorld.getDimension().ambientLight(); + boolean computedUseBrightLightmap = clientWorld.getDimensionEffects() + .shouldBrightenLighting(); + float gamma = this.client.options.getGamma() + .getValue() + .floatValue(); + float computedDarkenWorldFactor = this.renderer.getSkyDarkness(delta); + float computedBrightnessFactor = Math.max(0.0F, gamma - darknessFactor); + + this.ambientLightFactor = computedAmbientLightFactor; + this.skyFactor = computedSkyFactor; + this.blockFactor = computedBlockFactor; + this.useBrightLightmap = computedUseBrightLightmap; + this.skyLightColor = computedSkyLightColor; + this.nightVisionFactor = computedNightVisionFactor; + this.darknessScale = computedDarknessScale; + this.darkenWorldFactor = computedDarkenWorldFactor; + this.brightnessFactor = computedBrightnessFactor; } + profiler.pop(); } ci.cancel(); } - // endregion + @Override public float radiance$getAmbientLightFactor() { - return ambientLightFactor; + return this.ambientLightFactor; } + @Override public float radiance$getSkyFactor() { - return skyFactor; + return this.skyFactor; } + @Override public float radiance$getBlockFactor() { - return blockFactor; + return this.blockFactor; } + @Override public boolean radiance$isUseBrightLightmap() { - return useBrightLightmap; + return this.useBrightLightmap; } + @Override public Vector3f radiance$getSkyLightColor() { - return skyLightColor; + return this.skyLightColor; } + @Override public float radiance$getNightVisionFactor() { - return nightVisionFactor; + return this.nightVisionFactor; } + @Override public float radiance$getDarknessScale() { - return darknessScale; + return this.darknessScale; } + @Override public float radiance$getDarkenWorldFactor() { - return darkenWorldFactor; + return this.darkenWorldFactor; } + @Override public float radiance$getBrightnessFactor() { - return brightnessFactor; + return this.brightnessFactor; } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/MinecraftClientMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/MinecraftClientMixins.java index 80cbd3b..aab435a 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/MinecraftClientMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/MinecraftClientMixins.java @@ -1,23 +1,17 @@ package com.radiance.mixins.vulkan_render_integration; import com.radiance.client.UnsafeManager; -import com.radiance.client.option.Options; import com.radiance.client.pipeline.Pipeline; import com.radiance.client.proxy.vulkan.RendererProxy; -import com.radiance.client.proxy.vulkan.TextureProxy; import com.radiance.client.proxy.world.ChunkProxy; import java.util.Optional; -import java.util.function.Consumer; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.RunArgs; +import net.minecraft.client.WindowEventHandler; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gl.GlTimer; -import net.minecraft.client.gl.ShaderLoader; import net.minecraft.client.gl.WindowFramebuffer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.Window; -import net.minecraft.resource.ReloadableResourceManagerImpl; -import net.minecraft.resource.ResourceReloader; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -29,34 +23,32 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(MinecraftClient.class) -public class MinecraftClientMixins { +public abstract class MinecraftClientMixins { @Shadow @Final private Window window; - //region - @Inject(method = "isAmbientOcclusionEnabled()Z", at = @At(value = "HEAD"), cancellable = true) + @Inject(method = "isAmbientOcclusionEnabled()Z", at = @At("HEAD"), cancellable = true) private static void disableAmbientOcclusion(CallbackInfoReturnable cir) { cir.setReturnValue(false); } - // endregion - // region @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;initRenderer(IZ)V")) - public void initRenderer(int debugVerbosity, boolean debugSync) { - long stackSize = 512 * 1024 * 1024; // 32MB - Runnable myRunnable = () -> { + private void initRenderer(int debugVerbosity, boolean debugSync, RunArgs args) { + long stackSize = 512L * 1024L * 1024L; + Runnable initTask = () -> { RendererProxy.initRenderer(window); Pipeline.collectNativeModules(); }; - Thread myThread = new Thread(null, myRunnable, "", stackSize); - myThread.start(); + Thread initThread = new Thread(null, initTask, "radiance-renderer-init", stackSize); + initThread.start(); try { - myThread.join(); + initThread.join(); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new RuntimeException(e); } @@ -66,48 +58,25 @@ public void initRenderer(int debugVerbosity, boolean debugSync) { @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", at = @At(value = "NEW", target = "net/minecraft/client/gl/WindowFramebuffer")) - public WindowFramebuffer cancelNewFramebuffer(int width, int height) { + private WindowFramebuffer cancelNewFramebuffer(int width, int height) { return UnsafeManager.INSTANCE.allocateInstance(WindowFramebuffer.class); } @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;framebuffer:Lnet/minecraft/client/gl/Framebuffer;", - opcode = org.objectweb.asm.Opcodes.PUTFIELD)) - public void writeNullFramebuffer(MinecraftClient instance, Framebuffer value) { - } - - @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", at = @At(value = "NEW", target = "net/minecraft/client/gl/ShaderLoader")) - public ShaderLoader cancelNewShaderLoader(TextureManager textureManager, Consumer onError) { - return UnsafeManager.INSTANCE.allocateInstance(ShaderLoader.class); - } - - @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", - at = @At(value = "FIELD", - target = "Lnet/minecraft/client/MinecraftClient;shaderLoader:Lnet/minecraft/client/gl/ShaderLoader;", - opcode = org.objectweb.asm.Opcodes.PUTFIELD)) - public void writeNullShaderLoader(MinecraftClient instance, ShaderLoader value) { - } - - @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/resource/ReloadableResourceManagerImpl;registerReloader" + - "(Lnet/minecraft/resource/ResourceReloader;)V", - ordinal = 2)) - public void cancelShaderLoaderRegister(ReloadableResourceManagerImpl instance, - ResourceReloader reloader) { + opcode = Opcodes.PUTFIELD)) + private void suppressFramebufferAssignment(MinecraftClient instance, Framebuffer value) { } @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;setClearColor(FFFF)V")) - public void cancelSetClearColor(Framebuffer instance, float r, float g, float b, float a) { - + private void cancelSetClearColor(Framebuffer instance, float r, float g, float b, float a) { } @Redirect(method = "(Lnet/minecraft/client/RunArgs;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;clear()V")) - public void cancelClear(Framebuffer instance) { - + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;clear(Z)V")) + private void cancelClear(Framebuffer instance, boolean getError) { } @Redirect(method = "", @@ -115,82 +84,61 @@ public void cancelClear(Framebuffer instance) { opcode = Opcodes.GETFIELD, target = "Lnet/minecraft/client/gl/Framebuffer;textureWidth:I", ordinal = 0)) - public int redirectFramebufferTextureWidth(Framebuffer framebuffer) { + private int redirectFramebufferTextureWidth(Framebuffer framebuffer) { return this.window.getFramebufferWidth(); } @Redirect(method = "", - at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lnet/minecraft/client/gl/Framebuffer;textureHeight:I"), + at = @At(value = "FIELD", + opcode = Opcodes.GETFIELD, + target = "Lnet/minecraft/client/gl/Framebuffer;textureHeight:I"), require = 0) - public int redirectFramebufferTextureHeight(Framebuffer framebuffer) { + private int redirectFramebufferTextureHeight(Framebuffer framebuffer) { return this.window.getFramebufferHeight(); } - // endregion - - // region - @Redirect(method = "render(Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;beginWrite(Z)V")) - public void cancelFramebufferBeginWrite(Framebuffer instance, boolean setViewport) { + @Redirect(method = "render(Z)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;beginWrite(Z)V")) + private void cancelFramebufferBeginWrite(Framebuffer instance, boolean setViewport) { } - @Redirect(method = "render(Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;endWrite()V")) - public void cancelFramebufferEndWrite(Framebuffer instance, boolean setViewport) { + @Redirect(method = "render(Z)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;endWrite()V")) + private void cancelFramebufferEndWrite(Framebuffer instance) { ChunkProxy.waitImportantChunkRebuild(); - synchronized (TextureProxy.class) { - RendererProxy.submitCommandAndPresent(); - RendererProxy.acquireContext(); - } + RendererProxy.submitCommandAndPresent(); + RendererProxy.acquireContext(); } - @Redirect(method = "render(Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;draw(II)V")) - public void cancelFramebufferDraw(Framebuffer instance, int width, int height) { - + @Redirect(method = "render(Z)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;draw(II)V")) + private void cancelFramebufferDraw(Framebuffer instance, int width, int height) { } - @Redirect(method = "render(Z)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;limitDisplayFPS(I)V")) - public void disableFPSLimit(int fps) { - + @Redirect(method = "render(Z)V", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;limitDisplayFPS(I)V")) + private void disableFpsLimit(int fps) { } - @Redirect(method = "render(Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/GlTimer;getInstance()Ljava/util/Optional;")) - public Optional disableGLTimerInstance() { + @Redirect(method = "render(Z)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/GlTimer;getInstance()Ljava/util/Optional;")) + private Optional disableGlTimer() { return Optional.empty(); } - // endregion - - // region - @Redirect(method = "onResolutionChanged()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;resize(II)V")) - public void cancelFramebufferResize(Framebuffer instance, int width, int height) { + @Redirect(method = "onResolutionChanged()V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;resize(IIZ)V")) + private void cancelFramebufferResize(Framebuffer instance, int width, int height, + boolean getError) { } - // endregion - // region - @Redirect(method = "close()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/ShaderLoader;close()V")) - public void cancelShaderLoaderClose(ShaderLoader instance) { - Options.overwriteConfig(); - } - //endregion - - // region - @Inject(method = "scheduleStop()V", at = @At(value = "TAIL")) - public void close(CallbackInfo ci) { + @Inject(method = "scheduleStop()V", at = @At("TAIL")) + private void closeRenderer(CallbackInfo ci) { RendererProxy.close(); } - // endregion - - // region - @Redirect(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;Z)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;render(Z)V")) - public void cancelRenderAfterStop(MinecraftClient instance, boolean tick) { - - } - @Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;Z)V", - at = @At(value = "HEAD")) - public void resetBuiltChunkNum(Screen disconnectionScreen, boolean transferring, - CallbackInfo ci) { + @Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At("HEAD")) + private void resetBuiltChunkNum(CallbackInfo ci) { ChunkProxy.builtChunkNum = 0; } - // endregion } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/NativeImageMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/NativeImageMixins.java index cb5823b..0ce1f8d 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/NativeImageMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/NativeImageMixins.java @@ -1,9 +1,11 @@ package com.radiance.mixins.vulkan_render_integration; import com.mojang.blaze3d.systems.RenderSystem; +import com.radiance.client.constant.VulkanConstants; import com.radiance.client.proxy.vulkan.RendererProxy; import com.radiance.client.proxy.vulkan.TextureProxy; import com.radiance.client.texture.AuxiliaryTextures; +import com.radiance.client.texture.TextureTracker; import com.radiance.mixin_related.extensions.vanilla_resource_tracker.INativeImageExt; import java.util.function.IntUnaryOperator; import net.minecraft.client.texture.NativeImage; @@ -44,12 +46,39 @@ public abstract class NativeImageMixins implements @Shadow public abstract NativeImage.Format getFormat(); - @Inject(method = "uploadInternal(IIIIIIIZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/NativeImage;checkAllocated()V", shift = At.Shift.AFTER), cancellable = true) + @Inject(method = "uploadInternal(IIIIIIIZZZZ)V", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/texture/NativeImage;checkAllocated()V", + shift = At.Shift.AFTER), + cancellable = true) public void redirectUploadInternal(int level, int offsetX, int offsetY, int unpackSkipPixels, - int unpackSkipRows, int regionWidth, int regionHeight, boolean blur, CallbackInfo ci) { + int unpackSkipRows, int regionWidth, int regionHeight, boolean blur, boolean clamp, + boolean mipmap, boolean close, CallbackInfo ci) { try { INativeImageExt self = (INativeImageExt) this; int targetId = self.radiance$getTargetID(); + if (targetId == -1) { + targetId = TextureTracker.currentBoundTextureID; + if (targetId != -1) { + self.radiance$setTargetID(targetId); + } + } + if (targetId == -1) { + throw new IllegalStateException("No active texture target for NativeImage upload"); + } + + TextureProxy.setFilter(targetId, + blur ? VulkanConstants.VkFilter.VK_FILTER_LINEAR.getValue() : + VulkanConstants.VkFilter.VK_FILTER_NEAREST.getValue(), + mipmap + ? (blur + ? VulkanConstants.VkSamplerMipmapMode.VK_SAMPLER_MIPMAP_MODE_LINEAR.getValue() + : VulkanConstants.VkSamplerMipmapMode.VK_SAMPLER_MIPMAP_MODE_NEAREST.getValue()) + : VulkanConstants.VkSamplerMipmapMode.VK_SAMPLER_MIPMAP_MODE_NEAREST.getValue()); + TextureProxy.setClamp(targetId, + clamp + ? VulkanConstants.VkSamplerAddressMode.VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.getValue() + : VulkanConstants.VkSamplerAddressMode.VK_SAMPLER_ADDRESS_MODE_REPEAT.getValue()); AuxiliaryTextures.loadAndUpload((NativeImage) (Object) this, self, level, offsetX, offsetY, unpackSkipPixels, unpackSkipRows, regionWidth, regionHeight, blur); @@ -57,7 +86,7 @@ public void redirectUploadInternal(int level, int offsetX, int offsetY, int unpa TextureProxy.queueUpload(pointer, (int) sizeBytes, width, targetId, unpackSkipPixels, unpackSkipRows, offsetX, offsetY, regionWidth, regionHeight, level); } finally { - if (blur) { + if (close) { this.close(); } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderLayerMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderLayerMixins.java index fe4acc2..c8269a1 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderLayerMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderLayerMixins.java @@ -1,45 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderPhase; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.util.Identifier; -import net.minecraft.util.TriState; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +// TODO 1.20.1: RenderLayer flags differ and need a dedicated pass. +public final class RenderLayerMixins { -@Mixin(RenderLayer.class) -public class RenderLayerMixins { - - @Shadow - @Final - @Mutable - private static RenderLayer LIGHTNING; - - @Inject(method = "", at = @At("TAIL")) - private static void replaceLightning(CallbackInfo ci) { - LIGHTNING = - RenderLayer.of("lightning", - VertexFormats.POSITION_TEXTURE_COLOR, - VertexFormat.DrawMode.QUADS, - 1536, - false, - true, - RenderLayer.MultiPhaseParameters.builder() - .program(RenderLayer.LIGHTNING_PROGRAM) - .writeMaskState(RenderLayer.ALL_MASK) - .transparency(RenderLayer.LIGHTNING_TRANSPARENCY) - .target(RenderLayer.WEATHER_TARGET) - .texture(new RenderPhase.Texture( - Identifier.ofVanilla("textures/block/lightning.png"), - TriState.FALSE, - false)) - .build(false)); + private RenderLayerMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseLightmapMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseLightmapMixins.java index c4eea7e..d424b21 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseLightmapMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseLightmapMixins.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(RenderPhase.Lightmap.class) +@Mixin(targets = "net.minecraft.client.render.RenderPhase$Lightmap") public class RenderPhaseLightmapMixins extends RenderPhaseMixins { @Inject(method = "(Z)V", at = @At(value = "TAIL")) diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseTargetMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseTargetMixins.java index d3ddd9e..0196b26 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseTargetMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderPhaseTargetMixins.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(RenderPhase.Target.class) +@Mixin(targets = "net.minecraft.client.render.RenderPhase$Target") public class RenderPhaseTargetMixins extends RenderPhaseMixins { @Inject(method = "(Ljava/lang/String;Ljava/lang/Runnable;Ljava/lang/Runnable;)V", at = @At(value = "TAIL")) diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderSystemMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderSystemMixins.java index 7a204c7..ad889dc 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderSystemMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/RenderSystemMixins.java @@ -2,88 +2,111 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.radiance.client.proxy.vulkan.RendererProxy; +import java.util.Locale; +import java.util.function.Supplier; import net.minecraft.client.gl.ShaderProgram; -import net.minecraft.client.gl.ShaderProgramKey; -import org.joml.Matrix4f; -import org.joml.Matrix4fStack; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(RenderSystem.class) -public abstract class RenderSystemMixins { +public class RenderSystemMixins { @Shadow(remap = false) - private static Matrix4f projectionMatrix; + private static ShaderProgram shader; - @Shadow(remap = false) - private static Matrix4f savedProjectionMatrix; - - @Final - @Shadow(remap = false) - private static Matrix4fStack modelViewStack; - - @Shadow(remap = false) - private static Matrix4f textureMatrix; - - @Inject(method = "maxSupportedTextureSize()I", at = @At(value = "HEAD"), cancellable = true, remap = false) + @Inject(method = "maxSupportedTextureSize()I", at = @At("HEAD"), cancellable = true, + remap = false) private static void redirectMaxSupportedTextureSize(CallbackInfoReturnable cir) { - int maxImageSize = RendererProxy.maxSupportedTextureSize(); - cir.setReturnValue(maxImageSize); + cir.setReturnValue(RendererProxy.maxSupportedTextureSize()); } - @Inject(method = "setShader(Lnet/minecraft/client/gl/ShaderProgramKey;)Lnet/minecraft/client/gl/ShaderProgram;", - at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;assertOnRenderThread()V", shift = At.Shift.AFTER, remap = false), - cancellable = true) - private static void redirectSetShaderProgram(ShaderProgramKey shaderProgramKey, - CallbackInfoReturnable cir) { - // need formalize - int - type = - switch (shaderProgramKey.configId() - .toString()) { - case "minecraft:core/rendertype_glint", - "minecraft:core/rendertype_glint_translucent", - "minecraft:core/rendertype_entity_glint", - "minecraft:core/rendertype_armor_entity_glint" -> 0; - case "minecraft:core/position_color", "minecraft:core/rendertype_gui", - "minecraft:core/rendertype_gui_overlay", - "minecraft:core/rendertype_gui_text_highlight" -> 1; - case "minecraft:core/position_tex_color" -> 2; - case "minecraft:core/rendertype_text" -> 3; - case "minecraft:core/rendertype_entity_cutout", - "minecraft:core/rendertype_entity_cutout_no_cull", - "minecraft:core/rendertype_entity_cutout_no_cull_z_offset", - "minecraft:core/rendertype_entity_translucent", - "minecraft:core/rendertype_item_entity_translucent_cull", - "minecraft:core/rendertype_entity_solid" -> 4; - case "minecraft:core/rendertype_entity_no_outline", - "minecraft:core/rendertype_armor_cutout_no_cull", - "minecraft:core/rendertype_armor_translucent" -> 5; - case "minecraft:core/rendertype_end_portal" -> 6; - case "minecraft:core/position" -> 7; - default -> throw new IllegalStateException( - "Unexpected value: " + shaderProgramKey.configId()); - }; + @Inject(method = "setShader(Ljava/util/function/Supplier;)V", at = @At("TAIL"), + remap = false) + private static void bindOverlayPipelineOnDirectSet(Supplier supplier, + CallbackInfo ci) { + bindCurrentOverlayPipeline(); + } - RendererProxy.bindOverlayPipeline(type); + @Inject(method = "lambda$setShader$62(Ljava/util/function/Supplier;)V", at = @At("TAIL"), + remap = false) + private static void bindOverlayPipelineOnDeferredSet(Supplier supplier, + CallbackInfo ci) { + bindCurrentOverlayPipeline(); + } + + private static void bindCurrentOverlayPipeline() { + if (shader == null) { + RendererProxy.bindOverlayPipeline(-1); + return; + } - cir.setReturnValue(null); + int pipelineType = mapOverlayPipeline(shader.getName()); + if (pipelineType < 0) { + System.out.println("[Radiance] Unmapped overlay shader: " + shader.getName()); + } + RendererProxy.bindOverlayPipeline(pipelineType); } - @Redirect(method = "flipFrame(JLnet/minecraft/client/util/tracy/TracyFrameCapturer;)V", - at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwSwapBuffers(J)V", remap = false)) - private static void cancelSwapBuffers(long window) { + private static int mapOverlayPipeline(String shaderName) { + String normalized = normalizeShaderName(shaderName); + return switch (normalized) { + case "rendertype_glint", "rendertype_glint_direct", "rendertype_glint_translucent", + "rendertype_entity_glint", "rendertype_entity_glint_direct", + "rendertype_armor_glint", "rendertype_armor_entity_glint", "position_tex" -> 0; + case "position_color", "rendertype_gui", "rendertype_gui_overlay", + "rendertype_gui_text_highlight", "rendertype_gui_ghost_recipe_overlay", + "rendertype_lines" -> 1; + case "position_tex_color", "rendertype_lightning" -> 2; + case "rendertype_text", "rendertype_text_background", + "rendertype_text_background_see_through", "rendertype_text_intensity", + "rendertype_text_intensity_see_through", "rendertype_text_see_through", + "particle" -> 3; + case "rendertype_entity_cutout", "rendertype_entity_cutout_no_cull", + "rendertype_entity_cutout_no_cull_z_offset", + "rendertype_entity_translucent", "rendertype_entity_translucent_cull", + "rendertype_entity_translucent_emissive", + "rendertype_item_entity_translucent_cull", "rendertype_entity_solid", + "rendertype_entity_smooth_cutout", "rendertype_entity_shadow", + "rendertype_entity_alpha", "rendertype_entity_decal", + "rendertype_energy_swirl", "rendertype_eyes", "rendertype_beacon_beam" -> 4; + case "rendertype_entity_no_outline", "rendertype_armor_cutout_no_cull" -> 5; + case "rendertype_end_portal", "rendertype_end_gateway" -> 6; + case "position" -> 7; + default -> -1; + }; } - @Redirect(method = "renderCrosshair(I)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GLX;_renderCrosshair(IZZZ)V")) - private static void cancelDrawCrossAirForNow(int size, boolean drawX, boolean drawY, - boolean drawZ) { + private static String normalizeShaderName(String shaderName) { + if (shaderName == null) { + return ""; + } + String normalized = shaderName.toLowerCase(Locale.ROOT).replace('\\', '/'); + int namespaceSeparator = normalized.indexOf(':'); + if (namespaceSeparator >= 0) { + normalized = normalized.substring(namespaceSeparator + 1); + } + if (normalized.startsWith("core/")) { + normalized = normalized.substring("core/".length()); + } + if (normalized.startsWith("minecraft/shaders/core/")) { + normalized = normalized.substring("minecraft/shaders/core/".length()); + } + if (normalized.endsWith(".json")) { + normalized = normalized.substring(0, normalized.length() - ".json".length()); + } + return normalized; + } + + @Redirect(method = "flipFrame(J)V", + at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwSwapBuffers(J)V"), + remap = false) + private static void cancelSwapBuffers(long window) { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/ScreenMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/ScreenMixins.java index 6387c54..1db8be9 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/ScreenMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/ScreenMixins.java @@ -1,16 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gui.screen.Screen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(Screen.class) -public class ScreenMixins { - - @Redirect(method = "applyBlur()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;beginWrite(Z)V")) - public void cancelFrameBufferInApplyBlur(Framebuffer instance, boolean setViewport) { +// TODO 1.20.1: screen blur no longer uses the old Framebuffer.beginWrite redirect path. +public final class ScreenMixins { + private ScreenMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/SectionBuilderMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/SectionBuilderMixins.java index 440bcf9..cf9dceb 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/SectionBuilderMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/SectionBuilderMixins.java @@ -1,143 +1,8 @@ package com.radiance.mixins.vulkan_render_integration; -import com.mojang.blaze3d.systems.VertexSorter; -import com.radiance.client.vertex.PBRVertexConsumer; -import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; -import java.util.Map; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.render.BuiltBuffer; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.block.BlockModelRenderer; -import net.minecraft.client.render.block.BlockRenderManager; -import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -import net.minecraft.client.render.chunk.BlockBufferAllocatorStorage; -import net.minecraft.client.render.chunk.ChunkOcclusionDataBuilder; -import net.minecraft.client.render.chunk.ChunkRendererRegion; -import net.minecraft.client.render.chunk.SectionBuilder; -import net.minecraft.client.util.BufferAllocator; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkSectionPos; -import net.minecraft.util.math.random.Random; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +// TODO 1.20.1: section building moved into ChunkBuilder.BuiltChunk.RebuildTask. +public final class SectionBuilderMixins { -@Mixin(SectionBuilder.class) -public abstract class SectionBuilderMixins { - - @Final - @Shadow - private BlockRenderManager blockRenderManager; - - @Final - @Shadow - private BlockEntityRenderDispatcher blockEntityRenderDispatcher; - - @Shadow - protected abstract void addBlockEntity(SectionBuilder.RenderData data, - E blockEntity); - - @Inject(method = - "build(Lnet/minecraft/util/math/ChunkSectionPos;Lnet/minecraft/client/render/chunk/ChunkRendererRegion;" - + - "Lcom/mojang/blaze3d/systems/VertexSorter;Lnet/minecraft/client/render/chunk/BlockBufferAllocatorStorage;)" - + - "Lnet/minecraft/client/render/chunk/SectionBuilder$RenderData;", at = @At(value = "HEAD"), cancellable = true) - public void redirectBuild(ChunkSectionPos sectionPos, - ChunkRendererRegion renderRegion, - VertexSorter vertexSorter, - BlockBufferAllocatorStorage allocatorStorage, - CallbackInfoReturnable cir) { - SectionBuilder.RenderData renderData = new SectionBuilder.RenderData(); - BlockPos blockPos = sectionPos.getMinPos(); - BlockPos blockPos2 = blockPos.add(15, 15, 15); - ChunkOcclusionDataBuilder chunkOcclusionDataBuilder = new ChunkOcclusionDataBuilder(); - MatrixStack matrixStack = new MatrixStack(); - BlockModelRenderer.enableBrightnessCache(); - Map - map = - new Reference2ObjectArrayMap<>(RenderLayer.getBlockLayers() - .size()); - Random random = Random.create(); - - for (BlockPos blockPos3 : BlockPos.iterate(blockPos, blockPos2)) { - BlockState blockState = renderRegion.getBlockState(blockPos3); - if (blockState.isOpaqueFullCube()) { - chunkOcclusionDataBuilder.markClosed(blockPos3); - } - - if (blockState.hasBlockEntity()) { - BlockEntity blockEntity = renderRegion.getBlockEntity(blockPos3); - if (blockEntity != null) { - this.addBlockEntity(renderData, blockEntity); - } - } - - FluidState fluidState = blockState.getFluidState(); - if (!fluidState.isEmpty()) { - RenderLayer renderLayer = RenderLayers.getFluidLayer(fluidState); - PBRVertexConsumer bufferBuilder = this.beginBufferBuilding(map, allocatorStorage, - renderLayer); - this.blockRenderManager.renderFluid(blockPos3, renderRegion, bufferBuilder, - blockState, fluidState); - } - - if (blockState.getRenderType() == BlockRenderType.MODEL) { - RenderLayer renderLayer = RenderLayers.getBlockLayer(blockState); - PBRVertexConsumer bufferBuilder = this.beginBufferBuilding(map, allocatorStorage, - renderLayer); - matrixStack.push(); - matrixStack.translate((float) ChunkSectionPos.getLocalCoord(blockPos3.getX()), - (float) ChunkSectionPos.getLocalCoord(blockPos3.getY()), - (float) ChunkSectionPos.getLocalCoord(blockPos3.getZ())); - this.blockRenderManager.renderBlock(blockState, blockPos3, renderRegion, - matrixStack, bufferBuilder, true, random); - matrixStack.pop(); - } - } - - for (Map.Entry entry : map.entrySet()) { - RenderLayer renderLayer2 = entry.getKey(); - BuiltBuffer - builtBuffer = - entry.getValue() - .endNullable(); - if (builtBuffer != null) { - if (renderLayer2 == RenderLayer.getTranslucent()) { - renderData.translucencySortingData = - builtBuffer.sortQuads(allocatorStorage.get(RenderLayer.getTranslucent()), - vertexSorter); - } - - renderData.buffers.put(renderLayer2, builtBuffer); - } - } - - BlockModelRenderer.disableBrightnessCache(); - renderData.chunkOcclusionData = chunkOcclusionDataBuilder.build(); - cir.setReturnValue(renderData); - } - - @Unique - private PBRVertexConsumer beginBufferBuilding(Map builders, - BlockBufferAllocatorStorage allocatorStorage, - RenderLayer layer) { - PBRVertexConsumer pbrVertexConsumer = builders.get(layer); - if (pbrVertexConsumer == null) { - BufferAllocator bufferAllocator = allocatorStorage.get(layer); - pbrVertexConsumer = new PBRVertexConsumer(bufferAllocator, layer); - builders.put(layer, pbrVertexConsumer); - } - - return pbrVertexConsumer; + private SectionBuilderMixins() { } } diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/WindowMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/WindowMixins.java index 8dd803c..db77f0d 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/WindowMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/WindowMixins.java @@ -117,25 +117,6 @@ public GLCapabilities cancelGLCreateCapabilities() { return null; } - @Redirect(method = - "(Lnet/minecraft/client/WindowEventHandler;Lnet/minecraft/client/util/MonitorTracker;" - + - "Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)V", - at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;maxSupportedTextureSize()I", remap = false)) - public int cancelGetMaxSupportedTextureSize() { - return 0; - } - - @Redirect(method = - "(Lnet/minecraft/client/WindowEventHandler;Lnet/minecraft/client/util/MonitorTracker;" - + - "Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)V", - at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwSetWindowSizeLimits(JIIII)V", remap = false)) - public void cancelGetMaxSupportedTextureSize(long window, int minwidth, int minheight, - int maxwidth, int maxheight) { - // Don't allow user to set window size manually - } - @Inject(method = "onFramebufferSizeChanged(JII)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/WindowEventHandler;onResolutionChanged()V")) public void framebufferSizeChanged(long window, int width, int height, CallbackInfo ci) { diff --git a/src/main/java/com/radiance/mixins/vulkan_render_integration/WorldRendererMixins.java b/src/main/java/com/radiance/mixins/vulkan_render_integration/WorldRendererMixins.java index 657c121..712fe50 100644 --- a/src/main/java/com/radiance/mixins/vulkan_render_integration/WorldRendererMixins.java +++ b/src/main/java/com/radiance/mixins/vulkan_render_integration/WorldRendererMixins.java @@ -1,60 +1,46 @@ package com.radiance.mixins.vulkan_render_integration; -import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; -import com.radiance.client.UnsafeManager; import com.radiance.client.proxy.vulkan.BufferProxy; import com.radiance.client.proxy.world.ChunkProxy; import com.radiance.client.proxy.world.EntityProxy; import com.radiance.client.proxy.world.PlayerProxy; -import com.radiance.client.vertex.StorageVertexConsumerProvider; -import com.radiance.mixin_related.extensions.vulkan_render_integration.IGameRendererExt; import com.radiance.mixin_related.extensions.vulkan_render_integration.ILightMapManagerExt; import com.radiance.mixin_related.extensions.vulkan_render_integration.IOverlayTextureExt; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.SortedSet; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.CloudRenderMode; +import net.minecraft.client.gl.Framebuffer; +import net.minecraft.client.gl.PostEffectProcessor; +import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.BackgroundRenderer; +import net.minecraft.client.render.BlockBreakingInfo; import net.minecraft.client.render.BuiltChunkStorage; import net.minecraft.client.render.Camera; -import net.minecraft.client.render.ChunkRenderingDataPreparer; -import net.minecraft.client.render.CloudRenderer; import net.minecraft.client.render.DimensionEffects; -import net.minecraft.client.render.Fog; import net.minecraft.client.render.Frustum; import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderTickCounter; -import net.minecraft.client.render.SkyRendering; -import net.minecraft.client.render.WeatherRendering; -import net.minecraft.client.render.WorldBorderRendering; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.EndPortalBlockEntityRenderer; -import net.minecraft.client.render.chunk.ChunkBuilder; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.texture.TextureManager; -import net.minecraft.client.util.ObjectAllocator; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.BlockBreakingInfo; -import net.minecraft.util.Pair; +import net.minecraft.entity.LivingEntity; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.profiler.Profiler; import org.joml.Matrix4f; import org.joml.Vector3f; -import org.joml.Vector4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -62,24 +48,31 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(WorldRenderer.class) public abstract class WorldRendererMixins { @Shadow - private ClientWorld world; + @Final + private static net.minecraft.util.Identifier SUN; + @Shadow @Final + private static net.minecraft.util.Identifier MOON_PHASES; + @Shadow - private MinecraftClient client; + private ClientWorld world; + @Shadow @Final + private MinecraftClient client; + @Shadow + @Final private EntityRenderDispatcher entityRenderDispatcher; - @Final @Shadow + @Final private BlockEntityRenderDispatcher blockEntityRenderDispatcher; @Shadow @@ -88,211 +81,148 @@ public abstract class WorldRendererMixins { @Shadow private Frustum frustum; - @Final @Shadow - private List renderedEntities; + private Framebuffer entityOutlinesFramebuffer; @Shadow - private int renderedEntitiesCount; + private PostEffectProcessor entityOutlinePostProcessor; @Shadow - private double lastCameraPitch; + private PostEffectProcessor transparencyPostProcessor; @Shadow - private double lastCameraYaw; - @Final - @Shadow - private ObjectArrayList builtChunks; + private Set noCullingBlockEntities; @Shadow @Final private Long2ObjectMap> blockBreakingProgressions; @Shadow - @Final - private Set noCullingBlockEntities; + protected abstract void setupTerrain(Camera camera, Frustum frustum, boolean hasForcedFrustum, + boolean spectator); @Shadow - @Final - private WeatherRendering weatherRendering; + protected abstract boolean hasBlindnessOrDarkness(Camera camera); @Shadow - @Final - private WorldBorderRendering worldBorderRendering; + protected abstract boolean canDrawEntityOutlines(); @Shadow - private int ticks; - @Shadow - @Final - private CloudRenderer cloudRenderer; - // endregion - - // region - @Redirect(method = "", at = @At(value = "NEW", target = "net/minecraft/client/render/SkyRendering")) - private SkyRendering cancelNewSkyRendering() { - return UnsafeManager.INSTANCE.allocateInstance(SkyRendering.class); - } - // endregion - - @Redirect(method = "scheduleTerrainUpdate()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/ChunkRenderingDataPreparer;scheduleTerrainUpdate()V")) - public void cancelTerrainUpdateWithChunkRenderingDataPreparer( - ChunkRenderingDataPreparer instance) { - - } - - // region - @Redirect(method = "close()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/SkyRendering;close()V")) - public void cancelSkyRenderingClose(SkyRendering instance) { + public abstract boolean isRenderingReady(BlockPos pos); + @Redirect(method = "(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/render/entity/EntityRenderDispatcher;Lnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;Lnet/minecraft/client/render/BufferBuilderStorage;)V", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/render/WorldRenderer;renderStars()V")) + private void cancelRenderStars(WorldRenderer instance) { } - @Redirect(method = "reload(Lnet/minecraft/resource/ResourceManager;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;loadEntityOutlinePostProcessor()V")) - public void cancelReloadWithResourceManager(WorldRenderer instance) { - + @Redirect(method = "(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/render/entity/EntityRenderDispatcher;Lnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;Lnet/minecraft/client/render/BufferBuilderStorage;)V", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/render/WorldRenderer;renderLightSky()V")) + private void cancelRenderLightSky(WorldRenderer instance) { } - @Redirect(method = "reload()V", at = @At(value = "INVOKE", target = - "Lnet/minecraft/client/render/ChunkRenderingDataPreparer;setStorage" - + "(Lnet/minecraft/client/render/BuiltChunkStorage;)V")) - public void cancelReloadWithChunkRenderingDataPreparerSetStorage( - ChunkRenderingDataPreparer instance, BuiltChunkStorage storage) { - + @Redirect(method = "(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/render/entity/EntityRenderDispatcher;Lnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;Lnet/minecraft/client/render/BufferBuilderStorage;)V", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/render/WorldRenderer;renderDarkSky()V")) + private void cancelRenderDarkSky(WorldRenderer instance) { } - @Redirect(method = "getEntitiesToRender(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;Ljava/util/List;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;isThirdPerson()Z")) - public boolean enablePlayerRendererInFirstPlayer(Camera instance) { - return true; + @Inject(method = "loadEntityOutlinePostProcessor()V", at = @At("HEAD"), + cancellable = true) + private void disableEntityOutlinePostProcessor(CallbackInfo ci) { + this.entityOutlinesFramebuffer = null; + this.entityOutlinePostProcessor = null; + ci.cancel(); } - @Redirect(method = "getEntitiesToRender(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;Ljava/util/List;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/EntityRenderDispatcher;shouldRender(Lnet/minecraft/entity/Entity;Lnet/minecraft/client/render/Frustum;DDD)Z")) - public boolean loosenEntityFiltering(EntityRenderDispatcher instance, - E entity, Frustum frustum, double x, double y, double z) { - Vec3d vec3d = entity.getPos().subtract(new Vec3d(x, y, z)); - double distance = vec3d.length(); - if (distance < 16 * 3) { - return true; - } - return this.entityRenderDispatcher.shouldRender(entity, frustum, x, y, z); + @Inject(method = "reloadTransparencyPostProcessor()V", at = @At("HEAD"), + cancellable = true) + private void disableTransparencyPostProcessor(CallbackInfo ci) { + this.transparencyPostProcessor = null; + ci.cancel(); } - // region - @Shadow - protected abstract void setupTerrain(Camera camera, Frustum frustum, boolean hasForcedFrustum, - boolean spectator); - - @Shadow - protected abstract boolean getEntitiesToRender(Camera camera, Frustum frustum, - List output); - - @Shadow - protected abstract boolean canDrawEntityOutlines(); - - @Shadow - protected abstract void applyFrustum(Frustum frustum); - - @Shadow - protected abstract boolean isSkyDark(float tickDelta); - - @Shadow - protected abstract boolean hasBlindnessOrDarkness(Camera camera); - - @Inject(method = - "render(Lnet/minecraft/client/util/ObjectAllocator;Lnet/minecraft/client/render/RenderTickCounter;" - + "ZLnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/GameRenderer;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", at = @At("HEAD"), cancellable = true) - public void redirectRender(ObjectAllocator allocator, RenderTickCounter tickCounter, + @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;FJZLnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/GameRenderer;Lnet/minecraft/client/render/LightmapTextureManager;Lorg/joml/Matrix4f;)V", + at = @At("HEAD"), cancellable = true) + private void redirectRender(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - Matrix4f effectedRotationMatrix, Matrix4f projectionMatrix, CallbackInfo ci) { + LightmapTextureManager lightmapTextureManager, Matrix4f projectionMatrix, CallbackInfo ci) { PlayerProxy.setCameraPos(camera.getPos()); - float f = tickCounter.getTickDelta(false); - RenderSystem.setShaderGameTime(this.world.getTime(), f); + RenderSystem.setShaderGameTime(this.world.getTime(), tickDelta); this.blockEntityRenderDispatcher.configure(this.world, camera, this.client.crosshairTarget); this.entityRenderDispatcher.configure(this.world, camera, this.client.targetedEntity); this.world.runQueuedChunkUpdates(); this.world.getChunkManager().getLightingProvider().doLightUpdates(); - Frustum frustum = this.frustum; + Vec3d cameraPos = camera.getPos(); + double cameraX = cameraPos.getX(); + double cameraY = cameraPos.getY(); + double cameraZ = cameraPos.getZ(); - Vec3d vec3d = camera.getPos(); - double x = vec3d.getX(); - double y = vec3d.getY(); - double z = vec3d.getZ(); + boolean spectator = this.client.player != null && this.client.player.isSpectator(); + this.setupTerrain(camera, this.frustum, false, spectator); - this.setupTerrain(camera, frustum, false, false); + BackgroundRenderer.render(camera, tickDelta, this.world, + this.client.options.getClampedViewDistance(), gameRenderer.getSkyDarkness(tickDelta)); + BackgroundRenderer.setFogBlack(); - boolean renderEntityOutline = this.getEntitiesToRender(camera, frustum, - this.renderedEntities); - - Matrix4f viewMatrix = new Matrix4f( - ((IGameRendererExt) gameRenderer).radiance$getRotationMatrix()); - Matrix4f effectedViewMatrix = new Matrix4f(effectedRotationMatrix); - - // fog - float h = gameRenderer.getViewDistance(); - boolean bl2 = this.client.world.getDimensionEffects() - .useThickFog(MathHelper.floor(x), MathHelper.floor(y)) + float viewDistance = gameRenderer.getViewDistance(); + boolean thickFog = this.world.getDimensionEffects() + .useThickFog(MathHelper.floor(cameraX), MathHelper.floor(cameraY)) || this.client.inGameHud.getBossBarHud().shouldThickenFog(); - Vector4f vector4f = BackgroundRenderer.getFogColor(camera, f, this.client.world, - this.client.options.getClampedViewDistance(), gameRenderer.getSkyDarkness(f)); - Fog fog = BackgroundRenderer.applyFog(camera, BackgroundRenderer.FogType.FOG_TERRAIN, - vector4f, h, bl2, f); + BackgroundRenderer.applyFog(camera, BackgroundRenderer.FogType.FOG_TERRAIN, viewDistance, + thickFog, tickDelta); - TextureManager textureManager = MinecraftClient.getInstance().getTextureManager(); + TextureManager textureManager = this.client.getTextureManager(); OverlayTexture overlayTexture = gameRenderer.getOverlayTexture(); - int overlayTextureID = ((IOverlayTextureExt) overlayTexture).radiance$getTexture() + int overlayTextureID = ((IOverlayTextureExt) (Object) overlayTexture).radiance$getTexture() .getGlId(); int endSkyTextureID = textureManager.getTexture(EndPortalBlockEntityRenderer.SKY_TEXTURE) .getGlId(); int endPortalTextureID = textureManager.getTexture( EndPortalBlockEntityRenderer.PORTAL_TEXTURE).getGlId(); - BufferProxy.updateWorldUniform(camera, viewMatrix, effectedViewMatrix, projectionMatrix, - overlayTextureID, fog, world, endSkyTextureID, endPortalTextureID); - // Sky - float tickDelta = tickCounter.getTickDelta(false); - float skyAngle = this.world.getSkyAngle(tickDelta); + Matrix4f viewMatrix = new Matrix4f(matrices.peek().getPositionMatrix()); + BufferProxy.updateWorldUniform(camera, viewMatrix, new Matrix4f(viewMatrix), + projectionMatrix, overlayTextureID, RenderSystem.getShaderFogStart(), + RenderSystem.getShaderFogEnd(), RenderSystem.getShaderFogColor(), + RenderSystem.getShaderFogShape(), this.world, endSkyTextureID, endPortalTextureID); - int baseColor = this.world.getSkyColor(this.client.gameRenderer.getCamera().getPos(), - tickDelta); - float baseColorR = ColorHelper.getRedFloat(baseColor); - float baseColorG = ColorHelper.getGreenFloat(baseColor); - float baseColorB = ColorHelper.getBlueFloat(baseColor); + float skyAngle = this.world.getSkyAngle(tickDelta); + Vec3d skyColor = this.world.getSkyColor(cameraPos, tickDelta); + float baseColorR = (float) skyColor.x; + float baseColorG = (float) skyColor.y; + float baseColorB = (float) skyColor.z; DimensionEffects dimensionEffects = this.world.getDimensionEffects(); - int horizontalColor = dimensionEffects.getSkyColor(skyAngle); - float horizontalColorR = ColorHelper.getRedFloat(horizontalColor); - float horizontalColorG = ColorHelper.getGreenFloat(horizontalColor); - float horizontalColorB = ColorHelper.getBlueFloat(horizontalColor); - float horizontalColorA = ColorHelper.getAlphaFloat(horizontalColor); - - MatrixStack matrixStack = new MatrixStack(); - matrixStack.push(); - matrixStack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-90.0F)); - matrixStack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(skyAngle * 360.0F)); - Matrix4f rotationMatrix = matrixStack.peek().getPositionMatrix(); - Vector3f sunDirection = rotationMatrix.transformPosition(0, 1, 0, new Vector3f()) - .normalize(); - matrixStack.pop(); + float[] fogColorOverride = dimensionEffects.getFogColorOverride(skyAngle, tickDelta); + float horizontalColorR = fogColorOverride == null ? 0.0F : fogColorOverride[0]; + float horizontalColorG = fogColorOverride == null ? 0.0F : fogColorOverride[1]; + float horizontalColorB = fogColorOverride == null ? 0.0F : fogColorOverride[2]; + float horizontalColorA = fogColorOverride == null ? 0.0F : 1.0F; + + MatrixStack skyMatrices = new MatrixStack(); + skyMatrices.push(); + skyMatrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-90.0F)); + skyMatrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(skyAngle * 360.0F)); + Matrix4f skyRotationMatrix = skyMatrices.peek().getPositionMatrix(); + Vector3f sunDirection = skyRotationMatrix.transformPosition(0.0F, 1.0F, 0.0F, + new Vector3f()).normalize(); + skyMatrices.pop(); int skyType = dimensionEffects.getSkyType().ordinal(); - - boolean sunRisingOrSetting = dimensionEffects.isSunRisingOrSetting(skyAngle); - - boolean skyDark = this.isSkyDark(tickDelta); - + boolean sunRisingOrSetting = fogColorOverride != null; + boolean skyDark = dimensionEffects.isDarkened(); boolean hasBlindnessOrDarkness = this.hasBlindnessOrDarkness(camera); - int submersionType = camera.getSubmersionType().ordinal(); - int moonPhase = this.world.getMoonPhase(); - float rainGradient = this.world.getRainGradient(tickDelta); - - int sunTextureID = textureManager.getTexture(SkyRendering.SUN_TEXTURE).getGlId(); - - int moonTextureID = textureManager.getTexture(SkyRendering.MOON_PHASES_TEXTURE).getGlId(); + int sunTextureID = textureManager.getTexture(SUN).getGlId(); + int moonTextureID = textureManager.getTexture(MOON_PHASES).getGlId(); BufferProxy.updateSkyUniform(baseColorR, baseColorG, baseColorB, horizontalColorR, horizontalColorG, horizontalColorB, horizontalColorA, sunDirection, skyType, @@ -301,7 +231,7 @@ public void redirectRender(ObjectAllocator allocator, RenderTickCounter tickCoun BufferProxy.updateMapping(); - ILightMapManagerExt lightMapManagerExt = (ILightMapManagerExt) (gameRenderer.getLightmapTextureManager()); + ILightMapManagerExt lightMapManagerExt = (ILightMapManagerExt) lightmapTextureManager; BufferProxy.updateLightMapUniform(lightMapManagerExt.radiance$getAmbientLightFactor(), lightMapManagerExt.radiance$getSkyFactor(), lightMapManagerExt.radiance$getBlockFactor(), @@ -312,117 +242,45 @@ public void redirectRender(ObjectAllocator allocator, RenderTickCounter tickCoun lightMapManagerExt.radiance$getDarkenWorldFactor(), lightMapManagerExt.radiance$getBrightnessFactor()); - // Entities - EntityProxy.queueEntitiesBuild(camera, renderedEntities, this.entityRenderDispatcher, - tickCounter, canDrawEntityOutlines()); - - Pair, EntityProxy.EntityRenderDataList> crumblingRenderData = EntityProxy.queueBlockEntitiesRebuild( - chunks, this.noCullingBlockEntities, blockBreakingProgressions, - blockEntityRenderDispatcher, tickDelta); - EntityProxy.queueCrumblingRebuild(camera, blockBreakingProgressions, - this.client.getBlockRenderManager(), this.world, crumblingRenderData.getLeft(), - crumblingRenderData.getRight()); - - EntityProxy.queueParticleRebuild(camera, tickDelta, frustum); - - if (renderBlockOutline) { - EntityProxy.queueTargetBlockOutlineRebuild(camera, world); + List renderedEntities = new ArrayList<>(); + Entity focusedEntity = camera.getFocusedEntity(); + for (Entity entity : this.world.getEntities()) { + BlockPos blockPos = entity.getBlockPos(); + boolean shouldRender = this.entityRenderDispatcher.shouldRender(entity, this.frustum, + cameraX, cameraY, cameraZ); + if (this.client.player != null && entity.hasPassengerDeep(this.client.player)) { + shouldRender = true; + } + if (entity == focusedEntity) { + shouldRender = true; + } + if (!shouldRender) { + continue; + } + if (!this.world.isOutOfHeightLimit(blockPos.getY()) && !this.isRenderingReady(blockPos)) { + continue; + } + if (entity instanceof ClientPlayerEntity && focusedEntity != entity) { + continue; + } + if (entity == focusedEntity && !camera.isThirdPerson() + && (!(focusedEntity instanceof LivingEntity livingEntity) + || !livingEntity.isSleeping())) { + renderedEntities.add(entity); + continue; + } + renderedEntities.add(entity); } - EntityProxy.queueWeatherBuild(this.weatherRendering, this.worldBorderRendering, this.world, - camera, this.ticks, tickDelta); - - // clouds - CloudRenderMode cloudRenderMode = this.client.options.getCloudRenderModeValue(); - if (cloudRenderMode != CloudRenderMode.OFF) { - float k = this.world.getDimensionEffects().getCloudsHeight(); - if (!Float.isNaN(k)) { - float ticks = (float) this.ticks + f; - int color = this.world.getCloudsColor(f); - float cloudHeight = k + 0.33F; - this.cloudRenderer.renderClouds(color, cloudRenderMode, cloudHeight, null, null, - camera.getPos(), ticks); - } + EntityProxy.queueEntitiesBuild(camera, renderedEntities, this.entityRenderDispatcher, + tickDelta); + if (this.chunks != null) { + EntityProxy.queueBlockEntitiesBuild(this.chunks, this.noCullingBlockEntities, + this.blockBreakingProgressions, this.blockEntityRenderDispatcher, tickDelta); } - // Chunks ChunkProxy.rebuild(camera); - this.renderedEntities.clear(); - ci.cancel(); } - // endregion - - // region - @Redirect(method = "setWorld(Lnet/minecraft/client/world/ClientWorld;)V", at = @At(value = "INVOKE", target = - "Lnet/minecraft/client/render/ChunkRenderingDataPreparer;setStorage" - + "(Lnet/minecraft/client/render/BuiltChunkStorage;)V")) - public void cancelSetWorldChunkRenderingDataPreparerSetStorage( - ChunkRenderingDataPreparer instance, BuiltChunkStorage storage) { - - } - // endregion - - //region - @Inject(method = "setupTerrain(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;ZZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/chunk/ChunkBuilder;setCameraPosition(Lnet/minecraft/util/math/Vec3d;)V", shift = At.Shift.AFTER), cancellable = true) - public void cancelCullAndUpdateWithChunkRenderingDataPreparer(Camera camera, Frustum frustum, - boolean hasForcedFrustum, boolean spectator, CallbackInfo ci, @Local Profiler profiler) { -// PlayerProxy.setCameraPos(camera.getPos()); - profiler.pop(); - ci.cancel(); - } - //endregion - - // region - @Redirect(method = "addBuiltChunk(Lnet/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk;)V", at = @At(value = "INVOKE", target = - "Lnet/minecraft/client/render/ChunkRenderingDataPreparer;schedulePropagationFrom" - + "(Lnet/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk;)V")) - public void cancelPropagateWithChunkRenderingDataPreparer(ChunkRenderingDataPreparer instance, - ChunkBuilder.BuiltChunk builtChunk) { - - } - // endregion - - // region - @Redirect(method = "onChunkUnload(J)V", at = @At(value = "INVOKE", target = - "Lnet/minecraft/client/render/ChunkRenderingDataPreparer;schedulePropagationFrom" - + "(Lnet/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk;)V")) - public void cancelPropagateUnloadWithChunkRenderingDataPreparer( - ChunkRenderingDataPreparer instance, ChunkBuilder.BuiltChunk builtChunk) { - - } - // endregion - - // region - @Redirect(method = "scheduleNeighborUpdates(Lnet/minecraft/util/math/ChunkPos;)V", at = @At(value = "INVOKE", target = - "Lnet/minecraft/client/render/ChunkRenderingDataPreparer;addNeighbors(Lnet/minecraft/util/math/ChunkPos;)" - + "V")) - public void cancelNeighborUpdatesWithChunkRenderingDataPreparer( - ChunkRenderingDataPreparer instance, ChunkPos chunkPos) { - - } - // endregion - - // region - @Inject(method = "isRenderingReady(Lnet/minecraft/util/math/BlockPos;)Z", at = @At(value = "HEAD"), cancellable = true) - public void redirectIsRenderingReady(BlockPos pos, CallbackInfoReturnable cir) { - ChunkBuilder.BuiltChunk builtChunk = chunks.getRenderedChunk(pos); - - if (builtChunk == null) { - cir.setReturnValue(false); - } else if (builtChunk.data.get().isEmpty(null)) { - cir.setReturnValue(true); - } else if (builtChunk.data.get() == ChunkProxy.PROCESSED) { - cir.setReturnValue(ChunkProxy.isChunkReady(builtChunk)); - } - } - // endregion - - // region <> - @Inject(method = "getCompletedChunkCount()I", at = @At(value = "HEAD"), cancellable = true) - public void fixGetCompletedChunkCount(CallbackInfoReturnable cir) { - cir.setReturnValue(ChunkProxy.builtChunkNum - 54); // 54 + 10 = 64 - } - // endregion } diff --git a/src/main/resources/radiance.accesswidener b/src/main/resources/radiance.accesswidener index 4280594..65dc529 100644 --- a/src/main/resources/radiance.accesswidener +++ b/src/main/resources/radiance.accesswidener @@ -1,20 +1,4 @@ accessWidener v2 named -accessible class net/minecraft/client/font/BitmapFont$BitmapFontGlyph - -accessible class net/minecraft/client/font/TrueTypeFont$TtfGlyph -accessible method net/minecraft/client/font/TrueTypeFont getInfo ()Lorg/lwjgl/util/freetype/FT_Face; -accessible field net/minecraft/client/font/TrueTypeFont oversample F - -accessible method net/minecraft/client/font/UnihexFont addGlyphPixels (Ljava/nio/IntBuffer;Lnet/minecraft/client/font/UnihexFont$BitmapGlyph;II)V -accessible class net/minecraft/client/font/UnihexFont$UnicodeTextureGlyph -accessible field net/minecraft/client/font/UnihexFont$UnicodeTextureGlyph contents Lnet/minecraft/client/font/UnihexFont$BitmapGlyph; -accessible field net/minecraft/client/font/UnihexFont$UnicodeTextureGlyph left I -accessible field net/minecraft/client/font/UnihexFont$UnicodeTextureGlyph right I - -accessible class net/minecraft/client/font/GlyphAtlasTexture$Slot -accessible method net/minecraft/client/font/GlyphAtlasTexture$Slot findSlotFor (Lnet/minecraft/client/font/RenderableGlyph;)Lnet/minecraft/client/font/GlyphAtlasTexture$Slot; -accessible field net/minecraft/client/font/GlyphAtlasTexture$Slot x I -accessible field net/minecraft/client/font/GlyphAtlasTexture$Slot y I accessible class net/minecraft/client/texture/SpriteContents$Animation accessible field net/minecraft/client/texture/SpriteContents width I @@ -61,15 +45,7 @@ accessible method net/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk setN accessible method net/minecraft/client/render/item/HeldItemRenderer getHandRenderType (Lnet/minecraft/client/network/ClientPlayerEntity;)Lnet/minecraft/client/render/item/HeldItemRenderer$HandRenderType; accessible field net/minecraft/client/render/item/HeldItemRenderer$HandRenderType renderMainHand Z accessible field net/minecraft/client/render/item/HeldItemRenderer$HandRenderType renderOffHand Z -accessible field net/minecraft/client/render/SkyRendering SUN_TEXTURE Lnet/minecraft/util/Identifier; -accessible field net/minecraft/client/render/SkyRendering MOON_PHASES_TEXTURE Lnet/minecraft/util/Identifier; -accessible class net/minecraft/client/gui/widget/OptionListWidget$WidgetEntry -accessible method net/minecraft/client/gui/widget/OptionListWidget$WidgetEntry (Ljava/util/List;Lnet/minecraft/client/gui/screen/Screen;)V -accessible method net/minecraft/client/gui/widget/EntryListWidget addEntry (Lnet/minecraft/client/gui/widget/EntryListWidget$Entry;)I - -accessible class net/minecraft/client/render/CloudRenderer$ViewMode accessible class net/minecraft/client/option/SimpleOption$CyclingCallbacks accessible field net/minecraft/client/option/SimpleOption textGetter Ljava/util/function/Function; accessible field net/minecraft/client/option/SimpleOption text Lnet/minecraft/text/Text; -accessible field net/minecraft/client/gui/screen/Screen drawables Ljava/util/List; \ No newline at end of file diff --git a/src/main/resources/radiance.mixins.json b/src/main/resources/radiance.mixins.json index 2df7bd7..8fee616 100644 --- a/src/main/resources/radiance.mixins.json +++ b/src/main/resources/radiance.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.radiance.mixins", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_17", "plugin": "com.radiance.mixin_related.MixinPlugin", "mixins": [ "vanilla_resource_tracker.NamespaceResourceManagerMixins", @@ -11,10 +11,6 @@ ], "client": [ "vanilla_resource_tracker.AbstractTextureMixins", - "vanilla_resource_tracker.BitmapFontGlyphMixins", - "vanilla_resource_tracker.BuiltinEmptyGlyphMixins", - "vanilla_resource_tracker.FontStorageMixins", - "vanilla_resource_tracker.GlyphAtlasTextureMixins", "vanilla_resource_tracker.NativeImageBackedTextureMixins", "vanilla_resource_tracker.NativeImageMixins", "vanilla_resource_tracker.OverlayTextureMixins", @@ -23,33 +19,24 @@ "vanilla_resource_tracker.SpriteContentsMixins", "vanilla_resource_tracker.SpriteMixins", "vanilla_resource_tracker.TextureUtilMixins", - "vanilla_resource_tracker.TtfGlyphMixins", - "vanilla_resource_tracker.UnicodeTextureGlyphMixins", - "vulkan_options.GameOptionsScreenMixins", "vulkan_options.VideoOptionsScreenMixins", "vulkan_render_integration.AbstractTextureMixins", - "vulkan_render_integration.BannerBlockEntityRendererMixins", - "vulkan_render_integration.BillboardParticleMixins", "vulkan_render_integration.BlockColorsMixins", - "vulkan_render_integration.BlockModelRendererMixins", + "vulkan_render_integration.BufferBuilderMixins", "vulkan_render_integration.BufferRendererMixins", - "vulkan_render_integration.BuiltBufferMixins", "vulkan_render_integration.BuiltChunkStorageMixins", - "vulkan_render_integration.ChunkBuilderBuiltChunkMixins", "vulkan_render_integration.ChunkBuilderMixins", + "vulkan_render_integration.ChunkBuilderBuiltChunkMixins", "vulkan_render_integration.ClientChunkManagerMixins", - "vulkan_render_integration.CloudRendererMixins", "vulkan_render_integration.DirectoryAtlasSourceMixins", "vulkan_render_integration.DrawContextMixins", "vulkan_render_integration.EntityRenderDispatcherMixins", - "vulkan_render_integration.FluidRendererMixins", "vulkan_render_integration.GameRendererMixins", - "vulkan_render_integration.GlStateManagerMixins", "vulkan_render_integration.GLXMixins", + "vulkan_render_integration.GlStateManagerMixins", "vulkan_render_integration.HeldItemRendererMixins", - "vulkan_render_integration.ItemRendererMixins", - "vulkan_render_integration.LightmapTextureManagerMixins", "vulkan_render_integration.LightningEntityRendererMixins", + "vulkan_render_integration.LightmapTextureManagerMixins", "vulkan_render_integration.MinecraftClientMixins", "vulkan_render_integration.MipmapHelperMixins", "vulkan_render_integration.NativeImageMixins", @@ -57,14 +44,11 @@ "vulkan_render_integration.PalettedPermutationsAtlasSourceMixins", "vulkan_render_integration.ParticleManagerMixins", "vulkan_render_integration.ParticleMixins", - "vulkan_render_integration.RenderLayerMixins", "vulkan_render_integration.RenderPhaseLightmapMixins", "vulkan_render_integration.RenderPhaseMixins", "vulkan_render_integration.RenderPhaseTargetMixins", "vulkan_render_integration.RenderSystemMixins", - "vulkan_render_integration.ScreenMixins", "vulkan_render_integration.ScreenshotRecorderMixins", - "vulkan_render_integration.SectionBuilderMixins", "vulkan_render_integration.SingleAtlasSourceMixins", "vulkan_render_integration.TextureUtilMixins", "vulkan_render_integration.UnstitchAtlasSourceMixins",