diff --git a/src/generated/resources/assets/gtceu/blockstates/connected_texture_test.json b/src/generated/resources/assets/gtceu/blockstates/connected_texture_test.json new file mode 100644 index 00000000000..0455936cf6c --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/connected_texture_test.json @@ -0,0 +1,150 @@ +{ + "variants": { + "facing=down,upwards_facing=down": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "gtceu:block/machine/connected_texture_test", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "gtceu:block/machine/connected_texture_test", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "gtceu:block/machine/connected_texture_test", + "x": 90 + }, + "facing=down,upwards_facing=up": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "gtceu:block/machine/connected_texture_test", + "x": 90 + }, + "facing=east,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/connected_texture_test", + "y": 90 + }, + "facing=east,upwards_facing=east": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=east,upwards_facing=north": { + "gtceu:z": 270, + "model": "gtceu:block/machine/connected_texture_test", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 90, + "model": "gtceu:block/machine/connected_texture_test", + "y": 90 + }, + "facing=east,upwards_facing=up": { + "model": "gtceu:block/machine/connected_texture_test", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=north,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 90, + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=north,upwards_facing=north": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=north,upwards_facing=south": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=north,upwards_facing=up": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 270, + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=south,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/connected_texture_test", + "y": 180 + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "gtceu:block/machine/connected_texture_test", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=south,upwards_facing=south": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=south,upwards_facing=up": { + "model": "gtceu:block/machine/connected_texture_test", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "gtceu:block/machine/connected_texture_test", + "y": 180 + }, + "facing=up,upwards_facing=down": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "gtceu:block/machine/connected_texture_test", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "gtceu:block/machine/connected_texture_test", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "gtceu:block/machine/connected_texture_test", + "x": 270 + }, + "facing=up,upwards_facing=up": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "gtceu:block/machine/connected_texture_test", + "x": 270 + }, + "facing=west,upwards_facing=down": { + "gtceu:z": 180, + "model": "gtceu:block/machine/connected_texture_test", + "y": 270 + }, + "facing=west,upwards_facing=east": { + "model": "gtceu:block/machine/connected_texture_test" + }, + "facing=west,upwards_facing=north": { + "gtceu:z": 90, + "model": "gtceu:block/machine/connected_texture_test", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 270, + "model": "gtceu:block/machine/connected_texture_test", + "y": 270 + }, + "facing=west,upwards_facing=up": { + "model": "gtceu:block/machine/connected_texture_test", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "model": "gtceu:block/machine/connected_texture_test" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 95ba0e036c6..6d05241f823 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -188,6 +188,7 @@ "block.gtceu.computer_casing": "buısɐƆ ɹǝʇndɯoƆ", "block.gtceu.computer_heat_vent": "ʇuǝΛ ʇɐǝH ɹǝʇndɯoƆ", "block.gtceu.configurable_maintenance_hatch": "ɥɔʇɐH ǝɔuɐuǝʇuıɐW ǝןqɐɹnbıɟuoƆ", + "block.gtceu.connected_texture_test": "ʇsǝ⟘ ǝɹnʇxǝ⟘ pǝʇɔǝuuoƆ", "block.gtceu.corrosion_proof_casing": "buısɐƆ ɟooɹԀ uoısoɹɹoƆ", "block.gtceu.cracked_dark_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʞɹɐᗡ pǝʞɔɐɹƆ", "block.gtceu.cracked_light_concrete_bricks": "sʞɔıɹᗺ ǝʇǝɹɔuoƆ ʇɥbıꞀ pǝʞɔɐɹƆ", @@ -344,7 +345,6 @@ "block.gtceu.gregification_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH uoıʇɐɔıɟıbǝɹ⅁", "block.gtceu.heat_vent": "ʇuǝΛ ʇɐǝH", "block.gtceu.heatproof_machine_casing": "buısɐƆ ǝuıɥɔɐW ɹɐʌuI ɟooɹԀ ʇɐǝH", - "block.gtceu.heavy_oil": "ןıO ʎʌɐǝH", "block.gtceu.high_performance_computation_array": ")ⱯƆԀH( ʎɐɹɹⱯ uoıʇɐʇndɯoƆ ǝɔuɐɯɹoɟɹǝԀ ɥbıH", "block.gtceu.high_power_casing": "buısɐƆ ɹǝʍoԀ ɥbıH", "block.gtceu.high_pressure_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝɹnssǝɹԀ ɥbıH", @@ -588,7 +588,6 @@ "block.gtceu.light_gray_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ʎɐɹ⅁ ʇɥbıꞀ", "block.gtceu.light_gray_metal_sheet": "ʇǝǝɥS ןɐʇǝW ʎɐɹ⅁ ʇɥbıꞀ", "block.gtceu.light_gray_studs": "spnʇS ʎɐɹ⅁ ʇɥbıꞀ", - "block.gtceu.light_oil": "ןıO ʇɥbıꞀ", "block.gtceu.lime_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ ǝɯıꞀ", "block.gtceu.lime_lamp": "dɯɐꞀ ǝɯıꞀ", "block.gtceu.lime_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ ǝɯıꞀ", @@ -924,7 +923,6 @@ "block.gtceu.mv_wiremill": "ɹ§ ןןıɯǝɹıM pǝɔuɐʌpⱯq§", "block.gtceu.mv_world_accelerator": "ɹ§ ɹoʇɐɹǝןǝɔɔⱯ pןɹoM pǝɔuɐʌpⱯq§", "block.gtceu.naquadah_coil_block": "ʞɔoןᗺ ןıoƆ ɥɐpɐnbɐN", - "block.gtceu.natural_gas": "sɐ⅁ ןɐɹnʇɐN", "block.gtceu.network_switch": "ɥɔʇıʍS ʞɹoʍʇǝN", "block.gtceu.nichrome_coil_block": "ʞɔoןᗺ ןıoƆ ǝɯoɹɥɔıN", "block.gtceu.noise_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝsıoN", @@ -1061,7 +1059,6 @@ "block.gtceu.purple_studs": "spnʇS ǝןdɹnԀ", "block.gtceu.pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", "block.gtceu.radioactive_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ǝʌıʇɔɐoıpɐᴚ", - "block.gtceu.raw_oil": "ןıO ʍɐᴚ", "block.gtceu.reaction_safe_mixing_casing": "buısɐƆ buıxıW ǝɟɐS-uoıʇɔɐǝᴚ", "block.gtceu.red_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ pǝᴚ", "block.gtceu.red_granite": "ǝʇıuɐɹ⅁ pǝᴚ", @@ -1153,6 +1150,7 @@ "block.gtceu.substation_capacitor.tooltip_empty": "uoıʇɐʇsqnS ɹǝʍoԀ ɹnoʎ uı ǝɔɐds buıןןıɟ ɹoℲㄥ§", "block.gtceu.substation_capacitor.tooltip_filled": "∩Ǝ %dɟ§ :ʎʇıɔɐdɐƆ ʎbɹǝuƎɔ§", "block.gtceu.superconducting_coil": "ʞɔoןᗺ ןıoƆ buıʇɔnpuoɔɹǝdnS", + "block.gtceu.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", "block.gtceu.tempered_glass": "ssɐן⅁ pǝɹǝdɯǝ⟘", "block.gtceu.test_mui": "ınW ʇsǝ⟘", "block.gtceu.the_end_marker": "puƎ ǝɥ⟘", @@ -1743,7 +1741,6 @@ "block.gtceu.zpm_transformer_4a": "ɹǝɯɹoɟsuɐɹ⟘ )xㄣ( dɯⱯ-ıH ɹ§ǝbɐʇןoΛ WԀZɔ§", "block.gtceu.zpm_wiremill": "ɹ§III ןןıɯǝɹıM ǝʇıןƎɔ§", "block.gtceu.zpm_world_accelerator": "ɹ§III ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ǝʇıןƎɔ§", - "block.gtceu.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", "button.gtceu.mark_as_depleted.name": "pǝʇǝןdǝᗡ sɐ ʞɹɐW", "button.gtceu.toggle_waypoint.name": "ʇuıodʎɐM ǝןbbo⟘", "command.gtceu.cape.failure.does_not_exist": "ʇsıxǝ ʇou sǝop %s ǝdɐƆ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 44b7f4a6f0c..4538eaf09f8 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -188,6 +188,7 @@ "block.gtceu.computer_casing": "Computer Casing", "block.gtceu.computer_heat_vent": "Computer Heat Vent", "block.gtceu.configurable_maintenance_hatch": "Configurable Maintenance Hatch", + "block.gtceu.connected_texture_test": "Connected Texture Test", "block.gtceu.corrosion_proof_casing": "Corrosion Proof Casing", "block.gtceu.cracked_dark_concrete_bricks": "Cracked Dark Concrete Bricks", "block.gtceu.cracked_light_concrete_bricks": "Cracked Light Concrete Bricks", @@ -344,7 +345,6 @@ "block.gtceu.gregification_hazard_sign_block": "Gregification Hazard Sign Block", "block.gtceu.heat_vent": "Heat Vent", "block.gtceu.heatproof_machine_casing": "Heat Proof Invar Machine Casing", - "block.gtceu.heavy_oil": "Heavy Oil", "block.gtceu.high_performance_computation_array": "High Performance Computation Array (HPCA)", "block.gtceu.high_power_casing": "High Power Casing", "block.gtceu.high_pressure_hazard_sign_block": "High Pressure Hazard Sign Block", @@ -588,7 +588,6 @@ "block.gtceu.light_gray_large_metal_sheet": "Light Gray Large Metal Sheet", "block.gtceu.light_gray_metal_sheet": "Light Gray Metal Sheet", "block.gtceu.light_gray_studs": "Light Gray Studs", - "block.gtceu.light_oil": "Light Oil", "block.gtceu.lime_borderless_lamp": "Lime Borderless Lamp", "block.gtceu.lime_lamp": "Lime Lamp", "block.gtceu.lime_large_metal_sheet": "Lime Large Metal Sheet", @@ -924,7 +923,6 @@ "block.gtceu.mv_wiremill": "§bAdvanced Wiremill §r", "block.gtceu.mv_world_accelerator": "§bAdvanced World Accelerator §r", "block.gtceu.naquadah_coil_block": "Naquadah Coil Block", - "block.gtceu.natural_gas": "Natural Gas", "block.gtceu.network_switch": "Network Switch", "block.gtceu.nichrome_coil_block": "Nichrome Coil Block", "block.gtceu.noise_hazard_sign_block": "Noise Hazard Sign Block", @@ -1061,7 +1059,6 @@ "block.gtceu.purple_studs": "Purple Studs", "block.gtceu.pyrolyse_oven": "Pyrolyse Oven", "block.gtceu.radioactive_hazard_sign_block": "Radioactive Hazard Sign Block", - "block.gtceu.raw_oil": "Raw Oil", "block.gtceu.reaction_safe_mixing_casing": "Reaction-Safe Mixing Casing", "block.gtceu.red_borderless_lamp": "Red Borderless Lamp", "block.gtceu.red_granite": "Red Granite", @@ -1153,6 +1150,7 @@ "block.gtceu.substation_capacitor.tooltip_empty": "§7For filling space in your Power Substation", "block.gtceu.substation_capacitor.tooltip_filled": "§cEnergy Capacity: §f%d EU", "block.gtceu.superconducting_coil": "Superconducting Coil Block", + "block.gtceu.surface_rock": "%s Surface Rock", "block.gtceu.tempered_glass": "Tempered Glass", "block.gtceu.test_mui": "Test Mui", "block.gtceu.the_end_marker": "The End", @@ -1743,7 +1741,6 @@ "block.gtceu.zpm_transformer_4a": "§cZPM Voltage§r Hi-Amp (4x) Transformer", "block.gtceu.zpm_wiremill": "§cElite Wiremill III§r", "block.gtceu.zpm_world_accelerator": "§cElite World Accelerator III§r", - "block.gtceu.surface_rock": "%s Surface Rock", "button.gtceu.mark_as_depleted.name": "Mark as Depleted", "button.gtceu.toggle_waypoint.name": "Toggle Waypoint", "command.gtceu.cape.failure.does_not_exist": "Cape %s does not exist", diff --git a/src/generated/resources/assets/gtceu/models/block/machine/connected_texture_test.json b/src/generated/resources/assets/gtceu/models/block/machine/connected_texture_test.json new file mode 100644 index 00000000000..aeb987a3416 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/machine/connected_texture_test.json @@ -0,0 +1,50 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "gtceu:connected_texture_test", + "texture_overrides": { + "all": "gtceu:block/ctm_test" + }, + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/ctm_test", + "overlay_front": "gtceu:block/multiblock/electric_blast_furnace/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/electric_blast_furnace/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/ctm_test", + "overlay_front": "gtceu:block/multiblock/electric_blast_furnace/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/electric_blast_furnace/overlay_front_paused_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/ctm_test", + "overlay_front": "gtceu:block/multiblock/electric_blast_furnace/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/electric_blast_furnace/overlay_front_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/ctm_test", + "overlay_front": "gtceu:block/multiblock/electric_blast_furnace/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/electric_blast_furnace/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/connected_texture_test.json b/src/generated/resources/assets/gtceu/models/item/connected_texture_test.json new file mode 100644 index 00000000000..5a38a55ee9a --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/connected_texture_test.json @@ -0,0 +1,3 @@ +{ + "parent": "gtceu:block/machine/connected_texture_test" +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java index 347670df3c4..bb2f3db6b5f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/fluids/FluidBuilder.java @@ -299,6 +299,7 @@ public Supplier build(Material material, FluidStorageKey key, G return IClientFluidTypeExtensions.of(state.getFluidState()) .getTintColor(state.getFluidState(), level, pos); }) + .setData(ProviderType.LANG, NonNullBiConsumer.noop()) .register(); } else { // noinspection DataFlowIssue diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java index 5ed0639fe78..89291c16550 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/Predicates.java @@ -38,6 +38,7 @@ import java.util.*; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Stream; public class Predicates { @@ -76,6 +77,12 @@ public static PatternPredicate blocks(Block... blocks) { return new PatternPredicate(new PredicateBlocks(blocks)); } + @SafeVarargs + @HideFromJS + public static PatternPredicate blocks(Supplier... blocks) { + return blocks(Arrays.stream(blocks).map(Supplier::get).toArray(Block[]::new)); + } + /* * public static PatternPredicate blocks(IMachineBlock... blocks) { * return new PatternPredicate( diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java index 75bdeabc87e..f2b6c84e27c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -77,7 +77,7 @@ public static void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) block = GTRenderTypes.bloom(); entity = GTRenderTypes.entityBloomBlockSheet(); } else { - // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' + // if safe mode is enabled, register the named render type as a copy of neoforge's 'cutout' block = RenderType.cutoutMipped(); entity = NeoForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java index 1e681964976..f9073c6257f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java @@ -7,9 +7,7 @@ import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; import com.gregtechceu.gtceu.core.mixins.client.bloom.BufferBuilderAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.LevelRendererAccessor; -import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; import com.gregtechceu.gtceu.utils.ScopedValue; -import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -38,7 +36,6 @@ import org.joml.Matrix4f; import org.joml.Vector3f; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; @@ -60,20 +57,17 @@ public class BloomRenderer { @Accessors(fluent = true) @Getter @ApiStatus.Internal - static final ThreadLocal>> bloomChunkContext = ThreadLocal - .withInitial(ScopedValue.Object::new); + private static final ScopedValue.Object> bloomChunkContext = new ScopedValue.Object<>(); - @ApiStatus.Internal - static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f frustumMatrix, - Matrix4f projectionMatrix, - float partialTicks, LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { + static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, + Matrix4f frustumMatrix, Matrix4f projectionMatrix, float partialTicks, + LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { if (!BloomShaderManager.isBloomActive()) return; Vec3 camPos = camera.getPosition(); profilerFiller.popPush("gtceu:bloom"); setupBloomShaderUniforms(); - GTRenderTypes.bloom().setupRenderState(); renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); @@ -100,8 +94,8 @@ static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Mat // profiler section is popped by popPush() in the calling function; don't pop it here } - static void renderSpecialBloom(Camera camera, PoseStack poseStack, Frustum frustum, float partialTicks, - ProfilerFiller profilerFiller) { + private static void renderSpecialBloom(Camera camera, PoseStack poseStack, Frustum frustum, float partialTicks, + ProfilerFiller profilerFiller) { profilerFiller.push("special"); // render state is set up & cleared in calling function @@ -135,7 +129,7 @@ static void renderSpecialBloom(Camera camera, PoseStack poseStack, Frustum frust profilerFiller.pop(); } - static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) { + private static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) { Minecraft minecraft = Minecraft.getInstance(); RenderTarget mainTarget = minecraft.getMainRenderTarget(); @@ -146,9 +140,12 @@ static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) mainTarget.bindWrite(false); RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, + GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ZERO, + GlStateManager.DestFactor.ONE); - BLOOM_TARGET.blitToScreen(mainTarget.viewWidth, mainTarget.viewHeight, false); + BLOOM_TARGET.blitToScreen(mainTarget.width, mainTarget.height, false); BLOOM_TARGET.unbindRead(); RenderSystem.disableBlend(); @@ -157,49 +154,30 @@ static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) profilerFiller.pop(); } - @ApiStatus.Internal - static void setupBloomShaderUniforms() { + private static void setupBloomShaderUniforms() { final var config = ConfigHolder.INSTANCE.client.bloom; // Forcefully insert config values to shader - modifyBloomPostShaders((index, shader) -> { - shader.safeGetUniform("DepthNear").set(GameRenderer.PROJECTION_Z_NEAR); - shader.safeGetUniform("DepthFar").set(Minecraft.getInstance().gameRenderer.getDepthFar()); - - // look for blur steps & change their blur strength to match the config - if (shader.getName().contains("blur")) { - if (index % 2 == 0) { - shader.safeGetUniform("BlurDir").set(0.0f, config.step); - } else { - shader.safeGetUniform("BlurDir").set(config.step, 0.0f); - } - } + BloomShaderManager.BLOOM_CHAIN.setUniform("DepthNear", GameRenderer.PROJECTION_Z_NEAR); + BloomShaderManager.BLOOM_CHAIN.setUniform("DepthFar", Minecraft.getInstance().gameRenderer.getDepthFar()); - shader.safeGetUniform("BloomStrength").set(config.strength); - shader.safeGetUniform("BaseBrightness").set(config.baseBrightness); - shader.safeGetUniform("MinBrightness").set(config.minBrightness); - shader.safeGetUniform("MaxBrightness").set(config.maxBrightness); - }); - } + BloomShaderManager.BLOOM_CHAIN.setUniform("SampleStep", config.blurSampleStep); - static void modifyBloomPostShaders(IntObjectConsumer consumer) { - // Forcefully insert config values to shader - List passes = ((PostChainAccessor) BloomShaderManager.BLOOM_CHAIN).getPasses(); - for (int i = 0; i < passes.size(); i++) { - PostPass pass = passes.get(i); - consumer.accept(i, pass.getEffect()); - } + BloomShaderManager.BLOOM_CHAIN.setUniform("BloomStrength", config.strength); + BloomShaderManager.BLOOM_CHAIN.setUniform("BaseBrightness", config.baseBrightness); + BloomShaderManager.BLOOM_CHAIN.setUniform("MinBrightness", config.minBrightness); + BloomShaderManager.BLOOM_CHAIN.setUniform("MaxBrightness", config.maxBrightness); } /// Helper function for copying bloom-enabled quads drawn with non-bloom render types public static void copyBloomQuad(BakedQuad quad, int[] packedLights, @Nullable RenderType renderType, Consumer drawConsumer) { - if (renderType == GTRenderTypes.bloom() || renderType == GTRenderTypes.entityBloomBlockSheet()) { + if (renderType == GTRenderTypes.bloom()) { return; } if (TextureMetadataHelper.hasBloom(quad, packedLights)) { - Supplier currentVertexConsumer = bloomChunkContext().get().getValue(); + Supplier currentVertexConsumer = bloomChunkContext().getValue(); if (currentVertexConsumer == null) return; drawConsumer.accept(currentVertexConsumer.get()); @@ -296,11 +274,11 @@ private static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum f poseStack, frustumMatrix, projectionMatrix, levelRenderer.getTicks(), camera, frustum); } - public static void finishBloomBuffer(SectionPos sectionPos, MeshData mesh, BufferBuilder builder, - VertexSorting vertexSorting) { + private static void finishBloomBuffer(SectionPos sectionPos, MeshData mesh, BufferBuilder builder, + VertexSorting vertexSorting) { BLOOM_RENDER_LOCK.writeLock().lock(); try { - BLOOM_BUFFER_BUILDERS.remove(sectionPos, builder); + BLOOM_BUFFER_BUILDERS.remove(sectionPos); ByteBufferBuilder byteBuffer = BLOOM_BYTE_BUFFERS.remove(sectionPos); if (byteBuffer != null) { @@ -324,7 +302,7 @@ public static void finishBloomBuffer(SectionPos sectionPos, MeshData mesh, Buffe } } - public static void uploadBloomBuffer(MeshData mesh, VertexBuffer buffer) { + private static void uploadBloomBuffer(MeshData mesh, VertexBuffer buffer) { if (!buffer.isInvalid()) { buffer.bind(); buffer.upload(mesh); @@ -333,12 +311,17 @@ public static void uploadBloomBuffer(MeshData mesh, VertexBuffer buffer) { } public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { - return BLOOM_BUFFER_BUILDERS.computeIfAbsent(sectionPos, $ -> { - ByteBufferBuilder byteBuffer = BLOOM_BYTE_BUFFERS.computeIfAbsent(sectionPos, - unused -> new ByteBufferBuilder(GTRenderTypes.bloom().bufferSize())); + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + return BLOOM_BUFFER_BUILDERS.computeIfAbsent(sectionPos, $ -> { + ByteBufferBuilder byteBuffer = BLOOM_BYTE_BUFFERS.computeIfAbsent(sectionPos, + unused -> new ByteBufferBuilder(GTRenderTypes.bloom().bufferSize())); - return new BufferBuilder(byteBuffer, GTRenderTypes.bloom().mode(), GTRenderTypes.bloom().format()); - }); + return new BufferBuilder(byteBuffer, GTRenderTypes.bloom().mode(), GTRenderTypes.bloom().format()); + }); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } } public static void bakeBloomChunkBuffers(SectionPos sectionPos, VertexSorting vertexSorting) { @@ -377,7 +360,7 @@ static void invalidateLevelData() { } } - public static void invalidateSectionData(SectionPos sectionPos) { + static void invalidateSectionData(SectionPos sectionPos) { BLOOM_RENDER_LOCK.writeLock().lock(); try { diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java index 325bd307ff7..018bb562082 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java @@ -12,7 +12,6 @@ import net.minecraft.world.level.block.state.BlockState; import org.joml.Vector2f; -import org.joml.Vector3f; import java.util.LinkedList; import java.util.List; @@ -36,7 +35,10 @@ public static List buildCTMQuads(TextureConnections connections, List MeshBuilder meshBuilder = MeshBuilder.getInstance(); var emitter = meshBuilder.getEmitter(); - for (BakedQuad originalQuad : base) { + // this is critical code; a C-style for loop has better performance + // noinspection ForLoopReplaceableByForEach + for (int i = 0; i < base.size(); i++) { + BakedQuad originalQuad = base.get(i); TextureAtlasSprite originalSprite = originalQuad.getSprite(); TextureAtlasSprite connectionSprite = CTM_SPRITE_CACHE.get(originalSprite.contents().name()); @@ -51,14 +53,13 @@ public static List buildCTMQuads(TextureConnections connections, List TextureAtlasSprite ctmSprite = defaultTexture ? originalSprite : connectionSprite; emitter.fromVanilla(originalQuad, cullFace); - emitter.spriteUnbake(originalSprite, BAKE_NORMALIZED | BAKE_DEROTATE_UV); - canonicalizeWinding(emitter); + emitter.spriteUnbake(originalSprite, UNBAKE_DEROTATE_UV | UNBAKE_CANONICALIZE_WINDING); // slice quad into the current quadrant subsect(emitter, Submap.X2[xQuadrant][yQuadrant]); remapUVs(emitter, connections.getSubmapFor(xQuadrant, yQuadrant)); - emitter.spriteBake(ctmSprite, BAKE_NORMALIZED); + emitter.spriteBake(ctmSprite, 0); emitter.computeGeometry(); emitter.populateMissingNormals(); @@ -80,7 +81,6 @@ public static List buildCTMQuads(TextureConnections connections, List return new Vector2f[] { new Vector2f(), new Vector2f() }; }); // set in copyPos() calls - private static final ThreadLocal position = ThreadLocal.withInitial(Vector3f::new); private static final ThreadLocal xy = ThreadLocal.withInitial(() -> { return new Vector2f[] { new Vector2f(), new Vector2f(), new Vector2f(), new Vector2f() }; }); @@ -125,49 +125,6 @@ private static void remapUVs(MutableQuadView quad, ISubmap submap) { quad.uv(3, uvs[3].x <= minUV.x ? minU : maxU, uvs[3].y <= minUV.y ? minV : maxV); } - private static void canonicalizeWinding(MutableQuadView emitter) { - Direction face = emitter.nominalFace(); - if (face == null) return; - - int target = anchorIndex(emitter, face); - if (target <= 0) return; - - Vector3f[] pos = new Vector3f[4]; - int[] color = new int[4]; - int[] light = new int[4]; - for (int i = 0; i < 4; i++) { - pos[i] = emitter.copyPos(i, new Vector3f()); - color[i] = emitter.color(i); - light[i] = emitter.lightmap(i); - } - for (int i = 0; i < 4; i++) { - int s = (i + target) & 3; - emitter.pos(i, pos[s].x, pos[s].y, pos[s].z); - emitter.color(i, color[s]); - emitter.lightmap(i, light[s]); - } - } - - private static int anchorIndex(MutableQuadView emitter, Direction face) { - for (int i = 0; i < 4; i++) { - float x = emitter.x(i), y = emitter.y(i), z = emitter.z(i); - boolean hit = switch (face) { - case UP -> near(x, 0.0F) && near(z, 0.0F); - case DOWN -> near(x, 0.0F) && near(z, 1.0F); - case NORTH -> near(x, 1.0F) && near(y, 1.0F); - case SOUTH -> near(x, 0.0F) && near(y, 1.0F); - case EAST -> near(y, 1.0F) && near(z, 1.0F); - case WEST -> near(y, 1.0F) && near(z, 0.0F); - }; - if (hit) return i; - } - return -1; - } - - private static boolean near(float a, float b) { - return Math.abs(a - b) < 0.01F; - } - // TODO simplify, this is quite long public static MutableQuadView subsect(final MutableQuadView quad, ISubmap submap) { Direction normal = quad.nominalFace(); @@ -176,15 +133,11 @@ public static MutableQuadView subsect(final MutableQuadView quad, ISubmap submap Vector2f[] xy = CTMMeshBuilder.xy.get(); Vector2f[] newXy = CTMMeshBuilder.newXy.get(); - Vector3f position = CTMMeshBuilder.position.get(); for (int i = 0; i < 4; i++) { - // updates position - quad.copyPos(i, position); - switch (normal.getAxis()) { - case X -> xy[i].set(position.z, position.y); - case Y -> xy[i].set(position.x, position.z); - case Z -> xy[i].set(position.x, position.y); + case X -> xy[i].set(quad.z(i), quad.y(i)); + case Y -> xy[i].set(quad.x(i), quad.z(i)); + case Z -> xy[i].set(quad.x(i), quad.y(i)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java index eb0db0c089a..c0987d8e137 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java @@ -1,64 +1,35 @@ package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.utils.TriState; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.metadata.MetadataSectionSerializer; +import net.minecraft.server.packs.metadata.MetadataSectionType; import net.minecraft.server.packs.resources.Resource; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.SneakyThrows; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Optional; -public record GTTextureMetadata(@Nullable ResourceLocation connectionTexture, TriState bloom) { +public record GTTextureMetadata(Optional connectionTexture, TriState bloom) { - public static final String SECTION_NAME = GTCEu.MOD_ID; - public static final MetadataSectionSerializer SERIALIZER = new Serializer(); + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ResourceLocation.CODEC.lenientOptionalFieldOf("connection_texture").forGetter(GTTextureMetadata::connectionTexture), + TriState.CODEC.optionalFieldOf("bloom", TriState.DEFAULT).forGetter(GTTextureMetadata::bloom) + ).apply(instance, GTTextureMetadata::new)); + public static final MetadataSectionType TYPE = MetadataSectionType.fromCodec("gtceu", CODEC); + // spotless:on - public static final GTTextureMetadata EMPTY = new GTTextureMetadata(null, TriState.DEFAULT); + public static final GTTextureMetadata EMPTY = new GTTextureMetadata(Optional.empty(), TriState.DEFAULT); /** * @apiNote This method throws {@link IOException} even though it isn't specified in the method definition. */ @SneakyThrows(IOException.class) public static Optional getForResourceUnsafe(Resource resource) { - return resource.metadata().getSection(SERIALIZER); - } - - public GTTextureMetadata { - // Optional codec fields can't have null as the default value, so we do this instead. - // It's impossible to define an entirely empty ResourceLocation in a resource file, - // as even ":" is converted to "minecraft:". Thus, this should be entirely safe. - if (connectionTexture == Serializer.EMPTY_CONNECTION) connectionTexture = null; - } - - public static class Serializer implements MetadataSectionSerializer { - - protected static final ResourceLocation EMPTY_CONNECTION = ResourceLocation.fromNamespaceAndPath("", ""); - - // spotless:off - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - ResourceLocation.CODEC.optionalFieldOf("connection_texture", EMPTY_CONNECTION).forGetter(GTTextureMetadata::connectionTexture), - TriState.CODEC.optionalFieldOf("bloom", TriState.DEFAULT).forGetter(GTTextureMetadata::bloom) - ).apply(instance, GTTextureMetadata::new)); - // spotless:on - - @Override - public GTTextureMetadata fromJson(@Nullable JsonObject json) throws JsonParseException { - return CODEC.parse(JsonOps.INSTANCE, json).getOrThrow(JsonParseException::new); - } - - @Override - public String getMetadataSectionName() { - return SECTION_NAME; - } + return resource.metadata().getSection(TYPE); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java index 2c67d777ed8..a5449b6c8f8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java @@ -317,8 +317,7 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl quads = replacePartBaseModel(quads, part, machine.getFrontFacing(), side, rand, modelData, renderType); } - // we have to recalculate CTM ourselves. - // this is the slowest part by a long shot because the LDLib quad logic isn't very optimized. + // we have to recalculate CTM ourselves if (level != null && pos != null && blockState != null && side != null) { return CTMMeshBuilder.buildCTMQuads(level, pos, blockState, quads, side); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java index 20a26260da1..e2488606a13 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector2fc; import org.joml.Vector3f; +import org.joml.Vector3fc; import static com.gregtechceu.gtceu.client.model.quad.EncodingFormat.*; @@ -81,12 +82,6 @@ public abstract class MutableQuadView extends QuadView { */ public static final int BAKE_LOCK_UV = 0b000100; - /** - * When enabled, texture coordinates are cycled so that vertex 0's UVs are the smallest. - * Pass in bakeFlags parameter to {@link TextureHelper#unbakeSprite(MutableQuadView, TextureAtlasSprite, int)}. - */ - public static final int BAKE_DEROTATE_UV = 0b000100; - /** * When set, U texture coordinates for the given sprite are flipped as part of baking. Can be useful for some * randomization and texture mapping scenarios. Results are different from what can be obtained via rotation and @@ -100,12 +95,16 @@ public abstract class MutableQuadView extends QuadView { public static final int BAKE_FLIP_V = 0b010000; /** - * UV coordinates by default are assumed to be 0-16 scale for consistency with conventional Minecraft model format. - * This is scaled to 0-1 during baking before interpolation. Model loaders that already have 0-1 coordinates can - * avoid wasteful multiplication/division by passing 0-1 coordinates directly. - * Pass in bakeFlags parameter to {@link #spriteBake(TextureAtlasSprite, int)}. + * When enabled, texture coordinates are cycled so that vertex 0's UVs are the smallest. + * Pass in bakeFlags parameter to {@link TextureHelper#unbakeSprite(MutableQuadView, TextureAtlasSprite, int)}. */ - public static final int BAKE_NORMALIZED = 0b100000; + public static final int UNBAKE_DEROTATE_UV = 0b000100; + + /** + * When enabled, vertex coordinates are cycled so that vertex 0 is always at the same position. + * Pass in bakeFlags parameter to {@link TextureHelper#unbakeSprite(MutableQuadView, TextureAtlasSprite, int)}. + */ + public static final int UNBAKE_CANONICALIZE_WINDING = 0b100000; public static MutableQuadView getInstance() { return MutableQuadView.THREAD_LOCAL.get(); @@ -154,8 +153,12 @@ public MutableQuadView pos(int vertexIndex, float x, float y, float z) { /** * Same as {@link #pos(int, float, float, float)} but accepts a vector type. + * + *

+ * Only use this function if you already have a {@link Vector3fc}. + * Otherwise, see {@link MutableQuadView#pos(int, float, float, float)}. */ - public MutableQuadView pos(int vertexIndex, Vector3f pos) { + public MutableQuadView pos(int vertexIndex, Vector3fc pos) { return pos(vertexIndex, pos.x(), pos.y(), pos.z()); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/StaticFaceBakery.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/StaticFaceBakery.java index d1e8da9bfbf..3aa949e95ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/StaticFaceBakery.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/StaticFaceBakery.java @@ -226,14 +226,8 @@ private static void fillVertex(int[] vertexData, int vertexIndex, Vector3f face, vertexData[i + POSITION_INDEX + 1] = Float.floatToRawIntBits(face.y()); vertexData[i + POSITION_INDEX + 2] = Float.floatToRawIntBits(face.z()); vertexData[i + COLOR_INDEX] = 0xffffffff; - vertexData[i + UV_INDEX] = Float.floatToRawIntBits( - sprite.getU( - (blockFaceUV.getU(vertexIndex) * 0.999f + blockFaceUV.getU((vertexIndex + 2) % 4) * 0.001f) / - 16.0F)); - vertexData[i + UV_INDEX + 1] = Float.floatToRawIntBits( - sprite.getV( - (blockFaceUV.getV(vertexIndex) * 0.999f + blockFaceUV.getV((vertexIndex + 2) % 4) * 0.001f) / - 16.0F)); + vertexData[i + UV_INDEX] = Float.floatToRawIntBits(sprite.getU(blockFaceUV.getU(vertexIndex) / 16.0F)); + vertexData[i + UV_INDEX + 1] = Float.floatToRawIntBits(sprite.getV(blockFaceUV.getV(vertexIndex) / 16.0F)); } private static float[] setupShape(Vector3f min, Vector3f max) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/AABBHighlightRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/AABBHighlightRenderer.java index 8e4334c7895..8abed5cf69d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/AABBHighlightRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/AABBHighlightRenderer.java @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.client.renderer; -import com.gregtechceu.gtceu.client.util.RenderBufferHelper; - import net.minecraft.client.Camera; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.util.FastColor; import net.minecraft.world.phys.AABB; @@ -32,7 +32,7 @@ public class AABBHighlightRenderer { private final List highlights = new ObjectArrayList<>(); - public void tick(PoseStack stack, MultiBufferSource.BufferSource multiBuf, Camera camera) { + public void tick(PoseStack stack, MultiBufferSource.BufferSource bufferSource, Camera camera) { if (GameRenderer.getPositionColorShader() == null || !camera.isInitialized()) return; Vec3 offset = camera.getPosition().reverse(); @@ -44,13 +44,12 @@ public void tick(PoseStack stack, MultiBufferSource.BufferSource multiBuf, Camer stack.pushPose(); stack.translate(offset.x, offset.y, offset.z); - VertexConsumer buffer = multiBuf.getBuffer(GTRenderTypes.blockHighlightQuads()); + VertexConsumer buffer = bufferSource.getBuffer(RenderType.lines()); long time = System.currentTimeMillis(); highlights.forEach(h -> h.render(buffer, stack, time)); stack.popPose(); - multiBuf.endBatch(); RenderSystem.enableCull(); RenderSystem.enableDepthTest(); @@ -62,10 +61,11 @@ public void addHighlight(AABBHighlight highlight) { highlights.add(highlight); } - public record AABBHighlight(AABB aabb, int colorARGB, long startMillis, long durationMillis, long phaseMillis, + public record AABBHighlight(AABB aabb, int colorARGB, + long startMillis, long durationMillis, long phaseMillis, double thickness) { - public void render(VertexConsumer buf, PoseStack pose, long currentTimeMillis) { + public void render(VertexConsumer buffer, PoseStack poseStack, long currentTimeMillis) { if (currentTimeMillis - startMillis >= durationMillis) { this.remove(); return; @@ -73,7 +73,11 @@ public void render(VertexConsumer buf, PoseStack pose, long currentTimeMillis) { if (currentTimeMillis < startMillis) return; if ((currentTimeMillis - startMillis) / phaseMillis % 2 == 1) return; - RenderBufferHelper.renderAABBOutline(buf, pose, aabb(), thickness, colorARGB()); + LevelRenderer.renderLineBox(poseStack, buffer, aabb, + FastColor.ARGB32.red(colorARGB), + FastColor.ARGB32.green(colorARGB), + FastColor.ARGB32.blue(colorARGB), + FastColor.ARGB32.alpha(colorARGB)); } public void remove() { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java index fd72d57192c..5d517a450cb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockEntityWithBERModelRenderer.java @@ -4,24 +4,17 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.client.model.data.ModelData; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import javax.annotation.ParametersAreNonnullByDefault; @@ -49,24 +42,6 @@ public void render(T blockEntity, float partialTick, ((IBlockEntityRendererBakedModel) berModel).render(blockEntity, partialTick, poseStack, buffer, packedLight, packedOverlay); - } else { - Level level = blockEntity.getLevel(); - BlockPos pos = blockEntity.getBlockPos(); - - @SuppressWarnings("DataFlowIssue") - ModelData modelData = level.getModelData(pos); - - long randomSeed = blockState.getSeed(pos); - RandomSource random = RandomSource.create(); - random.setSeed(randomSeed); - - for (RenderType renderType : model.getRenderTypes(blockState, random, modelData)) { - VertexConsumer consumer = buffer.getBuffer(renderType); - blockRenderDispatcher.getModelRenderer() - .tesselateBlock(level, model, blockState, pos, - poseStack, consumer, true, random, randomSeed, - OverlayTexture.NO_OVERLAY, modelData, renderType); - } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java index 817a614ae7e..70feab14227 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -4,6 +4,7 @@ import net.minecraft.Util; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlas; @@ -11,8 +12,6 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; @@ -33,20 +32,24 @@ public class GTRenderTypes extends RenderType { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }); - protected static final RenderStateShard.ShaderStateShard RENDERTYPE_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( + public static final RenderStateShard.ShaderStateShard RENDERTYPE_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( BloomShaderManager::getRendertypeBloomShader); - protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( + public static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( BloomShaderManager::getRendertypeEntityBloomShader); + public static final RenderStateShard.ShaderStateShard POSITION_TEX_COLOR_SHADER = new RenderStateShard.ShaderStateShard( + GameRenderer::getPositionTexColorShader); - private static final RenderType LIGHT_RING = RenderType.create("light_ring", DefaultVertexFormat.POSITION_COLOR, - VertexFormat.Mode.TRIANGLE_STRIP, RenderType.SMALL_BUFFER_SIZE, false, false, + private static final RenderType LIGHT_RING = RenderType.create("light_ring", + DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, + RenderType.SMALL_BUFFER_SIZE, false, false, RenderType.CompositeState.builder() .setCullState(NO_CULL) .setShaderState(POSITION_COLOR_SHADER) .createCompositeState(false)); - private static final RenderType BLOOM = RenderType.create("gtceu:bloom", DefaultVertexFormat.BLOCK, - VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, true, false, + private static final RenderType BLOOM = RenderType.create("gtceu:bloom", + DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, + RenderType.BIG_BUFFER_SIZE, true, false, RenderType.CompositeState.builder() .setShaderState(RENDERTYPE_BLOOM_SHADER) .setOutputState(BLOOM_TARGET) @@ -54,94 +57,32 @@ public class GTRenderTypes extends RenderType { .setTextureState(BLOCK_SHEET_MIPPED) .createCompositeState(true)); private static final Function ENTITY_BLOOM = Util.memoize((texture) -> { - return create("gtceu:entity_bloom", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, + return create("gtceu:entity_bloom", + DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, RenderType.TRANSIENT_BUFFER_SIZE, true, false, RenderType.CompositeState.builder() .setShaderState(RENDERTYPE_ENTITY_BLOOM_SHADER) .setOutputState(BLOOM_TARGET) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) - .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) + .setTextureState(new RenderStateShard.TextureStateShard(texture, false, true)) .createCompositeState(true)); }); private static final RenderType MONITOR = RenderType.create("central_monitor", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, RenderType.TRANSIENT_BUFFER_SIZE, false, false, + DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, + RenderType.TRANSIENT_BUFFER_SIZE, false, false, RenderType.CompositeState.builder() .setCullState(NO_CULL) .setShaderState(POSITION_COLOR_SHADER) .setTransparencyState(TRANSLUCENT_TRANSPARENCY) .createCompositeState(false)); - private static final RenderType BLOCK_HIGHLIGHT_QUADS = RenderType.create("gt_block_highlight_quads", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 256, false, - false, CompositeState.builder() - .setTransparencyState(new TransparencyStateShard("sto", () -> { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, - GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - }, () -> { - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - })) - .setDepthTestState(NO_DEPTH_TEST) - .setCullState(NO_CULL) - .setShaderState(POSITION_COLOR_SHADER) - .setLightmapState(NO_LIGHTMAP) - .setWriteMaskState(COLOR_DEPTH_WRITE) - .setTextureState(NO_TEXTURE) - .createCompositeState(true)); - - private static final Function GUI_TEXTURE = Util.memoize((texture) -> { - return create("gui_texture", DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP, VertexFormat.Mode.QUADS, - RenderType.TRANSIENT_BUFFER_SIZE, false, true, - RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_TEXT_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .createCompositeState(false)); - }); - - private static final RenderType INWORLD_GUI = create("inworld_gui", DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP, - VertexFormat.Mode.QUADS, - RenderType.TRANSIENT_BUFFER_SIZE, false, true, - RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_TRANSLUCENT_SHADER) - .setTextureState(RenderStateShard.NO_TEXTURE) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .createCompositeState(false)); - private static final RenderType GUI_TRIANGLE_STRIP = RenderType.create("gui_triangle_strip", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 256, false, false, - RenderType.CompositeState.builder() - .setShaderState(RenderStateShard.RENDERTYPE_GUI_SHADER) - .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) - .setDepthTestState(RenderStateShard.LEQUAL_DEPTH_TEST) - .createCompositeState(false)); - - private static final RenderType GUI_TRIANGLE_FAN = RenderType.create("gui_triangle_fan", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_FAN, 256, false, false, - RenderType.CompositeState.builder() - .setShaderState(RenderStateShard.RENDERTYPE_GUI_SHADER) - .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) - .setDepthTestState(RenderStateShard.LEQUAL_DEPTH_TEST) - .createCompositeState(false)); - - private static final RenderType GUI_OVERLAY_TRIANGLE_FAN = RenderType.create("gui_overlay_triangle_fan", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_FAN, 256, false, false, - RenderType.CompositeState.builder() - .setShaderState(RenderStateShard.RENDERTYPE_GUI_OVERLAY_SHADER) - .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) - .setDepthTestState(RenderStateShard.NO_DEPTH_TEST) - .setWriteMaskState(RenderStateShard.COLOR_WRITE) - .createCompositeState(false)); - private static final Function GUI_TEXTURE_TRIANGLE_STRIP = Util.memoize((texture) -> { - return create("gui_texture_triangle_strip", DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP, + return create("gui_texture_triangle_strip", DefaultVertexFormat.POSITION_TEX_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 256, false, false, RenderType.CompositeState.builder() - .setShaderState(RenderStateShard.POSITION_COLOR_TEX_LIGHTMAP_SHADER) + .setShaderState(POSITION_TEX_COLOR_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) .setDepthTestState(RenderStateShard.LEQUAL_DEPTH_TEST) @@ -170,35 +111,11 @@ public static RenderType entityBloomBlockSheet() { return entityBloom(TextureAtlas.LOCATION_BLOCKS); } - public static RenderType blockHighlightQuads() { - return BLOCK_HIGHLIGHT_QUADS; - } - public static RenderType getMonitor() { return MONITOR; } - public static RenderType guiTexture(ResourceLocation texture) { - return GUI_TEXTURE.apply(texture); - } - - public static RenderType inWorldGui() { - return INWORLD_GUI; - } - - public static RenderType guiTriangleStrip() { - return GUI_TRIANGLE_STRIP; - } - public static RenderType guiTriangleStrip(ResourceLocation texture) { return GUI_TEXTURE_TRIANGLE_STRIP.apply(texture); } - - public static RenderType guiTriangleFan() { - return GUI_TRIANGLE_FAN; - } - - public static RenderType guiOverlayTriangleFan() { - return GUI_OVERLAY_TRIANGLE_FAN; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorImageRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorImageRenderer.java index e86c3d4cb2d..7e245f701fd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorImageRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/monitor/MonitorImageRenderer.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.client.renderer.monitor; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.util.ClientImageCache; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; @@ -10,6 +9,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; +import brachy.modularui.utils.MUIRenderTypes; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import org.joml.Matrix4f; @@ -35,7 +35,7 @@ public void render(CentralMonitorMachine machine, MonitorGroup group, float part ResourceLocation textureId = ClientImageCache.getOrLoadTexture(url); if (textureId == null) return; - VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.guiTexture(textureId)); + VertexConsumer consumer = buffer.getBuffer(MUIRenderTypes.guiTexture(textureId)); Matrix4f pose = poseStack.last().pose(); float minX = 0, maxX = size.getX(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java index b4f48ad498e..1c33b987a2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -153,8 +153,8 @@ public static void initInternalAssetReloadListeners() { for (ResourceLocation location : atlas.getTextures().keySet()) { var sec = TextureMetadataHelper.getMetadataFromRelativeLocation(location); sec.ifPresent(section -> { - if (section.connectionTexture() != null) { - TextureAtlasSprite ctmSprite = atlas.getSprite(section.connectionTexture()); + if (section.connectionTexture().isPresent()) { + TextureAtlasSprite ctmSprite = atlas.getSprite(section.connectionTexture().get()); CTM_SPRITE_CACHE.put(location, ctmSprite); } }); @@ -170,10 +170,6 @@ public static void initInternalAssetReloadListeners() { // Nothing we can add to builtin models return baked; } - // do not register automatic CTM for machine models, they handle it themselves - if (baked instanceof MachineModel) { - return baked; - } if (rootModel == null || baked instanceof CTMBakedModel) { return baked; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java index 67e67eda203..1044e734560 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java @@ -2,17 +2,11 @@ import com.gregtechceu.gtceu.utils.GTMatrixUtils; -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -23,9 +17,6 @@ import java.util.Set; -import static com.gregtechceu.gtceu.utils.GTMath.getFirstPerpendicular; -import static com.gregtechceu.gtceu.utils.GTMath.getSecondPerpendicular; - @SuppressWarnings("DuplicatedCode") @OnlyIn(Dist.CLIENT) public class RenderBufferHelper { @@ -107,128 +98,6 @@ public static void renderRing(PoseStack poseStack, VertexConsumer buffer, float } } - public static void renderInWorldText(MultiBufferSource multiBuf, PoseStack stack, Camera camera, String text, - int colorARGB, Vec3 pos) { - renderInWorldText(multiBuf, stack, camera, text, 0.030F, colorARGB, pos); - } - - public static void renderInWorldText(MultiBufferSource multiBuf, PoseStack stack, Camera camera, String text, - float scale, int colorARGB, Vec3 pos) { - Font fontRender = Minecraft.getInstance().font; - Vec3 c = pos.subtract(camera.getPosition()); - float stringMiddle = (float) fontRender.width(text) / 2.0F; - stack.pushPose(); - stack.translate(c.x, c.y, c.z); - stack.mulPose(camera.rotation()); - stack.scale(-scale, -scale, scale); - Matrix4f mat = stack.last().pose(); - fontRender.drawInBatch(text, -stringMiddle, 0.0F, colorARGB, false, mat, multiBuf, Font.DisplayMode.SEE_THROUGH, - 0, 15728880); - stack.popPose(); - } - - public static void renderLine(VertexConsumer buf, PoseStack stack, BlockPos from, BlockPos to, double thickness, - int colorARGB) { - renderLine(buf, stack, from.getCenter(), to.getCenter(), thickness, colorARGB); - } - - public static void renderLine(VertexConsumer buf, PoseStack stack, Vec3 from, Vec3 to, double thickness, - int colorARGB) { - Vec3 law = getFirstPerpendicular(from, to).scale(thickness); - Vec3 law2 = getSecondPerpendicular(from, to).scale(thickness); - Vec3 topRight = from.add(law2); - Vec3 bottomRight = from.subtract(law); - Vec3 bottomLeft = from.subtract(law2); - Vec3 topLeft = from.add(law); - Vec3 topRight2 = to.add(law2); - Vec3 bottomRight2 = to.subtract(law); - Vec3 bottomLeft2 = to.subtract(law2); - Vec3 topLeft2 = to.add(law); - - renderSide(buf, stack, topRight, topLeft, bottomRight, bottomLeft, colorARGB); - renderSide(buf, stack, topRight2, topRight, bottomRight2, bottomRight, colorARGB); - renderSide(buf, stack, topLeft2, topRight2, bottomLeft2, bottomRight2, colorARGB); - renderSide(buf, stack, topLeft, topLeft2, bottomLeft, bottomLeft2, colorARGB); - renderSide(buf, stack, topLeft2, topRight2, topLeft, topRight, colorARGB); - renderSide(buf, stack, bottomLeft2, bottomRight2, bottomLeft, bottomRight, colorARGB); - } - - public static void renderCube(VertexConsumer buf, PoseStack stack, BlockPos pos, float size, int colorARGB) { - renderCube(buf, stack, pos.getCenter(), size, colorARGB); - } - - public static void renderCube(VertexConsumer buf, PoseStack stack, Vec3 pos, float size, int colorARGB) { - float half = size / 2.0F; - - AABB box = new AABB(pos.x - (double) half, pos.y - (double) half, pos.z - (double) half, pos.x + (double) half, - pos.y + (double) half, pos.z + (double) half); - - Vec3 topRight = new Vec3(box.maxX, box.maxY, box.maxZ); - Vec3 bottomRight = new Vec3(box.maxX, box.minY, box.maxZ); - Vec3 bottomLeft = new Vec3(box.minX, box.minY, box.maxZ); - Vec3 topLeft = new Vec3(box.minX, box.maxY, box.maxZ); - Vec3 topRight2 = new Vec3(box.maxX, box.maxY, box.minZ); - Vec3 bottomRight2 = new Vec3(box.maxX, box.minY, box.minZ); - Vec3 bottomLeft2 = new Vec3(box.minX, box.minY, box.minZ); - Vec3 topLeft2 = new Vec3(box.minX, box.maxY, box.minZ); - renderSide(buf, stack, topRight, topLeft, bottomRight, bottomLeft, colorARGB); - renderSide(buf, stack, topRight2, topRight, bottomRight2, bottomRight, colorARGB); - renderSide(buf, stack, topLeft2, topRight2, bottomLeft2, bottomRight2, colorARGB); - renderSide(buf, stack, topLeft, topLeft2, bottomLeft, bottomLeft2, colorARGB); - renderSide(buf, stack, topLeft2, topRight2, topLeft, topRight, colorARGB); - renderSide(buf, stack, bottomLeft2, bottomRight2, bottomLeft, bottomRight, colorARGB); - } - - public static void renderAABBOutline(VertexConsumer buf, PoseStack pose, AABB aabb, double thickness, - int colorARGB) { - double minX = aabb.minX; - double minY = aabb.minY; - double minZ = aabb.minZ; - - double maxX = aabb.maxX; - double maxY = aabb.maxY; - double maxZ = aabb.maxZ; - - // Bottom face vertices - Vec3 bot00 = new Vec3(minX, minY, minZ); - Vec3 bot10 = new Vec3(maxX, minY, minZ); - Vec3 bot11 = new Vec3(maxX, minY, maxZ); - Vec3 bot01 = new Vec3(minX, minY, maxZ); - - // Top face vertices - Vec3 top00 = new Vec3(minX, maxY, minZ); - Vec3 top10 = new Vec3(maxX, maxY, minZ); - Vec3 top11 = new Vec3(maxX, maxY, maxZ); - Vec3 top01 = new Vec3(minX, maxY, maxZ); - - // Bottom rectangle edges - renderLine(buf, pose, bot00, bot10, thickness, colorARGB); - renderLine(buf, pose, bot10, bot11, thickness, colorARGB); - renderLine(buf, pose, bot11, bot01, thickness, colorARGB); - renderLine(buf, pose, bot01, bot00, thickness, colorARGB); - - // Top rectangle edges - renderLine(buf, pose, top00, top10, thickness, colorARGB); - renderLine(buf, pose, top10, top11, thickness, colorARGB); - renderLine(buf, pose, top11, top01, thickness, colorARGB); - renderLine(buf, pose, top01, top00, thickness, colorARGB); - - // Vertical edges - renderLine(buf, pose, bot00, top00, thickness, colorARGB); - renderLine(buf, pose, bot10, top10, thickness, colorARGB); - renderLine(buf, pose, bot11, top11, thickness, colorARGB); - renderLine(buf, pose, bot01, top01, thickness, colorARGB); - } - - private static void renderSide(VertexConsumer buf, PoseStack pose, Vec3 tr, Vec3 tl, Vec3 br, Vec3 bl, - int colorARGB) { - Matrix4f mat = pose.last().pose(); - buf.addVertex(mat, (float) tr.x, (float) tr.y, (float) tr.z).setColor(colorARGB); - buf.addVertex(mat, (float) br.x, (float) br.y, (float) br.z).setColor(colorARGB); - buf.addVertex(mat, (float) bl.x, (float) bl.y, (float) bl.z).setColor(colorARGB); - buf.addVertex(mat, (float) tl.x, (float) tl.y, (float) tl.z).setColor(colorARGB); - } - public static void renderTexturedCube(VertexConsumer buffer, PoseStack.Pose pose, Set sidesToRender, int color, int combinedLight, TextureAtlasSprite sprite, float minX, float minY, float minZ, float maxX, float maxY, float maxZ) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java index facecba1cfb..d851257bdc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -19,9 +19,11 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import lombok.experimental.UtilityClass; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; import static com.gregtechceu.gtceu.client.model.quad.MutableQuadView.*; @@ -32,9 +34,6 @@ @UtilityClass public class TextureHelper { - public static final float NORMALIZER = 1f / 16f; - public static final float DENORMALIZER = 16f; - private static final int BAKE_ROTATE_ANY = BAKE_ROTATE_270 | BAKE_ROTATE_180 | BAKE_ROTATE_90; /** @@ -52,12 +51,6 @@ public static void bakeSprite(MutableQuadView quad, @Nullable TextureAtlasSprite if (quad.nominalFace() != null && (BAKE_LOCK_UV & bakeFlags) != 0) { // Assigns normalized UV coordinates based on vertex positions applyModifier(quad, UV_LOCKERS[quad.nominalFace().get3DDataValue()]); - } else if ((BAKE_NORMALIZED & bakeFlags) == 0) { - // flag is NOT set, UVs are assumed to not be normalized yet as is the default. - // normalize through dividing by 16 - - // Scales from 0-16 to 0-1 - applyModifier(quad, (q, i) -> q.uv(i, q.u(i) * NORMALIZER, q.v(i) * NORMALIZER)); } final int rotation = bakeFlags & BAKE_ROTATE_ANY; @@ -103,9 +96,7 @@ public static void interpolate(MutableQuadView q, TextureAtlasSprite sprite) { * Textures must be already baked. * *

- * Note this the function's order of operations is reversed in relation to {@link #bakeSprite}.
- * The {@link MutableQuadView#BAKE_NORMALIZED BAKE_NORMALIZED} flag also works inversely - * to the one in {@link #bakeSprite}. + * Note this the function's order of operations is reversed in relation to {@link #bakeSprite}. * *

* If {@code sprite == null}, only the UV modifiers will be applied, @@ -137,17 +128,14 @@ public static void unbakeSprite(MutableQuadView quad, @Nullable TextureAtlasSpri applyModifier(quad, ROTATIONS[rotation]); } - if ((BAKE_NORMALIZED & bakeFlags) == 0) { - // flag is NOT set, UVs are assumed to be normalized as is the default. - // denormalize through multiplying by 16 - - // Scales from 0-1 to 0-16 - applyModifier(quad, (q, i) -> q.uv(i, q.u(i) * DENORMALIZER, q.v(i) * DENORMALIZER)); - } - if ((BAKE_DEROTATE_UV & bakeFlags) != 0) { + if ((UNBAKE_DEROTATE_UV & bakeFlags) != 0) { // Cycles texture coordinates so that vertex 0's UVs are the smallest derotateUV(quad); } + if ((UNBAKE_CANONICALIZE_WINDING & bakeFlags) != 0) { + // Cycles texture coordinates so that vertex 0's UVs are the smallest + canonicalizeWinding(quad); + } } /** @@ -165,6 +153,10 @@ public static void deInterpolate(MutableQuadView q, TextureAtlasSprite sprite) { } } + private static final ThreadLocal positions = ThreadLocal.withInitial(() -> new Vector3f[4]); + private static final ThreadLocal color = ThreadLocal.withInitial(() -> new int[4]); + private static final ThreadLocal light = ThreadLocal.withInitial(() -> new int[4]); + private static void derotateUV(MutableQuadView quad) { int minIndex = 0; float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE; @@ -179,6 +171,45 @@ private static void derotateUV(MutableQuadView quad) { applyModifier(quad, ROTATIONS[minIndex]); } + private static void canonicalizeWinding(MutableQuadView quad) { + Direction face = quad.nominalFace(); + if (face == null) return; + + int target = anchorIndex(quad, face); + // no need to do anything if target is 0 as that means the winding is already correct + if (target <= 0) return; + + Vector3f[] pos = TextureHelper.positions.get(); + int[] color = TextureHelper.color.get(); + int[] light = TextureHelper.light.get(); + for (int i = 0; i < 4; i++) { + pos[i] = quad.copyPos(i, pos[i]); + color[i] = quad.color(i); + light[i] = quad.lightmap(i); + } + for (int i = 0; i < 4; i++) { + int idx = (i + target) & 3; + quad.pos(i, pos[idx]); + quad.color(i, color[idx]); + quad.lightmap(i, light[idx]); + } + } + + private static int anchorIndex(MutableQuadView quad, Direction face) { + for (int i = 0; i < 4; i++) { + boolean hit = switch (face) { + case UP -> Mth.equal(quad.x(i), 0.0F) && Mth.equal(quad.z(i), 0.0F); + case DOWN -> Mth.equal(quad.x(i), 0.0F) && Mth.equal(quad.z(i), 1.0F); + case NORTH -> Mth.equal(quad.x(i), 1.0F) && Mth.equal(quad.y(i), 1.0F); + case SOUTH -> Mth.equal(quad.x(i), 0.0F) && Mth.equal(quad.y(i), 1.0F); + case EAST -> Mth.equal(quad.y(i), 1.0F) && Mth.equal(quad.z(i), 1.0F); + case WEST -> Mth.equal(quad.y(i), 1.0F) && Mth.equal(quad.z(i), 0.0F); + }; + if (hit) return i; + } + return -1; + } + @FunctionalInterface public interface VertexModifier { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/GTQuadTransformers.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/GTQuadTransformers.java index cf8fe3922e4..d0b5db1d89a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/GTQuadTransformers.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/GTQuadTransformers.java @@ -4,7 +4,6 @@ import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; -import net.minecraft.util.Mth; import net.neoforged.neoforge.client.model.IQuadTransformer; import net.neoforged.neoforge.client.model.QuadTransformers; @@ -55,9 +54,8 @@ public static BakedQuad setSprite(BakedQuad quad, TextureAtlasSprite sprite) { float u = Float.intBitsToFloat(vertices[offset]); float v = Float.intBitsToFloat(vertices[offset + 1]); - // same as sprite.getX(oldSprite.getXOffset(x)), but we don't multiply and divide in between - u = Mth.map(u, oldSprite.getU0(), oldSprite.getU1(), sprite.getU0(), sprite.getU1()); - v = Mth.map(v, oldSprite.getV0(), oldSprite.getV1(), sprite.getV0(), sprite.getV1()); + u = sprite.getU(oldSprite.getUOffset(u)); + v = sprite.getV(oldSprite.getVOffset(v)); vertices[offset] = Float.floatToRawIntBits(u); vertices[offset + 1] = Float.floatToRawIntBits(v); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 7d59ea5d4c1..3b6beb93849 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -1211,6 +1211,11 @@ public static void init() { if (GTCEu.Mods.isAE2Loaded()) { GTAEMachines.init(); } + + // Dev-only test machines + if (GTCEu.isDev()) { + GTDevMachines.init(); + } } public static void bakeRenderStates(Registry registry) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTDevMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTDevMachines.java new file mode 100644 index 00000000000..ac2e69602a7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTDevMachines.java @@ -0,0 +1,44 @@ +package com.gregtechceu.gtceu.common.data.machines; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.multiblock.Predicates; +import com.gregtechceu.gtceu.api.multiblock.pattern.MultiblockPatternBuilder; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import static com.gregtechceu.gtceu.api.multiblock.Predicates.*; +import static com.gregtechceu.gtceu.common.data.blocks.GTDevBlocks.CTM_TEST; +import static com.gregtechceu.gtceu.common.registry.GTRegistration.REGISTRATE; + +public class GTDevMachines { + + public static final MultiblockMachineDefinition CONNECTED_TEXTURE_TEST = REGISTRATE + .multiblock("connected_texture_test", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.ALL) + .recipeType(GTRecipeTypes.LARGE_CHEMICAL_RECIPES) + .appearanceBlock(CTM_TEST) + .pattern(definition -> MultiblockPatternBuilder.start() + .slice("S ", " ", "XXXXXXXXX", "XXXX XX ", "XXXXXXXXX") + .slice(" ", " ", " ", " ", " ") + .slice(" ", " ", " ", " ", " ") + .slice(" ", " ", " ", " ", " ") + .slice(" ", " ", " XXX", " XXX", " XXX") + .slice(" ", " ", " XXX", " XXX", " XXX") + .slice(" ", " ", " XXXX", " XXXX", " XXXX") + .slice(" ", " ", " ", " ", " ") + .slice(" ", " ", " ", " ", " ") + .slice(" ", " ", " XX", " XX", " XX") + .where('S', controller(blocks(definition.get()))) + .where('X', blocks(CTM_TEST) + .or(autoAbilities(definition.getRecipeTypes())) + .or(Predicates.autoAbilities(true, true, true))) + .where(' ', air()) + .build()) + .workableCasingModel(GTCEu.id("block/ctm_test"), + GTCEu.id("block/multiblock/electric_blast_furnace")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/SteamDialWidget.java b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/SteamDialWidget.java index 95937082f86..04ac437c44c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/SteamDialWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/widgets/SteamDialWidget.java @@ -9,7 +9,7 @@ import brachy.modularui.drawable.UITexture; import brachy.modularui.screen.viewport.GuiContext; import brachy.modularui.theme.WidgetTheme; -import brachy.modularui.utils.Color; +import brachy.modularui.utils.MUIRenderTypes; import brachy.modularui.value.sync.DoubleSyncValue; import com.mojang.blaze3d.vertex.VertexConsumer; import lombok.Setter; @@ -37,60 +37,42 @@ public SteamDialWidget(DoubleSyncValue progress) { @Override public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { GuiGraphics graphics = context.getGraphics(); - // RenderSystem.setShader(GameRenderer::getPositionColorShader); Matrix4f pose = graphics.pose().last().pose(); - if (texture == null) { - VertexConsumer bufferBuilder = graphics.bufferSource().getBuffer(GTRenderTypes.guiTriangleStrip()); - final float progressPercent = Mth.clamp(progress.getFloatValue(), 0.0f, 1.0f); - final float angle = Mth.lerp(progressPercent, this.minAngle, this.maxAngle); + float halfH = height / 2.0f; - if (Float.isNaN(lastAngle)) { - lastAngle = angle; - } else { - lastAngle = (lastAngle + angle) / 2.0f; - } - final float lastAngleF = lastAngle; + final float progressPercent = Mth.clamp(progress.getFloatValue(), 0.0f, 1.0f); + final float angle = Mth.lerp(progressPercent, this.minAngle, this.maxAngle); - final float sinAngle = Mth.sin(-lastAngleF); - final float cosAngle = Mth.cos(-lastAngleF); + if (Float.isNaN(lastAngle)) { + lastAngle = angle; + } else { + lastAngle = (lastAngle + angle) / 2.0f; + } + final float lastAngleF = lastAngle; - height /= 2.f; - int a = Color.getAlpha(color), r = Color.getRed(color), g = Color.getGreen(color), b = Color.getBlue(color); + final float sinAngle = Mth.sin(-lastAngleF); + final float cosAngle = Mth.cos(-lastAngleF); + + if (texture == null) { + VertexConsumer bufferBuilder = graphics.bufferSource().getBuffer(MUIRenderTypes.guiTriangleStrip()); - bufferBuilder.addVertex(pose, x + width * cosAngle, y + width * sinAngle, 0.0f).setColor(r, g, b, a); - bufferBuilder.addVertex(pose, x + height * sinAngle, y - height * cosAngle, 0.0f).setColor(r, g, b, a); - bufferBuilder.addVertex(pose, x - height * sinAngle, y + height * cosAngle, 0.0f).setColor(r, g, b, a); - bufferBuilder.addVertex(pose, x - height * cosAngle, y - height * sinAngle, 0.0f).setColor(r, g, b, a); + bufferBuilder.addVertex(pose, x + width * cosAngle, y + width * sinAngle, 0.0f).setColor(color); + bufferBuilder.addVertex(pose, x + halfH * sinAngle, y - halfH * cosAngle, 0.0f).setColor(color); + bufferBuilder.addVertex(pose, x - halfH * sinAngle, y + halfH * cosAngle, 0.0f).setColor(color); + bufferBuilder.addVertex(pose, x - halfH * cosAngle, y - halfH * sinAngle, 0.0f).setColor(color); } else { VertexConsumer bufferBuilder = graphics.bufferSource() .getBuffer(GTRenderTypes.guiTriangleStrip(texture.location)); - final float progressPercent = Mth.clamp(progress.getFloatValue(), 0.0f, 1.0f); - final float angle = Mth.lerp(progressPercent, this.minAngle, this.maxAngle); - - if (Float.isNaN(lastAngle)) { - lastAngle = angle; - } else { - lastAngle = (lastAngle + angle) / 2.0f; - } - final float lastAngleF = lastAngle; - - final float sinAngle = Mth.sin(-lastAngleF); - final float cosAngle = Mth.cos(-lastAngleF); - - height /= 2.f; - int a = Color.getAlpha(color), r = Color.getRed(color), g = Color.getGreen(color), b = Color.getBlue(color); - - bufferBuilder.addVertex(pose, x + width * cosAngle, y + width * sinAngle, 0.0f).setColor(r, g, b, a) - .setUv(0.0f, 0.0f); - bufferBuilder.addVertex(pose, x + height * sinAngle, y - height * cosAngle, 0.0f).setColor(r, g, b, a) - .setUv(1.0f, 0.0f); - bufferBuilder.addVertex(pose, x - height * sinAngle, y + height * cosAngle, 0.0f).setColor(r, g, b, a) - .setUv(0.0f, 1.0f); - bufferBuilder.addVertex(pose, x - height * cosAngle, y - height * sinAngle, 0.0f).setColor(r, g, b, a) - .setUv(1.0f, 1.0f); + bufferBuilder.addVertex(pose, x + width * cosAngle, y + width * sinAngle, 0.0f).setUv(0.0f, 0.0f) + .setColor(color); + bufferBuilder.addVertex(pose, x + halfH * sinAngle, y - halfH * cosAngle, 0.0f).setUv(1.0f, 0.0f) + .setColor(color); + bufferBuilder.addVertex(pose, x - halfH * sinAngle, y + halfH * cosAngle, 0.0f).setUv(0.0f, 1.0f) + .setColor(color); + bufferBuilder.addVertex(pose, x - halfH * cosAngle, y - halfH * sinAngle, 0.0f).setUv(1.0f, 1.0f) + .setColor(color); } - // RenderSystem.disableBlend(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 2bba245aa32..586cff311dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -897,13 +897,13 @@ public static class BloomOptions { @Configurable @Configurable.Comment({ "Bloom Algorithm", - "Requires reloading all chunks ", + "Requires reloading all chunks", "UNITY - Unity-like Bloom (rescale)", "UNREAL - Unreal-like Bloom (gaussian blur)", "DISABLED - No bloom", "Default: UNREAL" }) // @Configurable.Validator(BloomEventListeners.BloomTypeUpdateCallback.class) // for Configuration 4.x - public BloomType type = BloomType.DISABLED; + public BloomType type = BloomType.UNREAL; @Configurable @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) @@ -943,9 +943,9 @@ public static class BloomOptions { public float strength = 1.5f; @Configurable - @Configurable.Comment({ "Blur Step (bloom range)", "Default: 1" }) + @Configurable.Comment({ "Blur Sample Step (bloom range)", "Default: 1.0" }) @Configurable.DecimalRange(min = 0) - public float step = 1.0f; + public float blurSampleStep = 1.0f; } public static class RendererOptions { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java index efa2d04ac4b..8e419f9cf51 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java @@ -26,8 +26,7 @@ public class ModelBlockRendererMixin { @Unique - private static final ThreadLocal> gtceu$currentRenderType = ThreadLocal - .withInitial(ScopedValue.Object::new); + private static final ScopedValue.Object gtceu$currentRenderType = new ScopedValue.Object<>(); @WrapMethod(method = { "tesselateWithAO(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZLnet/minecraft/util/RandomSource;JILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", @@ -38,12 +37,25 @@ public class ModelBlockRendererMixin { RandomSource random, long seed, int packedOverlay, ModelData modelData, RenderType renderType, Operation original) { - try (var $ = gtceu$currentRenderType.get().with(renderType)) { + try (var $ = gtceu$currentRenderType.with(renderType)) { original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, modelData, renderType); } } + // also capture renderModel(), which is used for dynamic block model rendering among other things + @WrapMethod(method = "renderModel(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/client/resources/model/BakedModel;FFFIILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", + remap = false) + private void gtceu$copyBloomQuads$1(PoseStack.Pose pose, VertexConsumer consumer, BlockState state, + BakedModel model, float red, float green, float blue, + int packedLight, int packedOverlay, ModelData modelData, RenderType renderType, + Operation original) { + try (var $ = gtceu$currentRenderType.with(renderType)) { + original.call(pose, consumer, state, model, red, green, blue, packedLight, packedOverlay, + modelData, renderType); + } + } + // The arguments don't have locals, so there's no good way to capture them except a @WarpWith(Condition) injector @WrapOperation(method = "putQuadData", at = @At(value = "INVOKE", @@ -56,7 +68,7 @@ public class ModelBlockRendererMixin { if (!BloomShaderManager.isBloomActive()) return; - RenderType renderType = gtceu$currentRenderType.get().getValue(); + RenderType renderType = gtceu$currentRenderType.getValue(); BloomRenderer.copyBloomQuad(quad, lightmap, renderType, bloomVertexConsumer -> { original.call(bloomVertexConsumer, pose, quad, brightness, red, green, blue, alpha, lightmap, overlay, readAlpha); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainAccessor.java deleted file mode 100644 index 044f5afc58d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; - -import net.minecraft.client.renderer.PostChain; -import net.minecraft.client.renderer.PostPass; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(PostChain.class) -public interface PostChainAccessor { - - @Accessor - List getPasses(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/SectionCompilerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/SectionCompilerMixin.java index 051ac8c2ddd..669e54d72d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/SectionCompilerMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/SectionCompilerMixin.java @@ -50,8 +50,8 @@ protected abstract BufferBuilder getOrBeginLayer(Map return BloomRenderer.SafeMode.getOrStartBloomBuffer(sectionPos); } }; - // intentionally no try-with-resource statement; closed in 'gtceu$clearBloomContextData' - BloomRenderer.bloomChunkContext().get().with(provider); + // intentionally no 'try'-with-resources statement; closed in 'gtceu$clearBloomContextData' + BloomRenderer.bloomChunkContext().with(provider); } @Inject(method = "compile(Lnet/minecraft/core/SectionPos;Lnet/minecraft/client/renderer/chunk/RenderChunkRegion;Lcom/mojang/blaze3d/vertex/VertexSorting;Lnet/minecraft/client/renderer/SectionBufferBuilderPack;Ljava/util/List;)Lnet/minecraft/client/renderer/chunk/SectionCompiler$Results;", @@ -62,10 +62,6 @@ protected abstract BufferBuilder getOrBeginLayer(Map CallbackInfoReturnable cir) { if (!BloomShaderManager.isBloomActive()) return; - if (BloomRenderer.SafeMode.enabled()) { - BloomRenderer.SafeMode.bakeBloomChunkBuffers(sectionPos, vertexSorting); - } - - BloomRenderer.bloomChunkContext().get().close(); + BloomRenderer.bloomChunkContext().close(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java index 87d66309793..79bc49a8b86 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java @@ -1,83 +1,56 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; import org.embeddedt.embeddium.api.render.chunk.BlockRenderContext; -import org.embeddedt.embeddium.impl.model.color.ColorProvider; -import org.embeddedt.embeddium.impl.model.light.LightPipeline; import org.embeddedt.embeddium.impl.model.light.data.QuadLightData; import org.embeddedt.embeddium.impl.model.quad.BakedQuadView; +import org.embeddedt.embeddium.impl.model.quad.properties.ModelQuadFacing; import org.embeddedt.embeddium.impl.render.chunk.compile.ChunkBuildContext; import org.embeddedt.embeddium.impl.render.chunk.compile.GlobalChunkBuildContext; import org.embeddedt.embeddium.impl.render.chunk.compile.buffers.ChunkModelBuilder; import org.embeddedt.embeddium.impl.render.chunk.compile.pipeline.BlockRenderer; import org.embeddedt.embeddium.impl.render.chunk.terrain.material.Material; +import org.embeddedt.embeddium.impl.render.chunk.vertex.builder.ChunkMeshBufferBuilder; +import org.embeddedt.embeddium.impl.render.chunk.vertex.format.ChunkVertexEncoder; 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; -import java.util.List; - @Mixin(value = BlockRenderer.class, remap = false) public abstract class BlockRendererMixin { - @Shadow - protected abstract void writeGeometry(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, - Material material, BakedQuadView quad, int[] colors, QuadLightData light); - - @Inject(method = "renderQuadList", + @Inject(method = "writeGeometry", at = @At(value = "INVOKE", - target = "Lorg/embeddedt/embeddium/impl/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lorg/embeddedt/embeddium/api/render/chunk/BlockRenderContext;Lorg/embeddedt/embeddium/impl/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lorg/embeddedt/embeddium/impl/render/chunk/terrain/material/Material;Lorg/embeddedt/embeddium/impl/model/quad/BakedQuadView;[ILorg/embeddedt/embeddium/impl/model/light/data/QuadLightData;)V", + target = "Lorg/embeddedt/embeddium/impl/render/chunk/vertex/builder/ChunkMeshBufferBuilder;push([Lorg/embeddedt/embeddium/impl/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;Lorg/embeddedt/embeddium/impl/render/chunk/terrain/material/Material;)V", shift = At.Shift.AFTER)) - private void gtceu$copyBloomQuads(BlockRenderContext ctx, Material material, LightPipeline lighter, - ColorProvider colorizer, Vec3 offset, ChunkModelBuilder builder, - List quads, Direction cullFace, CallbackInfo ci, - @Local(name = "quad") BakedQuadView quad, - @Local(name = "vertexColors") int[] vertexColors, - @Local(name = "lightData") QuadLightData lightData, - @Share("bloomBuilder") LocalRef bloomBuilderRef) { + private void gtceu$copyBloomQuads(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, Material material, + BakedQuadView quad, int[] colors, QuadLightData light, + CallbackInfo ci, + @Local(name = "vertices") ChunkVertexEncoder.Vertex[] vertices, + @Local(name = "normalFace") ModelQuadFacing normalFace) { + if (!BloomShaderManager.isBloomActive() || ctx.renderLayer() == GTRenderTypes.bloom()) { + return; + } ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); - if (BloomShaderManager.isBloomActive() && chunkContext != null && - TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { - var bloomBuilder = chunkContext.buffers.get(GTEmbeddiumCompat.BLOOM_RENDER_PASS); - bloomBuilderRef.set(bloomBuilder); - - // call the same method again, this time with the bloom chunk model builder - this.writeGeometry(ctx, bloomBuilder, offset, GTEmbeddiumCompat.BLOOM_MATERIAL, quad, vertexColors, - lightData); - } else { - bloomBuilderRef.set(null); + if (chunkContext == null) { + return; } - } - @Inject(method = "renderQuadList", - at = @At(value = "INVOKE", - target = "Lorg/embeddedt/embeddium/impl/render/chunk/compile/buffers/ChunkModelBuilder;addSprite(Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;)V", - shift = At.Shift.AFTER)) - private void gtceu$copyBloomSpriteAdds(BlockRenderContext ctx, Material material, LightPipeline lighter, - ColorProvider colorizer, Vec3 offset, ChunkModelBuilder builder, - List quads, Direction cullFace, - CallbackInfo ci, - @Local(name = "sprite") TextureAtlasSprite sprite, - @Share("bloomBuilder") LocalRef bloomBuilderRef) { - // set by the above inject; value is only non-null when all appropriate conditions/requirements apply. - // thus no need to check them here. - var bloomBuilder = bloomBuilderRef.get(); - if (bloomBuilder != null) { - bloomBuilder.addSprite(sprite); + if (TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { + var bloomBuilder = chunkContext.buffers.get(GTEmbeddiumCompat.getBloomRenderPass()); + + // call the same method again, this time with the bloom chunk model builder + ChunkMeshBufferBuilder vertexBuffer = bloomBuilder.getVertexBuffer(normalFace); + vertexBuffer.push(vertices, GTEmbeddiumCompat.getBloomMaterial()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java index b2ccb441aff..4b18245658a 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java @@ -22,7 +22,7 @@ public class DefaultMaterialsMixin { if (!BloomShaderManager.isBloomAvailable()) return; if (renderType == GTRenderTypes.bloom()) { - cir.setReturnValue(GTEmbeddiumCompat.BLOOM_MATERIAL); + cir.setReturnValue(GTEmbeddiumCompat.getBloomMaterial()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java index d258d41c1ae..7cdca88f920 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java @@ -22,6 +22,6 @@ public class DefaultTerrainRenderPassesMixin { // don't bother checking if bloom can be loaded here; Embeddium won't load with OptiFine installed and shaders // aren't loaded when this class is loaded. // This mixin is also only applied if bloom safe mode is disabled. - ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.BLOOM_RENDER_PASS); + ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.getBloomRenderPass()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/EmbeddiumWorldRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/EmbeddiumWorldRendererMixin.java index 68240de2ab4..cc1a6e9d6cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/EmbeddiumWorldRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/EmbeddiumWorldRendererMixin.java @@ -30,7 +30,7 @@ public class EmbeddiumWorldRendererMixin { if (!BloomShaderManager.isBloomActive()) return; if (renderLayer == GTRenderTypes.bloom()) { - this.renderSectionManager.renderLayer(matrices, GTEmbeddiumCompat.BLOOM_RENDER_PASS, x, y, z); + this.renderSectionManager.renderLayer(matrices, GTEmbeddiumCompat.getBloomRenderPass(), x, y, z); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/BlockRendererMixin.java index 25901270fe9..3a9d3655a60 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/BlockRendererMixin.java @@ -1,19 +1,19 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.sodium; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.sodium.GTSodiumCompat; +import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFacing; import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; -import net.caffeinemc.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import net.caffeinemc.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; +import net.caffeinemc.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder; +import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; import net.caffeinemc.mods.sodium.client.render.frapi.mesh.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.frapi.render.AbstractBlockRenderContext; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -23,44 +23,26 @@ @Mixin(value = BlockRenderer.class, remap = false) public abstract class BlockRendererMixin extends AbstractBlockRenderContext { - @Shadow - protected abstract void bufferQuad(MutableQuadViewImpl quad, float[] brightnesses, Material material); - @Shadow private ChunkBuildBuffers buffers; - @Inject(method = "processQuad", + @Inject(method = "bufferQuad", at = @At(value = "INVOKE", - target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;bufferQuad(Lnet/caffeinemc/mods/sodium/client/render/frapi/mesh/MutableQuadViewImpl;[FLnet/caffeinemc/mods/sodium/client/render/chunk/terrain/material/Material;)V", + target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/builder/ChunkMeshBufferBuilder;push([Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;I)V", shift = At.Shift.AFTER)) - private void gtceu$copyBloomQuads(MutableQuadViewImpl quad, + private void gtceu$copyBloomQuads(MutableQuadViewImpl quad, float[] brightnesses, Material material, CallbackInfo ci, - @Local(name = "emissive") boolean emissive, - @Share("bloomBuilder") LocalRef bloomBuilderRef) { - if (BloomShaderManager.isBloomActive() && GTSodiumCompat.quadHasBloom(quad, this.quadLightData.lm, emissive)) { - var bloomBuilder = this.buffers.get(GTSodiumCompat.BLOOM_RENDER_PASS); - bloomBuilderRef.set(bloomBuilder); - - // call the same method again, this time with the bloom chunk model builder - this.bufferQuad(quad, this.quadLightData.br, GTSodiumCompat.BLOOM_MATERIAL); - } else { - bloomBuilderRef.set(null); + @Local(name = "vertices") ChunkVertexEncoder.Vertex[] vertices, + @Local(name = "normalFace") ModelQuadFacing normalFace) { + if (!BloomShaderManager.isBloomActive() || this.type == GTRenderTypes.bloom()) { + return; } - } + if (GTSodiumCompat.quadHasBloom(quad, this.quadLightData.lm)) { + var bloomBuilder = this.buffers.get(GTSodiumCompat.getBloomRenderPass()); - @Inject(method = "bufferQuad", - at = @At(value = "INVOKE", - target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;addSprite(Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;)V", - shift = At.Shift.AFTER)) - private void gtceu$copyBloomSpriteAdds(MutableQuadViewImpl quad, float[] brightnesses, Material material, - CallbackInfo ci, - @Local(name = "atlasSprite") TextureAtlasSprite atlasSprite, - @Share("bloomBuilder") LocalRef bloomBuilderRef) { - // set by the above inject; value is only non-null when all appropriate conditions/requirements apply. - // thus no need to check them here. - ChunkModelBuilder bloomBuilder = bloomBuilderRef.get(); - if (bloomBuilder != null) { - bloomBuilder.addSprite(atlasSprite); + // call the same method again, this time with the bloom chunk model builder + ChunkMeshBufferBuilder vertexBuffer = bloomBuilder.getVertexBuffer(normalFace); + vertexBuffer.push(vertices, GTSodiumCompat.getBloomMaterial().bits()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultMaterialsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultMaterialsMixin.java index 9d4e8ab42af..fd96517e1dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultMaterialsMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultMaterialsMixin.java @@ -17,12 +17,12 @@ public class DefaultMaterialsMixin { @Inject(method = "forRenderLayer", at = @At(value = "HEAD"), cancellable = true) - private static void gtceu$fixBloomLayerError(RenderType renderType, + private static void gtceu$fixBloomLayerError(RenderType layer, CallbackInfoReturnable cir) { if (!BloomShaderManager.isBloomAvailable()) return; - if (renderType == GTRenderTypes.bloom()) { - cir.setReturnValue(GTSodiumCompat.BLOOM_MATERIAL); + if (layer == GTRenderTypes.bloom()) { + cir.setReturnValue(GTSodiumCompat.getBloomMaterial()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultTerrainRenderPassesMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultTerrainRenderPassesMixin.java index 23a8dee58ed..183ddd7ddc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultTerrainRenderPassesMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/DefaultTerrainRenderPassesMixin.java @@ -20,9 +20,9 @@ public class DefaultTerrainRenderPassesMixin { public static TerrainRenderPass[] ALL; static { - // don't bother checking if bloom can be loaded here; Embeddium won't load with OptiFine installed and shaders + // don't bother checking if bloom can be loaded here; Sodium won't load with OptiFine installed and shaders // aren't loaded when this class is loaded. // This mixin is also only applied if bloom safe mode is disabled. - ALL = ArrayUtils.add(ALL, GTSodiumCompat.BLOOM_RENDER_PASS); + ALL = ArrayUtils.add(ALL, GTSodiumCompat.getBloomRenderPass()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/SodiumWorldRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/SodiumWorldRendererMixin.java index 5c427831532..6dfb6240e78 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/SodiumWorldRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/sodium/SodiumWorldRendererMixin.java @@ -28,7 +28,7 @@ public class SodiumWorldRendererMixin { if (!BloomShaderManager.isBloomActive()) return; if (renderLayer == GTRenderTypes.bloom()) { - this.renderSectionManager.renderLayer(matrices, GTSodiumCompat.BLOOM_RENDER_PASS, x, y, z); + this.renderSectionManager.renderLayer(matrices, GTSodiumCompat.getBloomRenderPass(), x, y, z); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java index 4528f792ed3..b68c4c69966 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java @@ -13,7 +13,6 @@ import com.llamalad7.mixinextras.sugar.ref.LocalRef; import com.mojang.blaze3d.vertex.VertexConsumer; import org.embeddedt.embeddium.api.render.chunk.BlockRenderContext; -import org.embeddedt.embeddium.api.util.ColorARGB; import org.embeddedt.embeddium.api.util.NormI8; import org.embeddedt.embeddium.impl.model.light.data.QuadLightData; import org.embeddedt.embeddium.impl.model.quad.BakedQuadView; @@ -59,7 +58,7 @@ public class BlockRendererMixin { Material material, BakedQuadView quad, int[] colors, QuadLightData light, CallbackInfo ci, @Local(name = "srcIndex") int srcIndex, - @Local(name = "out") ChunkVertexEncoder.Vertex v, + @Local(name = "out") ChunkVertexEncoder.Vertex out, @Share("bloomBuffer") LocalRef bloomBufferRef) { VertexConsumer bloomBuffer = bloomBufferRef.get(); // bloomBuffer is null if bloom isn't available or the quad's texture doesn't have bloom @@ -68,10 +67,10 @@ public class BlockRendererMixin { int normal = quad.getForgeNormal(srcIndex); if (normal == 0) normal = quad.getComputedFaceNormal(); - bloomBuffer.addVertex(v.x, v.y, v.z) - .setColor(ColorARGB.toABGR(v.color)) - .setUv(v.u, v.v) - .setLight(v.light) + bloomBuffer.addVertex(out.x, out.y, out.z) + .setColor(out.color) + .setUv(out.u, out.v) + .setLight(out.light) .setNormal(NormI8.unpackX(normal), NormI8.unpackY(normal), NormI8.unpackZ(normal)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/sodium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/sodium/BlockRendererMixin.java index 3c4294fb9a2..807e2521b8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/sodium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/sodium/BlockRendererMixin.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.integration.sodium.GTSodiumCompat; -import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; import net.caffeinemc.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; @@ -24,23 +23,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; /** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium.BlockRendererMixin} + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.sodium.BlockRendererMixin} * - * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium.BlockRendererMixin + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.sodium.BlockRendererMixin */ @Mixin(value = BlockRenderer.class, remap = false) public abstract class BlockRendererMixin extends AbstractBlockRenderContext { - @Inject(method = "processQuad", - at = @At(value = "INVOKE", - target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;shadeQuad(Lnet/caffeinemc/mods/sodium/client/render/frapi/mesh/MutableQuadViewImpl;Lnet/caffeinemc/mods/sodium/client/model/light/LightMode;ZLnet/fabricmc/fabric/api/renderer/v1/material/ShadeMode;)V", - shift = At.Shift.AFTER)) - private void gtceu$copyBloomQuads$initLocals(MutableQuadViewImpl quad, + @Inject(method = "bufferQuad", at = @At(value = "HEAD")) + private void gtceu$copyBloomQuads$initLocals(MutableQuadViewImpl quad, float[] brightnesses, Material material, CallbackInfo ci, - @Local(name = "emissive") boolean emissive, @Share("bloomBuffer") LocalRef bloomBufferRef) { // Check if quad is full brightness OR we have bloom enabled for the quad - if (BloomShaderManager.isBloomActive() && GTSodiumCompat.quadHasBloom(quad, this.quadLightData.lm, emissive)) { + if (BloomShaderManager.isBloomActive() && GTSodiumCompat.quadHasBloom(quad, this.quadLightData.lm)) { SectionPos sectionPos = SectionPos.of(this.pos); bloomBufferRef.set(BloomRenderer.SafeMode.getOrStartBloomBuffer(sectionPos)); } else { @@ -65,7 +60,7 @@ public abstract class BlockRendererMixin extends AbstractBlockRenderContext { int normal = quad.getAccurateNormal(srcIndex); bloomBuffer.addVertex(out.x, out.y, out.z) - .setColor(ColorARGB.toABGR(out.color)) + .setColor(out.color) .setUv(out.u, out.v) .setLight(out.light) .setNormal(NormI8.unpackX(normal), NormI8.unpackY(normal), NormI8.unpackZ(normal)); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java index 86ab7c6608e..77a1b2f2726 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -2,12 +2,16 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import lombok.Getter; import org.embeddedt.embeddium.impl.render.chunk.terrain.TerrainRenderPass; import org.embeddedt.embeddium.impl.render.chunk.terrain.material.Material; import org.embeddedt.embeddium.impl.render.chunk.terrain.material.parameters.AlphaCutoffParameter; public class GTEmbeddiumCompat { - public static final TerrainRenderPass BLOOM_RENDER_PASS = new TerrainRenderPass(GTRenderTypes.bloom(), false, true); - public static final Material BLOOM_MATERIAL = new Material(BLOOM_RENDER_PASS, AlphaCutoffParameter.ZERO, true); + @Getter(lazy = true) + private static final TerrainRenderPass bloomRenderPass = new TerrainRenderPass(GTRenderTypes.bloom(), false, true); + @Getter(lazy = true) + private static final Material bloomMaterial = new Material(getBloomRenderPass(), AlphaCutoffParameter.ONE_TENTH, + true); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/sodium/GTSodiumCompat.java b/src/main/java/com/gregtechceu/gtceu/integration/sodium/GTSodiumCompat.java index d1fdd39b5c1..2d1fa16108d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/sodium/GTSodiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/sodium/GTSodiumCompat.java @@ -8,18 +8,24 @@ import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; +import net.caffeinemc.mods.sodium.client.render.frapi.mesh.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.texture.SpriteFinderCache; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import lombok.Getter; + public class GTSodiumCompat { - public static final TerrainRenderPass BLOOM_RENDER_PASS = new TerrainRenderPass(GTRenderTypes.bloom(), false, true); - public static final Material BLOOM_MATERIAL = new Material(BLOOM_RENDER_PASS, AlphaCutoffParameter.ZERO, true); + @Getter(lazy = true) + private static final TerrainRenderPass bloomRenderPass = new TerrainRenderPass(GTRenderTypes.bloom(), false, true); + @Getter(lazy = true) + private static final Material bloomMaterial = new Material(getBloomRenderPass(), AlphaCutoffParameter.ONE_TENTH, + true); - public static boolean quadHasBloom(QuadView quad, int[] ambientPackedLights, boolean emissive) { - TextureAtlasSprite sprite = SpriteFinderCache.forBlockAtlas().find(quad); + public static boolean quadHasBloom(MutableQuadViewImpl quad, int[] ambientPackedLights) { + TextureAtlasSprite sprite = quad.sprite(SpriteFinderCache.forBlockAtlas()); var metadata = TextureMetadataHelper.getMetadata(sprite); if (metadata.isPresent()) { TriState bloomValue = metadata.get().bloom(); @@ -31,7 +37,7 @@ public static boolean quadHasBloom(QuadView quad, int[] ambientPackedLights, boo } if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom) { - return emissive || isEmissive(quad, ambientPackedLights); + return isEmissive(quad, ambientPackedLights); } return false; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java b/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java index 7a8c4ee75d7..791e4604c79 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.utils; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.Nullable; /** @@ -14,50 +12,65 @@ public abstract class ScopedValue implements AutoCloseable { * * @param The type of the object. */ - @RequiredArgsConstructor public static final class Object extends ScopedValue { - private final @Nullable T initialValue; - - /** - * Current value in this scope - */ - @Getter - private @Nullable T value; + private final ThreadLocal<@Nullable T> value; public Object() { this(null); } + public Object(@Nullable T initialValue) { + this.value = ThreadLocal.withInitial(() -> initialValue); + } + + /** + * {@return Current value in this scope} + */ + public @Nullable T getValue() { + return this.value.get(); + } + /** * Set {@code current} to {@code value} within this scope. * * @return this */ public Object with(T value) { - this.value = value; + this.value.set(value); return this; } @Override public void close() { - this.value = this.initialValue; + this.value.remove(); } } /** * Scoped boolean value. Resets to {@link #initialValue} when exiting scope. */ - @RequiredArgsConstructor public static final class Boolean extends ScopedValue { private final boolean initialValue; + private final ThreadLocal value; + + public Boolean() { + this(false); + } + + public Boolean(boolean initialValue) { + this.initialValue = initialValue; + this.value = ThreadLocal.withInitial(() -> this.initialValue); + } + /** - * Current value in this scope + * {@return Current value in this scope} */ - @Getter - private boolean active; + public boolean isActive() { + return this.value.get(); + } /** * Set {@code current} to {@code value} within this scope. @@ -65,7 +78,7 @@ public static final class Boolean extends ScopedValue { * @return this */ public Boolean with(boolean value) { - this.active = value; + this.value.set(value); return this; } @@ -74,13 +87,13 @@ public Boolean with(boolean value) { * * @return this */ - public Boolean active() { + public Boolean setActive() { return with(!this.initialValue); } @Override public void close() { - this.active = this.initialValue; + this.value.remove(); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java index 64baf26b5a7..2a387665145 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java @@ -29,6 +29,9 @@ public static CompletableFuture regenerateResourcesOnReload(Supplier new ProcessBuilder("cmd.exe", "/c", "gradlew.bat", ":processResources"); default -> new ProcessBuilder("./gradlew", ":processResources"); @@ -43,12 +46,12 @@ public static CompletableFuture regenerateResourcesOnReload(Supplier Minecraft.getInstance().player - .sendSystemMessage(Component.translatable("gtceu.debug.resource_rebuild.done", + .sendSystemMessage(Component.translatableEscape("gtceu.debug.resource_rebuild.done", Duration.between(start, Instant.now())))) .thenCompose($ -> reloadFuture.get()); } diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh index 851068d05d5..3fe46019e21 100644 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh @@ -17,5 +17,8 @@ out vec4 fragColor; void main() { vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; + if (color.a < 0.1) { + discard; + } fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); } diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.fsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.fsh index 82ee596b2cc..a1dc7114b28 100644 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.fsh @@ -18,11 +18,10 @@ in vec2 texCoord0; out vec4 fragColor; void main() { - vec4 color = texture(Sampler0, texCoord0); + vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; if (color.a < 0.1) { discard; } - color *= vertexColor * ColorModulator; color.rgb = mix(overlayColor.rgb, color.rgb, overlayColor.a); color *= lightMapColor; fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); diff --git a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json index 1120226e8f3..c8438a6b9be 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -2,10 +2,10 @@ "targets": [ "final", "filter", - { "name": "swap_a2", "bilinear": true }, - { "name": "swap_a4", "bilinear": true }, - { "name": "swap_1", "bilinear": true }, - { "name": "swap_2", "bilinear": true } + "swap_a2", + "swap_a4", + "swap_1", + "swap_2" ], "passes": [ { @@ -25,22 +25,26 @@ { "name": "gtceu:down_sampling", "intarget": "swap_a2", - "outtarget": "swap_a4" + "outtarget": "swap_a4", + "use_linear_filter": true }, { "name": "gtceu:down_sampling", "intarget": "swap_a4", - "outtarget": "swap_1" + "outtarget": "swap_1", + "use_linear_filter": true }, { "name": "gtceu:down_sampling", "intarget": "swap_1", - "outtarget": "swap_2" + "outtarget": "swap_2", + "use_linear_filter": true }, { "name": "gtceu:up_sampling", "intarget": "swap_2", "outtarget": "swap_1", + "use_linear_filter": true, "auxtargets": [ { "id": "swap_a4", "name": "DownTexture" } ] @@ -49,6 +53,7 @@ "name": "gtceu:up_sampling", "intarget": "swap_1", "outtarget": "swap_2", + "use_linear_filter": true, "auxtargets": [ { "id": "swap_a2", "name": "DownTexture" } ] @@ -57,6 +62,7 @@ "name": "gtceu:up_sampling", "intarget": "swap_2", "outtarget": "swap_1", + "use_linear_filter": true, "auxtargets": [ { "id": "filter", "name": "DownTexture" } ] @@ -65,6 +71,7 @@ "name": "gtceu:unity_composite", "intarget": "swap_1", "outtarget": "final", + "use_linear_filter": true, "auxtargets": [ { "id": "filter", "name": "HighlightSampler" }, { "id": "minecraft:main", "name": "MainSampler" } diff --git a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json index b383aad0e33..121174e4821 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -2,11 +2,11 @@ "targets": [ "final", "filter", - { "name": "swap_b0", "bilinear": true }, - { "name": "swap_b1", "bilinear": true }, - { "name": "swap_b2", "bilinear": true }, - { "name": "swap_b3", "bilinear": true }, - { "name": "swap_b4", "bilinear": true } + "swap_b0", + "swap_b1", + "swap_b2", + "swap_b3", + "swap_b4" ], "passes": [ { @@ -22,126 +22,87 @@ "name": "gtceu:blur", "intarget": "filter", "outtarget": "swap_b0", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] - }, - { - "name": "Radius", - "values": [3] - } + { "name": "BlurDir", "values": [ 1.0, 0.0 ] }, + { "name": "Radius", "values": [3] } ] }, { "name": "gtceu:blur", "intarget": "swap_b0", "outtarget": "swap_b1", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] - }, - { - "name": "Radius", - "values": [3] - } + { "name": "BlurDir", "values": [ 0.0, 1.0 ] }, + { "name": "Radius", "values": [3] } ] }, { "name": "gtceu:blur", "intarget": "swap_b1", "outtarget": "swap_b0", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] - }, - { - "name": "Radius", - "values": [5] - } + { "name": "BlurDir", "values": [ 1.0, 0.0 ] }, + { "name": "Radius", "values": [5] } ] }, { "name": "gtceu:blur", "intarget": "swap_b0", "outtarget": "swap_b2", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] - }, - { - "name": "Radius", - "values": [5] - } + { "name": "BlurDir", "values": [ 0.0, 1.0 ] }, + { "name": "Radius", "values": [5] } ] }, { "name": "gtceu:blur", "intarget": "swap_b2", "outtarget": "swap_b0", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] - }, - { - "name": "Radius", - "values": [7] - } + { "name": "BlurDir", "values": [ 1.0, 0.0 ] }, + { "name": "Radius", "values": [7] } ] }, { "name": "gtceu:blur", "intarget": "swap_b0", "outtarget": "swap_b3", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] - }, - { - "name": "Radius", - "values": [7] - } + { "name": "BlurDir", "values": [ 0.0, 1.0 ] }, + { "name": "Radius", "values": [7] } ] }, { "name": "gtceu:blur", "intarget": "swap_b3", "outtarget": "swap_b0", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] - }, - { - "name": "Radius", - "values": [9] - } + { "name": "BlurDir", "values": [ 1.0, 0.0 ] }, + { "name": "Radius", "values": [9] } ] }, { "name": "gtceu:blur", "intarget": "swap_b0", "outtarget": "swap_b4", + "use_linear_filter": true, "uniforms": [ - { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] - }, - { - "name": "Radius", - "values": [9] - } + { "name": "BlurDir", "values": [ 0.0, 1.0 ] }, + { "name": "Radius", "values": [9] } ] }, { "name": "gtceu:unreal_composite", "intarget": "minecraft:main", "outtarget": "final", + "use_linear_filter": true, "auxtargets": [ { "id": "filter", "name": "HighlightSampler" }, { "id": "swap_b1", "name": "BlurTexture1" }, diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.fsh b/src/main/resources/assets/gtceu/shaders/program/blur.fsh index 6ab6c8ae16e..1c87e081bec 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/blur.fsh @@ -1,21 +1,20 @@ #version 150 #define PI 3.141592653 +const float INV_SQRT_2PI = 1 / sqrt(2 * PI); uniform sampler2D DiffuseSampler; -uniform vec2 BlurDir; uniform float Radius; -uniform vec2 OutSize; in vec2 texCoord; +in vec2 sampleStep; out vec4 fragColor; -const float INV_SQRT_2PI = 1 / sqrt(2 * PI); // gaussian probability density function float gaussianPdf(float x, float sigma) { - // this is the same as (1 / sqrt(2 * PI * sigma)) * exp(-(x^2) / (2 * sigma * sigma)) + // this is the same as (1 / sqrt(2 * PI * sigma^2)) * exp(-(x^2) / (2 * sigma^2)) // but it's technically more efficient, since it only uses division once // and the inverse square root is stored as a constant float invSigma = 1 / sigma; @@ -23,14 +22,12 @@ float gaussianPdf(float x, float sigma) { } void main() { - vec2 invSize = 1.0 / OutSize; - float weightSum = gaussianPdf(0.0, Radius); vec4 diffuseSum = texture(DiffuseSampler, texCoord) * weightSum; for(float x = 1; x < Radius; x += 1.0) { float w = gaussianPdf(x, Radius); - vec2 uvOffset = BlurDir * invSize * x; + vec2 uvOffset = sampleStep * x; // sample both +x and -x offsets vec4 sample1 = texture(DiffuseSampler, texCoord + uvOffset); diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.json b/src/main/resources/assets/gtceu/shaders/program/blur.json index 8a1ed353426..09a69c82750 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.json +++ b/src/main/resources/assets/gtceu/shaders/program/blur.json @@ -6,16 +6,18 @@ "srcalpha": "zero", "dstalpha": "one" }, - "vertex": "blit", + "vertex": "gtceu:blur", "fragment": "gtceu:blur", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" } ], "uniforms": [ - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BlurDir", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "Radius", "type": "float", "count": 1, "values": [ 5 ] } + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "InSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BlurDir", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Radius", "type": "float", "count": 1, "values": [ 5.0 ] }, + { "name": "SampleStep", "type": "float", "count": 1, "values": [ 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.vsh b/src/main/resources/assets/gtceu/shaders/program/blur.vsh new file mode 100644 index 00000000000..1f862352cef --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/blur.vsh @@ -0,0 +1,22 @@ +#version 150 + +in vec4 Position; + +uniform mat4 ProjMat; +uniform vec2 InSize; +uniform vec2 OutSize; +uniform vec2 BlurDir; +uniform float SampleStep; + +out vec2 texCoord; +out vec2 sampleStep; + +void main() { + vec4 outPos = ProjMat * vec4(Position.xy, 0.0, 1.0); + gl_Position = vec4(outPos.xy, 0.2, 1.0); + + vec2 oneTexel = 1.0 / InSize; + sampleStep = oneTexel * BlurDir * SampleStep; + + texCoord = Position.xy / OutSize; +} diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.fsh b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.fsh index 78b9350554f..6f044a2978d 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.fsh @@ -1,14 +1,16 @@ #version 150 +#define MAX_DEPTH_DIFFERENCE 1.0e-5 + uniform sampler2D DiffuseSampler; uniform sampler2D DiffuseDepthSampler; uniform sampler2D MainDepthSampler; // these should be #defines, but adding those dynamically doesn't exist in vanilla MC until 26.1. // GameRenderer.PROJECTION_Z_NEAR -uniform float DepthNear = 0.05; -// GameRenderer#getDepthFar; 8 chunk render distance -> 8 * 16 * 4 -uniform float DepthFar = 512.0; +uniform float DepthNear; +// GameRenderer#getDepthFar +uniform float DepthFar; in vec2 texCoord; @@ -20,13 +22,13 @@ float linearizeDepth(float depth) { } void main() { - // calculate linear depth float mainDepth = linearizeDepth(texture(MainDepthSampler, texCoord).r); float diffuseDepth = linearizeDepth(texture(DiffuseDepthSampler, texCoord).r); // clear bloom color fragment if the main sampler's depth isn't the same as the bloom sampler's depth - if (abs(mainDepth - diffuseDepth) > 1.0e-5) { + if (abs(mainDepth - diffuseDepth) > MAX_DEPTH_DIFFERENCE) { fragColor = vec4(0.0); + discard; } else { fragColor = texture(DiffuseSampler, texCoord); } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index a1bb6d015af..bb9fb8151b5 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -34,7 +34,6 @@ "client.bloom.LevelRendererMixin", "client.bloom.LightPipelineAwareModelBlockRendererMixin", "client.bloom.ModelBlockRendererMixin", - "client.bloom.PostChainAccessor", "client.bloom.QuadLighterMixin", "client.bloom.SectionCompilerMixin", "client.bloom.normal.RenderTypeMixin",