From b81ce8e67c9bff04aa3a2719f59f48355e942f4a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 2 Oct 2024 16:28:42 +0300 Subject: [PATCH 001/269] builtin bloom (complete hack, doesn't work, likely won't work with any rendering mods, TODO fix) --- dependencies.gradle | 2 +- .../resources/assets/gtceu/lang/en_ud.json | 15 + .../resources/assets/gtceu/lang/en_us.json | 15 + .../block/cupronickel_coil_block_active.json | 1 + .../models/block/hssg_coil_block_active.json | 1 + .../block/kanthal_coil_block_active.json | 1 + .../block/naquadah_coil_block_active.json | 1 + .../block/nichrome_coil_block_active.json | 1 + .../block/rtm_alloy_coil_block_active.json | 1 + .../block/trinium_coil_block_active.json | 1 + .../block/tritanium_coil_block_active.json | 1 + .../java/com/gregtechceu/gtceu/GTCEu.java | 5 + .../com/gregtechceu/gtceu/api/GTValues.java | 3 +- .../gregtechceu/gtceu/client/ClientProxy.java | 21 +- .../client/particle/GTBloomParticle.java | 22 + .../client/particle/GTOverheatParticle.java | 307 +++++++++ .../gtceu/client/particle/GTParticle.java | 118 ++++ .../client/particle/GTParticleManager.java | 222 ++++++ .../gtceu/client/renderer/GTRenderTypes.java | 15 +- .../gtceu/client/renderer/IRenderSetup.java | 21 + .../machine/FusionReactorRenderer.java | 11 +- .../gtceu/client/shader/PingPongBuffer.java | 57 ++ .../gtceu/client/shader/PostTarget.java | 12 + .../gtceu/client/shader/Shaders.java | 120 ++++ .../gtceu/client/shader/post/BloomEffect.java | 187 +++++ .../gtceu/client/shader/post/BloomType.java | 42 ++ .../gtceu/client/shader/post/BlurEffect.java | 64 ++ .../gtceu/client/util/BloomEffectUtil.java | 650 ++++++++++++++++++ .../gtceu/client/util/BloomUtils.java | 19 - .../gtceu/client/util/DepthTextureUtil.java | 171 +++++ .../gtceu/client/util/DrawUtil.java | 18 + .../client/util/EffectRenderContext.java | 88 +++ .../gtceu/client/util/IBloomEffect.java | 38 + .../gtceu/client/util/RenderBufferHelper.java | 116 ++++ .../gtceu/client/util/RenderUtil.java | 44 ++ .../common/blockentity/CableBlockEntity.java | 29 + .../gtceu/common/data/GTModels.java | 12 +- .../gtceu/config/ConfigHolder.java | 177 +++++ .../gtceu/core/mixins/LevelRendererMixin.java | 17 +- .../gtceu/core/mixins/RenderTypeAccessor.java | 12 + .../resources/META-INF/accesstransformer.cfg | 5 + .../assets/gtceu/shaders/core/black_hole.fsh | 215 ++++++ .../gtceu/shaders/core/bloom_combine.fsh | 31 + .../gtceu/shaders/core/bloom_combine.json | 21 + .../assets/gtceu/shaders/core/blur.fsh | 25 + .../assets/gtceu/shaders/core/blur.json | 18 + .../assets/gtceu/shaders/core/composite.fsh | 25 + .../assets/gtceu/shaders/core/composite.json | 22 + .../gtceu/shaders/core/down_sampling.fsh | 46 ++ .../gtceu/shaders/core/down_sampling.json | 18 + .../assets/gtceu/shaders/core/image.fsh | 9 + .../assets/gtceu/shaders/core/image.json | 16 + .../assets/gtceu/shaders/core/image.vsh | 10 + .../gtceu/shaders/core/seperable_blur.fsh | 31 + .../gtceu/shaders/core/seperable_blur.json | 20 + .../assets/gtceu/shaders/core/up_sampling.fsh | 36 + .../gtceu/shaders/core/up_sampling.json | 19 + src/main/resources/gtceu.mixins.json | 1 + 58 files changed, 3184 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomType.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/BloomUtils.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java create mode 100644 src/main/resources/assets/gtceu/shaders/core/black_hole.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/bloom_combine.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/blur.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/blur.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/composite.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/composite.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/down_sampling.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/image.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/image.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/image.vsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/seperable_blur.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/up_sampling.json diff --git a/dependencies.gradle b/dependencies.gradle index 449dd143029..5946f47e34c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -58,7 +58,7 @@ dependencies { // Shimmer modCompileOnly(forge.shimmer.forge) { transitive = false } - modCompileOnly("maven.modrinth:embeddium:0.3.19+mc1.20.1") + modCompileOnly("maven.modrinth:embeddium:0.3.31+mc1.20.1") modCompileOnly("maven.modrinth:oculus:1.20.1-1.7.0") // JAVD diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 2b901d21eae..722b4e9f57b 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2220,8 +2220,11 @@ "config.gtceu.option.allUniqueStoneTypes": "sǝdʎ⟘ǝuoʇSǝnbıu∩ןןɐ", "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", "config.gtceu.option.armorHud": "pnHɹoɯɹɐ", + "config.gtceu.option.assemblyLineParticles": "sǝןɔıʇɹɐԀǝuıꞀʎןqɯǝssɐ", + "config.gtceu.option.baseBrightness": "ssǝuʇɥbıɹᗺǝsɐq", "config.gtceu.option.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", + "config.gtceu.option.bloomStyle": "ǝןʎʇSɯooןq", "config.gtceu.option.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", "config.gtceu.option.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", "config.gtceu.option.casingsPerCraft": "ʇɟɐɹƆɹǝԀsbuısɐɔ", @@ -2240,6 +2243,7 @@ "config.gtceu.option.doesExplosionDamagesTerrain": "uıɐɹɹǝ⟘sǝbɐɯɐᗡuoısoןdxƎsǝop", "config.gtceu.option.dumpAssets": "sʇǝssⱯdɯnp", "config.gtceu.option.dumpRecipes": "sǝdıɔǝᴚdɯnp", + "config.gtceu.option.emissiveTexturesBloom": "ɯooןᗺsǝɹnʇxǝ⟘ǝʌıssıɯǝ", "config.gtceu.option.enableCleanroom": "ɯooɹuɐǝןƆǝןqɐuǝ", "config.gtceu.option.enableCompass": "ssɐdɯoƆǝןqɐuǝ", "config.gtceu.option.enableMaintenance": "ǝɔuɐuǝʇuıɐWǝןqɐuǝ", @@ -2256,6 +2260,7 @@ "config.gtceu.option.environmentalHazards": "spɹɐzɐHןɐʇuǝɯuoɹıʌuǝ", "config.gtceu.option.euToPlatformRatio": "oıʇɐᴚɯɹoɟʇɐןԀo⟘nǝ", "config.gtceu.option.flintAndSteelRequireSteel": "ןǝǝʇSǝɹınbǝᴚןǝǝʇSpuⱯʇuıןɟ", + "config.gtceu.option.fusionBloom": "ɯooןᗺuoısnɟ", "config.gtceu.option.gameplay": "ʎɐןdǝɯɐb", "config.gtceu.option.generateLowQualityGems": "sɯǝ⅁ʎʇıןɐnὉʍoꞀǝʇɐɹǝuǝb", "config.gtceu.option.ghostCircuit": "ʇınɔɹıƆʇsoɥb", @@ -2274,10 +2279,13 @@ "config.gtceu.option.harderRods": "spoᴚɹǝpɹɐɥ", "config.gtceu.option.harmlessActiveTransformers": "sɹǝɯɹoɟsuɐɹ⟘ǝʌıʇɔⱯssǝןɯɹɐɥ", "config.gtceu.option.hazardsEnabled": "pǝןqɐuƎspɹɐzɐɥ", + "config.gtceu.option.heatEffectBloom": "ɯooןᗺʇɔǝɟɟƎʇɐǝɥ", "config.gtceu.option.hideFacadesInJEI": "IƎſuIsǝpɐɔɐℲǝpıɥ", "config.gtceu.option.hideFilledCellsInJEI": "IƎſuIsןןǝƆpǝןןıℲǝpıɥ", "config.gtceu.option.hideOreProcessingDiagrams": "sɯɐɹbɐıᗡbuıssǝɔoɹԀǝɹOǝpıɥ", + "config.gtceu.option.highBrightnessThreshold": "pןoɥsǝɹɥ⟘ssǝuʇɥbıɹᗺɥbıɥ", "config.gtceu.option.highTierContent": "ʇuǝʇuoƆɹǝı⟘ɥbıɥ", + "config.gtceu.option.hookDepthTexture": "ǝɹnʇxǝ⟘ɥʇdǝᗡʞooɥ", "config.gtceu.option.hpLiquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıꞀdɥ", "config.gtceu.option.hpSolarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןoSdɥ", "config.gtceu.option.hpSolidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןoSdɥ", @@ -2291,12 +2299,14 @@ "config.gtceu.option.ldFluidPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀpınןℲpן", "config.gtceu.option.ldItemPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀɯǝʇIpן", "config.gtceu.option.liquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıן", + "config.gtceu.option.lowBrightnessThreshold": "pןoɥsǝɹɥ⟘ssǝuʇɥbıɹᗺʍoן", "config.gtceu.option.machineOwnerBreak": "ʞɐǝɹᗺɹǝuʍOǝuıɥɔɐɯ", "config.gtceu.option.machineOwnerGUI": "I∩⅁ɹǝuʍOǝuıɥɔɐɯ", "config.gtceu.option.machineSounds": "spunoSǝuıɥɔɐɯ", "config.gtceu.option.machines": "sǝuıɥɔɐɯ", "config.gtceu.option.machinesEmissiveTextures": "sǝɹnʇxǝ⟘ǝʌıssıɯƎsǝuıɥɔɐɯ", "config.gtceu.option.meHatchEnergyUsage": "ǝbɐs∩ʎbɹǝuƎɥɔʇɐHǝɯ", + "config.gtceu.option.nMips": "sdıWu", "config.gtceu.option.nanoSaber": "ɹǝqɐSouɐu", "config.gtceu.option.nanoSaberBaseDamage": "ǝbɐɯɐᗡǝsɐᗺɹǝqɐSouɐu", "config.gtceu.option.nanoSaberDamageBoost": "ʇsooᗺǝbɐɯɐᗡɹǝqɐSouɐu", @@ -2325,6 +2335,7 @@ "config.gtceu.option.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", "config.gtceu.option.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", "config.gtceu.option.sandOresFall": "ןןɐℲsǝɹOpuɐs", + "config.gtceu.option.shader": "ɹǝpɐɥs", "config.gtceu.option.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", "config.gtceu.option.smallBoilers": "sɹǝןıoᗺןןɐɯs", "config.gtceu.option.solarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןos", @@ -2334,6 +2345,8 @@ "config.gtceu.option.steelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇs", "config.gtceu.option.steelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇs", "config.gtceu.option.steelSteamMultiblocks": "sʞɔoןqıʇןnWɯɐǝʇSןǝǝʇs", + "config.gtceu.option.step": "dǝʇs", + "config.gtceu.option.strength": "ɥʇbuǝɹʇs", "config.gtceu.option.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.toolCraftingSounds": "spunoSbuıʇɟɐɹƆןooʇ", @@ -2343,6 +2356,7 @@ "config.gtceu.option.tungstensteelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇsuǝʇsbunʇ", "config.gtceu.option.universalHazards": "spɹɐzɐHןɐsɹǝʌıun", "config.gtceu.option.updateIntervals": "sןɐʌɹǝʇuIǝʇɐpdn", + "config.gtceu.option.useShader": "ɹǝpɐɥSǝsn", "config.gtceu.option.useVBO": "OᗺΛǝsn", "config.gtceu.option.voltageTierAdvImpeller": "ɹǝןןǝdɯIʌpⱯɹǝı⟘ǝbɐʇןoʌ", "config.gtceu.option.voltageTierAdvNanoSuit": "ʇınSouɐNʌpⱯɹǝı⟘ǝbɐʇןoʌ", @@ -5254,6 +5268,7 @@ "material.gtceu.einsteinium": "ɯnıuıǝʇsuıƎ", "material.gtceu.electrotine": "ǝuıʇoɹʇɔǝןƎ", "material.gtceu.electrum": "ɯnɹʇɔǝןƎ", + "material.gtceu.elementium": "ɯnıʇuǝɯǝןƎ", "material.gtceu.emerald": "pןɐɹǝɯƎ", "material.gtceu.ender_air": "ɹıⱯ ɹǝpuƎ", "material.gtceu.ender_eye": "ǝʎƎ ɹǝpuƎ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 7513de071cc..a61af1d9a95 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2220,8 +2220,11 @@ "config.gtceu.option.allUniqueStoneTypes": "allUniqueStoneTypes", "config.gtceu.option.animationTime": "animationTime", "config.gtceu.option.armorHud": "armorHud", + "config.gtceu.option.assemblyLineParticles": "assemblyLineParticles", + "config.gtceu.option.baseBrightness": "baseBrightness", "config.gtceu.option.bedrockOreDistance": "bedrockOreDistance", "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", + "config.gtceu.option.bloomStyle": "bloomStyle", "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", "config.gtceu.option.casingsPerCraft": "casingsPerCraft", @@ -2240,6 +2243,7 @@ "config.gtceu.option.doesExplosionDamagesTerrain": "doesExplosionDamagesTerrain", "config.gtceu.option.dumpAssets": "dumpAssets", "config.gtceu.option.dumpRecipes": "dumpRecipes", + "config.gtceu.option.emissiveTexturesBloom": "emissiveTexturesBloom", "config.gtceu.option.enableCleanroom": "enableCleanroom", "config.gtceu.option.enableCompass": "enableCompass", "config.gtceu.option.enableMaintenance": "enableMaintenance", @@ -2256,6 +2260,7 @@ "config.gtceu.option.environmentalHazards": "environmentalHazards", "config.gtceu.option.euToPlatformRatio": "euToPlatformRatio", "config.gtceu.option.flintAndSteelRequireSteel": "flintAndSteelRequireSteel", + "config.gtceu.option.fusionBloom": "fusionBloom", "config.gtceu.option.gameplay": "gameplay", "config.gtceu.option.generateLowQualityGems": "generateLowQualityGems", "config.gtceu.option.ghostCircuit": "ghostCircuit", @@ -2274,10 +2279,13 @@ "config.gtceu.option.harderRods": "harderRods", "config.gtceu.option.harmlessActiveTransformers": "harmlessActiveTransformers", "config.gtceu.option.hazardsEnabled": "hazardsEnabled", + "config.gtceu.option.heatEffectBloom": "heatEffectBloom", "config.gtceu.option.hideFacadesInJEI": "hideFacadesInJEI", "config.gtceu.option.hideFilledCellsInJEI": "hideFilledCellsInJEI", "config.gtceu.option.hideOreProcessingDiagrams": "hideOreProcessingDiagrams", + "config.gtceu.option.highBrightnessThreshold": "highBrightnessThreshold", "config.gtceu.option.highTierContent": "highTierContent", + "config.gtceu.option.hookDepthTexture": "hookDepthTexture", "config.gtceu.option.hpLiquidBoilerBaseOutput": "hpLiquidBoilerBaseOutput", "config.gtceu.option.hpSolarBoilerBaseOutput": "hpSolarBoilerBaseOutput", "config.gtceu.option.hpSolidBoilerBaseOutput": "hpSolidBoilerBaseOutput", @@ -2291,12 +2299,14 @@ "config.gtceu.option.ldFluidPipeMinDistance": "ldFluidPipeMinDistance", "config.gtceu.option.ldItemPipeMinDistance": "ldItemPipeMinDistance", "config.gtceu.option.liquidBoilerBaseOutput": "liquidBoilerBaseOutput", + "config.gtceu.option.lowBrightnessThreshold": "lowBrightnessThreshold", "config.gtceu.option.machineOwnerBreak": "machineOwnerBreak", "config.gtceu.option.machineOwnerGUI": "machineOwnerGUI", "config.gtceu.option.machineSounds": "machineSounds", "config.gtceu.option.machines": "machines", "config.gtceu.option.machinesEmissiveTextures": "machinesEmissiveTextures", "config.gtceu.option.meHatchEnergyUsage": "meHatchEnergyUsage", + "config.gtceu.option.nMips": "nMips", "config.gtceu.option.nanoSaber": "nanoSaber", "config.gtceu.option.nanoSaberBaseDamage": "nanoSaberBaseDamage", "config.gtceu.option.nanoSaberDamageBoost": "nanoSaberDamageBoost", @@ -2325,6 +2335,7 @@ "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", "config.gtceu.option.rubberTreeSpawnChance": "rubberTreeSpawnChance", "config.gtceu.option.sandOresFall": "sandOresFall", + "config.gtceu.option.shader": "shader", "config.gtceu.option.showDimensionTier": "showDimensionTier", "config.gtceu.option.smallBoilers": "smallBoilers", "config.gtceu.option.solarBoilerBaseOutput": "solarBoilerBaseOutput", @@ -2334,6 +2345,8 @@ "config.gtceu.option.steelBoilerHeatSpeed": "steelBoilerHeatSpeed", "config.gtceu.option.steelBoilerMaxTemperature": "steelBoilerMaxTemperature", "config.gtceu.option.steelSteamMultiblocks": "steelSteamMultiblocks", + "config.gtceu.option.step": "step", + "config.gtceu.option.strength": "strength", "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", "config.gtceu.option.toolCraftingSounds": "toolCraftingSounds", @@ -2343,6 +2356,7 @@ "config.gtceu.option.tungstensteelBoilerMaxTemperature": "tungstensteelBoilerMaxTemperature", "config.gtceu.option.universalHazards": "universalHazards", "config.gtceu.option.updateIntervals": "updateIntervals", + "config.gtceu.option.useShader": "useShader", "config.gtceu.option.useVBO": "useVBO", "config.gtceu.option.voltageTierAdvImpeller": "voltageTierAdvImpeller", "config.gtceu.option.voltageTierAdvNanoSuit": "voltageTierAdvNanoSuit", @@ -5254,6 +5268,7 @@ "material.gtceu.einsteinium": "Einsteinium", "material.gtceu.electrotine": "Electrotine", "material.gtceu.electrum": "Electrum", + "material.gtceu.elementium": "Elementium", "material.gtceu.emerald": "Emerald", "material.gtceu.ender_air": "Ender Air", "material.gtceu.ender_eye": "Ender Eye", diff --git a/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json index 7fda089ccb8..a78e9f7909f 100644 --- a/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_cupronickel", "top_all": "gtceu:block/casings/coils/machine_coil_cupronickel_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json index 41edb518870..6a221f09243 100644 --- a/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_hssg", "top_all": "gtceu:block/casings/coils/machine_coil_hssg_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json index e52f55e6460..4de0b658fcd 100644 --- a/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_kanthal", "top_all": "gtceu:block/casings/coils/machine_coil_kanthal_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json index 953c619e1ab..2cda617d69d 100644 --- a/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_naquadah", "top_all": "gtceu:block/casings/coils/machine_coil_naquadah_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json index 792d1d73024..6f676e9d050 100644 --- a/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_nichrome", "top_all": "gtceu:block/casings/coils/machine_coil_nichrome_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json index 23c85ffe103..75e25d1bf20 100644 --- a/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_rtm_alloy", "top_all": "gtceu:block/casings/coils/machine_coil_rtm_alloy_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json index 3d730a8dc4b..018e0f519f7 100644 --- a/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_trinium", "top_all": "gtceu:block/casings/coils/machine_coil_trinium_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json index c4c5f476247..9bc69bc77c8 100644 --- a/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json @@ -1,5 +1,6 @@ { "parent": "gtceu:block/cube_2_layer/all", + "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_tritanium", "top_all": "gtceu:block/casings/coils/machine_coil_tritanium_bloom" diff --git a/src/main/java/com/gregtechceu/gtceu/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index 8f3f8a66ac7..25c6ccfe15b 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -11,6 +11,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import org.slf4j.Logger; @@ -94,6 +95,10 @@ public static boolean isArgonautsLoaded() { return LDLib.isModLoaded(GTValues.MODID_ARGONAUTS); } + public static boolean isOptifineLoaded() { + return ModList.get().isLoaded(GTValues.MODID_OPTIFINE); + } + @Deprecated(forRemoval = true, since = "1.0.21") public static boolean isHighTier() { return GTCEuAPI.isHighTier(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index 646b2129218..78a2657f373 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -127,7 +127,8 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { MODID_SHIMMER = "shimmer", MODID_JAVD = "javd", MODID_FTBTEAMS = "ftbteams", - MODID_ARGONAUTS = "argonauts"; + MODID_ARGONAUTS = "argonauts", + MODID_OPTIFINE = "optifine"; /** * Spray painting compat modids diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 336acbcfc7a..1ce47d712ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.client.particle.HazardParticle; import com.gregtechceu.gtceu.client.renderer.entity.GTBoatRenderer; import com.gregtechceu.gtceu.client.renderer.entity.GTExplosiveRenderer; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTEntityTypes; @@ -22,6 +23,8 @@ import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.HangingSignRenderer; import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer; @@ -29,10 +32,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; -import net.minecraftforge.client.event.RegisterKeyMappingsEvent; -import net.minecraftforge.client.event.RegisterParticleProvidersEvent; +import net.minecraftforge.client.event.*; import net.minecraftforge.eventbus.api.SubscribeEvent; import com.google.common.collect.BiMap; @@ -59,6 +59,7 @@ public static void init() { RecipeComponent.registerRecipeViewCreator(new GTRecipeViewCreator()); CompassManager.INSTANCE.registerUIConfig(GTCEu.MOD_ID, new GTCompassUIConfig()); CompassManager.INSTANCE.registerAction("multiblock", MultiblockAction::new); + BloomEffectUtil.init(); } @SubscribeEvent @@ -72,10 +73,13 @@ public void onRegisterEntityRenderers(EntityRenderersEvent.RegisterRenderers eve event.registerEntityRenderer(GTEntityTypes.BOAT.get(), c -> new GTBoatRenderer(c, false)); event.registerEntityRenderer(GTEntityTypes.CHEST_BOAT.get(), c -> new GTBoatRenderer(c, true)); + } + @SubscribeEvent + public void onRegisterEntityLayerDefinitions(EntityRenderersEvent.RegisterLayerDefinitions event) { for (var type : GTBoat.BoatType.values()) { - ForgeHooksClient.registerLayerDefinition(GTBoatRenderer.getBoatModelName(type), BoatModel::createBodyModel); - ForgeHooksClient.registerLayerDefinition(GTBoatRenderer.getChestBoatModelName(type), + event.registerLayerDefinition(GTBoatRenderer.getBoatModelName(type), BoatModel::createBodyModel); + event.registerLayerDefinition(GTBoatRenderer.getChestBoatModelName(type), ChestBoatModel::createBodyModel); } } @@ -94,4 +98,9 @@ public void onRegisterGuiOverlays(RegisterGuiOverlaysEvent event) { public void onRegisterParticleProviders(RegisterParticleProvidersEvent event) { event.registerSpriteSet(GTParticleTypes.HAZARD_PARTICLE.get(), HazardParticle.Provider::new); } + + @SubscribeEvent + public void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { + event.register("bloom", BloomEffectUtil.getBloomLayer(), Sheets.cutoutBlockSheet()); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java new file mode 100644 index 00000000000..4e04931b080 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java @@ -0,0 +1,22 @@ +package com.gregtechceu.gtceu.client.particle; + +import com.gregtechceu.gtceu.client.renderer.IRenderSetup; +import com.gregtechceu.gtceu.client.shader.post.BloomType; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.util.IBloomEffect; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class GTBloomParticle extends GTParticle implements IBloomEffect { + + public GTBloomParticle(double posX, double posY, double posZ) { + super(posX, posY, posZ); + BloomEffectUtil.registerBloomRender(getBloomRenderSetup(), getBloomType(), this, this); + } + + @Nullable + protected abstract IRenderSetup getBloomRenderSetup(); + + @NotNull + protected abstract BloomType getBloomType(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java new file mode 100644 index 00000000000..9882547ff76 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -0,0 +1,307 @@ +package com.gregtechceu.gtceu.client.particle; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.IRenderSetup; +import com.gregtechceu.gtceu.client.shader.post.BloomType; +import com.gregtechceu.gtceu.client.util.DrawUtil; +import com.gregtechceu.gtceu.client.util.EffectRenderContext; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.lowdragmc.shimmer.client.shader.RenderUtils; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @author brachy84 + */ +public class GTOverheatParticle extends GTBloomParticle { + + public static final int TEMPERATURE_CUTOFF = 400; + + /** + * Source + */ + private static final int[] blackBodyColors = { + 0xFF3300, // 1000 K + 0xFF5300, // 1200 K + 0xFF6500, // 1400 K + 0xFF7300, // 1600 K + 0xFF7E00, // 1800 K + 0xFF8912, // 2000 K + 0xFF932C, // 2200 K + 0xFF9D3F, // 2400 K + 0xffa54f, // 2600 K + 0xffad5e, // 2800 K + 0xffb46b, // 3000 K + 0xffbb78, // 3200 K + 0xffc184, // 3400 K + 0xffc78f, // 3600 K + 0xffcc99, // 3800 K + 0xffd1a3, // 4000 K + 0xffd5ad, // 4200 K + 0xffd9b6, // 4400 K + 0xffddbe, // 4600 K + 0xffe1c6, // 4800 K + 0xffe4ce, // 5000 K + 0xffe8d5, // 5200 K + 0xffebdc, // 5400 K + 0xffeee3, // 5600 K + 0xfff0e9, // 5800 K + 0xfff3ef, // 6000 K + 0xfff5f5, // 6200 K + 0xfff8fb, // 6400 K + 0xfef9ff, // 6600 K + 0xf9f6ff, // 6800 K + 0xf5f3ff, // 7000 K + 0xf0f1ff, // 7200 K + 0xedefff, // 7400 K + 0xe9edff, // 7600 K + 0xe6ebff, // 7800 K + 0xe3e9ff, // 8000 K + 0xe0e7ff, // 8200 K + 0xdde6ff, // 8400 K + 0xdae4ff, // 8600 K + 0xd8e3ff, // 8800 K + 0xd6e1ff, // 9000 K + 0xd3e0ff, // 9200 K + 0xd1dfff, // 9400 K + 0xcfddff, // 9600 K + 0xcedcff, // 9800 K + 0xccdbff, // 10000 K + 0xcadaff, // 10200 K + 0xc9d9ff, // 10400 K + 0xc7d8ff, // 10600 K + 0xc6d8ff, // 10800 K + 0xc4d7ff, // 11000 K + 0xc3d6ff, // 11200 K + 0xc2d5ff, // 11400 K + 0xc1d4ff, // 11600 K + 0xc0d4ff, // 11800 K + 0xbfd3ff, // 12000 K + 0xbed2ff, // 12200 K + 0xbdd2ff, // 12400 K + 0xbcd1ff, // 12600 K + 0xbbd1ff, // 12800 K + 0xbad0ff, // 13000 K + 0xb9d0ff, // 13200 K + 0xb8cfff, // 13400 K + 0xb7cfff, // 13600 K + 0xb7ceff, // 13800 K + 0xb6ceff, // 14000 K + 0xb5cdff, // 14200 K + 0xb5cdff, // 14400 K + 0xb4ccff, // 14600 K + 0xb3ccff, // 14800 K + 0xb3ccff, // 15000 K + 0xb2cbff, // 15200 K + 0xb2cbff, // 15400 K + 0xb1caff, // 15600 K + 0xb1caff, // 15800 K + 0xb0caff, // 16000 K + 0xafc9ff, // 16200 K + 0xafc9ff, // 16400 K + 0xafc9ff, // 16600 K + 0xaec9ff, // 16800 K + 0xaec8ff, // 17000 K + 0xadc8ff, // 17200 K + 0xadc8ff, // 17400 K + 0xacc7ff, // 17600 K + 0xacc7ff, // 17800 K + 0xacc7ff, // 18000 K + 0xabc7ff, // 18200 K + 0xabc6ff, // 18400 K + 0xaac6ff, // 18600 K + 0xaac6ff, // 18800 K + 0xaac6ff, // 19000 K + 0xa9c6ff, // 19200 K + 0xa9c5ff, // 19400 K + 0xa9c5ff, // 19600 K + 0xa9c5ff, // 19800 K + 0xa8c5ff, // 20000 K + // color doesn't really change onwards + }; + + public static int getBlackBodyColor(int temperature) { + if (temperature < 1000) + return blackBodyColors[0]; + int index = (temperature - 1000) / 200; + if (index >= blackBodyColors.length - 1) + return blackBodyColors[blackBodyColors.length - 1]; + int color = blackBodyColors[index]; + return DrawUtil.interpolateColor(color, blackBodyColors[index + 1], temperature % 200 / 200f); + } + + private final CableBlockEntity tileEntity; + + protected final int meltTemp; + protected int temperature = 293; + protected VoxelShape pipeBoxes; + protected boolean insulated; + + protected float alpha = 0; + protected int color = blackBodyColors[0]; + + public GTOverheatParticle(@NotNull CableBlockEntity tileEntity, int meltTemp, + @NotNull VoxelShape pipeBoxes, boolean insulated) { + super(tileEntity.getBlockPos().getX(), tileEntity.getBlockPos().getY(), tileEntity.getBlockPos().getZ()); + this.tileEntity = tileEntity; + this.meltTemp = meltTemp; + this.pipeBoxes = pipeBoxes; + updatePipeBoxes(pipeBoxes); + this.insulated = insulated; + } + + public void setTemperature(int temperature) { + this.temperature = temperature; + if (temperature <= 293 || temperature > meltTemp) { + setExpired(); + return; + } + if (temperature < 500) { + alpha = 0f; + } else if (temperature < 1000) { + alpha = (temperature - 500f) / 500f; + alpha *= 0.8f; + } else { + alpha = 0.8f; + } + color = getBlackBodyColor(temperature); + } + + public void updatePipeBoxes(@NotNull VoxelShape pipeBoxes) { + List boxes = pipeBoxes.toAabbs(); + this.pipeBoxes = boxes.stream() + .map(aabb -> aabb.inflate(0.001)) + .map(Shapes::create) + .reduce(Shapes.empty(), Shapes::or) + .optimize(); + } + + @Override + public void onUpdate() { + if (tileEntity.isRemoved() || !tileEntity.isParticleAlive()) { + setExpired(); + tileEntity.killParticle(); + return; + } + + if (temperature <= TEMPERATURE_CUTOFF || temperature > meltTemp) { + setExpired(); + return; + } + if (temperature < 500) { + alpha = 0f; + } else if (temperature < 1000) { + alpha = (temperature - 500f) / 500f; + alpha *= 0.8f; + } else { + alpha = 0.8f; + } + color = getBlackBodyColor(temperature); + + if (GTValues.RNG.nextFloat() < 0.04) { + spawnSmoke(); + } + } + + private void spawnSmoke() { + BlockPos pos = tileEntity.getBlockPos(); + float xPos = pos.getX() + 0.5F; + float yPos = pos.getY() + 0.9F; + float zPos = pos.getZ() + 0.5F; + + float ySpd = 0.3F + 0.1F * GTValues.RNG.nextFloat(); + tileEntity.getLevel().addParticle(ParticleTypes.LARGE_SMOKE, xPos, yPos, zPos, 0, ySpd, 0); + } + + @Override + public String toString() { + return "GTOverheatParticle{" + + "tileEntity=" + tileEntity + + ", pipeBoxes=" + pipeBoxes + + ", insulated=" + insulated + + ", alpha=" + alpha + + ", color=" + color + + '}'; + } + + @Nullable + @Override + public IRenderSetup getRenderSetup() { + return SETUP; + } + + @Override + public boolean shouldRender(@NotNull EffectRenderContext context) { + if (this.insulated) return false; + for (AABB cuboid : pipeBoxes.toAabbs()) { + if (!context.frustum().isVisible(cuboid.move(posX, posY, posZ))) { + return false; + } + } + return true; + } + + @Nullable + @Override + protected IRenderSetup getBloomRenderSetup() { + return SETUP; + } + + @NotNull + @Override + protected BloomType getBloomType() { + ConfigHolder.ClientConfigs.ShaderOptions.HeatEffectBloom heatEffectBloom = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; + return BloomType.fromValue(heatEffectBloom.useShader ? heatEffectBloom.bloomStyle : -1); + } + + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + @NotNull EffectRenderContext context) { + float red = ((color >> 16) & 0xFF) / 255f; + float green = ((color >> 8) & 0xFF) / 255f; + float blue = (color & 0xFF) / 255f; + + poseStack.pushPose(); + poseStack.translate(posX - context.cameraX(), posY - context.cameraY(), posZ - context.cameraZ()); + for (AABB cuboid : pipeBoxes.toAabbs()) { + RenderBufferHelper.renderCubeFace(poseStack, buffer, cuboid, red, green, blue, alpha, true); + } + poseStack.popPose(); + } + + private static final IRenderSetup SETUP = new IRenderSetup() { + + @Override + @OnlyIn(Dist.CLIENT) + public void preDraw(@NotNull BufferBuilder buffer) { + RenderSystem.setShaderColor(1, 1, 1, 1); + RenderSystem.enableBlend(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void postDraw(@NotNull BufferBuilder buffer) { + Tesselator.getInstance().end(); + RenderSystem.disableBlend(); + } + }; +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java new file mode 100644 index 00000000000..ece35c29e85 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -0,0 +1,118 @@ +package com.gregtechceu.gtceu.client.particle; + +import com.gregtechceu.gtceu.client.renderer.IRenderSetup; +import com.gregtechceu.gtceu.client.util.EffectRenderContext; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * A custom particle implementation with framework for more advanced rendering capabilities. + *

+ * GTParticle instances are managed by {@link GTParticleManager}. GTParticle instances with same {@link IRenderSetup}s + * will be drawn together as a batch. + */ +public abstract class GTParticle { + + public double posX; + public double posY; + public double posZ; + + /** + * render range. If the distance between particle and render view entity exceeds this value, the particle + * will not be rendered. If render range is negative value or {@code NaN}, then the check is disabled and + * the + * particle will be rendered regardless of the distance. + */ + @Getter + private double renderRange = -1; + /** + * squared render range, or negative value if render distance check is disabled. + */ + @Getter + private double squaredRenderRange = -1; + + @Getter + private boolean expired; + + protected GTParticle(double posX, double posY, double posZ) { + this.posX = posX; + this.posY = posY; + this.posZ = posZ; + } + + public boolean shouldRender(@NotNull EffectRenderContext context) { + if (squaredRenderRange < 0) return true; + return context.renderViewEntity().getEyePosition(context.partialTicks()) + .distanceToSqr(posX, posY, posZ) <= squaredRenderRange; + } + + public final boolean isAlive() { + return !expired; + } + + public final void setExpired() { + if (this.expired) return; + this.expired = true; + onExpired(); + } + + /** + * @return {@code true} to render the particle with + * {@link com.mojang.blaze3d.systems.RenderSystem#depthMask(boolean) depth mask} feature disabled; in + * other words, render the particle without modifying depth buffer. + */ + public boolean shouldDisableDepth() { + return false; + } + + /** + * Sets the render range. If the distance between particle and render view entity exceeds this value, the particle + * will not be rendered. If render range is negative value or {@code NaN}, then the check is disabled and the + * particle will be rendered regardless of the distance. + * + * @param renderRange Render range + */ + public final void setRenderRange(double renderRange) { + this.renderRange = renderRange; + if (renderRange >= 0) this.squaredRenderRange = renderRange * renderRange; + else this.squaredRenderRange = -1; + } + + /** + * Update the particle. This method is called each tick. + */ + public void onUpdate() {} + + /** + * Called once on expiration. + */ + protected void onExpired() {} + + /** + * Render the particle. If this particle has non-null {@link #getRenderSetup()} associated, this method will be + * called between a {@link IRenderSetup#preDraw(BufferBuilder)} call and a + * {@link IRenderSetup#postDraw(BufferBuilder)} call. + * + * @param poseStack + * @param buffer buffer builder + * @param context render context + */ + @OnlyIn(Dist.CLIENT) + public void renderParticle(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + @NotNull EffectRenderContext context) {} + + /** + * @return Render setup for this particle, if exists + */ + @Nullable + public IRenderSetup getRenderSetup() { + return null; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java new file mode 100644 index 00000000000..82b49170dae --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -0,0 +1,222 @@ +package com.gregtechceu.gtceu.client.particle; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.renderer.IRenderSetup; +import com.gregtechceu.gtceu.client.util.EffectRenderContext; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * Singleton class responsible for managing, updating and rendering {@link GTParticle} instances. + */ +@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = GTCEu.MOD_ID) +public class GTParticleManager { + + public static final GTParticleManager INSTANCE = new GTParticleManager(); + + @Nullable + private static Level currentWorld = null; + + private final Map<@Nullable IRenderSetup, ArrayDeque> depthEnabledParticles = new Object2ObjectLinkedOpenHashMap<>(); + private final Map<@Nullable IRenderSetup, ArrayDeque> depthDisabledParticles = new Object2ObjectLinkedOpenHashMap<>(); + + private final List newParticleQueue = new ArrayList<>(); + + public void addEffect(@NotNull GTParticle particles) { + newParticleQueue.add(particles); + } + + public void updateEffects() { + if (!depthEnabledParticles.isEmpty()) { + updateQueue(depthEnabledParticles); + } + if (!depthDisabledParticles.isEmpty()) { + updateQueue(depthDisabledParticles); + } + if (!newParticleQueue.isEmpty()) { + for (GTParticle particle : newParticleQueue) { + var queue = particle.shouldDisableDepth() ? depthDisabledParticles : depthEnabledParticles; + + ArrayDeque particles = queue.computeIfAbsent(particle.getRenderSetup(), + setup -> new ArrayDeque<>()); + + if (particles.size() > 6000) { + particles.removeFirst().setExpired(); + } + particles.add(particle); + } + newParticleQueue.clear(); + } + } + + private void updateQueue(Map> renderQueue) { + Iterator> it = renderQueue.values().iterator(); + while (it.hasNext()) { + ArrayDeque particles = it.next(); + + Iterator it2 = particles.iterator(); + while (it2.hasNext()) { + GTParticle particle = it2.next(); + if (particle.isAlive()) { + try { + particle.onUpdate(); + } catch (RuntimeException exception) { + GTCEu.LOGGER.error("particle update error: {}", particle, exception); + particle.setExpired(); + } + if (particle.isAlive()) continue; + } + it2.remove(); + } + + if (particles.isEmpty()) { + it.remove(); + } + } + } + + public void clearAllEffects(boolean cleanNewQueue) { + if (cleanNewQueue) { + for (GTParticle particle : newParticleQueue) { + particle.setExpired(); + } + newParticleQueue.clear(); + } + for (ArrayDeque particles : depthEnabledParticles.values()) { + for (GTParticle particle : particles) { + particle.setExpired(); + } + } + for (ArrayDeque particles : depthDisabledParticles.values()) { + for (GTParticle particle : particles) { + particle.setExpired(); + } + } + depthEnabledParticles.clear(); + depthDisabledParticles.clear(); + } + + public void renderParticles(@NotNull PoseStack poseStack, @NotNull Entity renderViewEntity, Camera camera, + Frustum frustum, float partialTicks) { + if (depthEnabledParticles.isEmpty() && depthDisabledParticles.isEmpty()) return; + + EffectRenderContext instance = EffectRenderContext.getInstance().update(renderViewEntity, camera, frustum, + partialTicks); + + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + + if (!depthDisabledParticles.isEmpty()) { + RenderSystem.depthMask(false); + + renderGlParticlesInLayer(poseStack, depthDisabledParticles, instance); + + RenderSystem.depthMask(true); + } + + renderGlParticlesInLayer(poseStack, depthEnabledParticles, instance); + + RenderSystem.disableBlend(); + } + + private static void renderGlParticlesInLayer(@NotNull PoseStack poseStack, + @NotNull Map<@Nullable IRenderSetup, ArrayDeque> renderQueue, + @NotNull EffectRenderContext context) { + for (var e : renderQueue.entrySet()) { + @Nullable + IRenderSetup handler = e.getKey(); + ArrayDeque particles = e.getValue(); + if (particles.isEmpty()) continue; + + boolean initialized = false; + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + for (GTParticle particle : particles) { + if (particle.shouldRender(context)) { + try { + if (!initialized) { + initialized = true; + if (handler != null) { + handler.preDraw(buffer); + } + } + particle.renderParticle(poseStack, buffer, context); + } catch (Throwable throwable) { + GTCEu.LOGGER.error("particle render error: {}", particle, throwable); + particle.setExpired(); + } + } + } + if (initialized && handler != null) { + handler.postDraw(buffer); + } + } + } + + @SubscribeEvent + public static void clientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END || Minecraft.getInstance().isPaused()) { + return; + } + + ClientLevel world = Minecraft.getInstance().level; + if (currentWorld != world) { + INSTANCE.clearAllEffects(currentWorld != null); + currentWorld = world; + } + + if (currentWorld != null) { + INSTANCE.updateEffects(); + } + } + + @SubscribeEvent + public static void renderWorld(RenderLevelStageEvent event) { + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_CUTOUT_BLOCKS) { + Entity entity = Minecraft.getInstance().getCameraEntity(); + INSTANCE.renderParticles(event.getPoseStack(), entity == null ? Minecraft.getInstance().player : entity, + event.getCamera(), event.getFrustum(), event.getPartialTick()); + } + } + + @SubscribeEvent + public static void debugOverlay(CustomizeGuiOverlayEvent.DebugText event) { + if (event.getLeft().size() >= 5) { + String particleTxt = event.getLeft().get(4); + particleTxt += "." + ChatFormatting.GOLD + + " PARTICLE-BACK: " + count(INSTANCE.depthEnabledParticles) + + "PARTICLE-FRONT: " + count(INSTANCE.depthDisabledParticles); + event.getLeft().set(4, particleTxt); + } + } + + private static int count(Map<@Nullable IRenderSetup, ArrayDeque> renderQueue) { + int g = 0; + for (Deque queue : renderQueue.values()) { + g += queue.size(); + } + return g; + } +} 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 0338050f0c1..fdb19ba296f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -14,10 +14,19 @@ public class GTRenderTypes extends RenderType { private static final RenderType LIGHT_RING = RenderType.create("light_ring", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 256, false, false, RenderType.CompositeState.builder() - .setCullState(NO_CULL) + .setCullState(RenderStateShard.NO_CULL) .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) .createCompositeState(false)); + private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, + 256, false, false, + RenderType.CompositeState.builder() + .setCullState(RenderStateShard.NO_CULL) + .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_NO_CRUMBLING_SHADER) + .setTransparencyState(RenderStateShard.ADDITIVE_TRANSPARENCY) + .setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING) + .createCompositeState(false)); + private GTRenderTypes(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, boolean affectsCrumbling, boolean sortOnUpload, Runnable setupState, Runnable clearState) { super(name, format, mode, bufferSize, affectsCrumbling, sortOnUpload, setupState, clearState); @@ -26,4 +35,8 @@ private GTRenderTypes(String name, VertexFormat format, VertexFormat.Mode mode, public static RenderType getLightRing() { return LIGHT_RING; } + + public static RenderType getBloom() { + return BLOOM; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java new file mode 100644 index 00000000000..96ca4083bbb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java @@ -0,0 +1,21 @@ +package com.gregtechceu.gtceu.client.renderer; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import org.jetbrains.annotations.NotNull; + +public interface IRenderSetup { + + /** + * Run any pre render gl code here. + * + * @param buffer Buffer builder + */ + void preDraw(@NotNull BufferBuilder buffer); + + /** + * Run any post render gl code here. + * + * @param buffer Buffer builder + */ + void postDraw(@NotNull BufferBuilder buffer); +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java index 176f636da2d..cb4f4dcaf33 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.util.BloomUtils; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; @@ -33,12 +33,7 @@ public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, int combinedLight, int combinedOverlay) { if (blockEntity instanceof IMachineBlockEntity machineBlockEntity && machineBlockEntity.getMetaMachine() instanceof FusionReactorMachine machine) { - if (GTCEu.isShimmerLoaded()) { - PoseStack finalStack = RenderUtils.copyPoseStack(stack); - BloomUtils.entityBloom(source -> renderLightRing(machine, partialTicks, finalStack, source)); - } else { - renderLightRing(machine, partialTicks, stack, buffer); - } + renderLightRing(machine, partialTicks, stack, buffer); } } @@ -58,7 +53,7 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P float r = ColorUtils.red(ringColor); float g = ColorUtils.green(ringColor); float b = ColorUtils.blue(ringColor); - RenderBufferHelper.renderRing(stack, buffer.getBuffer(GTRenderTypes.getLightRing()), + RenderBufferHelper.renderRing(stack, buffer.getBuffer(BloomEffectUtil.getEffectiveBloomLayer()), relativeBack.getStepX() * 7 + 0.5F, relativeBack.getStepY() * 7 + 0.5F, relativeBack.getStepZ() * 7 + 0.5F, diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java b/src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java new file mode 100644 index 00000000000..f167a164ec4 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java @@ -0,0 +1,57 @@ +package com.gregtechceu.gtceu.client.shader; + +import com.gregtechceu.gtceu.client.util.RenderUtil; +import net.minecraft.client.Minecraft; + +public class PingPongBuffer { + + private static final PostTarget BUFFER_A; + private static final PostTarget BUFFER_B; + private static boolean flag; + + static { + BUFFER_A = new PostTarget(10, 10, false); + BUFFER_B = new PostTarget(10, 10, false); + BUFFER_A.setClearColor(0, 0, 0, 0); + BUFFER_B.setClearColor(0, 0, 0, 0); + } + + public static void updateSize(int width, int height) { + RenderUtil.updateFBOSize(BUFFER_A, width, height); + RenderUtil.updateFBOSize(BUFFER_B, width, height); + } + + public static void cleanAllUp() { + BUFFER_A.clear(Minecraft.ON_OSX); + BUFFER_B.clear(Minecraft.ON_OSX); + } + + public static PostTarget getCurrentBuffer(boolean clean) { + PostTarget buffer = flag ? BUFFER_A : BUFFER_B; + if (clean) { + buffer.clear(Minecraft.ON_OSX); + } + return buffer; + } + + public static PostTarget getNextBuffer(boolean clean) { + PostTarget buffer = flag ? BUFFER_B : BUFFER_A; + if (clean) { + buffer.clear(Minecraft.ON_OSX); + } + return buffer; + } + + public static PostTarget swap() { + return swap(false); + } + + public static PostTarget swap(boolean clean) { + flag = !flag; + return getCurrentBuffer(clean); + } + + public static void bindFramebufferTexture() { + getCurrentBuffer(false).bindRead(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java b/src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java new file mode 100644 index 00000000000..2bce0001a5d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java @@ -0,0 +1,12 @@ +package com.gregtechceu.gtceu.client.shader; + +import com.mojang.blaze3d.pipeline.RenderTarget; +import net.minecraft.client.Minecraft; + +public class PostTarget extends RenderTarget { + + public PostTarget(int width, int height, boolean useDepth) { + super(useDepth); + this.resize(width, height, Minecraft.ON_OSX); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java new file mode 100644 index 00000000000..8d0e9b14f97 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java @@ -0,0 +1,120 @@ +package com.gregtechceu.gtceu.client.shader; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.shaders.Program; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +@OnlyIn(Dist.CLIENT) +public class Shaders { + + public static Minecraft mc; + private final static Map FULL_IMAGE_PROGRAMS; + + public static ShaderInstance IMAGE; + // public static ShaderObject BLACK_HOLE; + + public static ShaderInstance BLOOM_COMBINE; + + public static ShaderInstance BLUR; + + // Unity + public static ShaderInstance DOWN_SAMPLING; + public static ShaderInstance UP_SAMPLING; + + // Unreal + public static ShaderInstance S_BLUR; + public static ShaderInstance COMPOSITE; + + static { + mc = Minecraft.getInstance(); + FULL_IMAGE_PROGRAMS = new HashMap<>(); + if (allowedShader()) { + initShaders(); + } + } + + public static void initShaders() { + IMAGE = initShader(IMAGE, GTCEu.id("image")); + // BLACK_HOLE = initShader(BLACK_HOLE, FRAGMENT, GTCEu.id("black_hole")); + BLOOM_COMBINE = initShader(BLOOM_COMBINE, GTCEu.id("bloom_combine")); + BLUR = initShader(BLUR, GTCEu.id("blur")); + DOWN_SAMPLING = initShader(DOWN_SAMPLING, GTCEu.id("down_sampling")); + UP_SAMPLING = initShader(UP_SAMPLING, GTCEu.id("up_sampling")); + S_BLUR = initShader(S_BLUR, GTCEu.id("seperable_blur")); + COMPOSITE = initShader(COMPOSITE, GTCEu.id("composite")); + FULL_IMAGE_PROGRAMS.clear(); + } + + private static ShaderInstance initShader(ShaderInstance object, ResourceLocation location) { + unloadShader(object); + try { + return loadShader(location); + } catch (Exception exception) { + GTCEu.LOGGER.error("error while loading shader {}", location, exception); + } + return null; + } + + public static ShaderInstance loadShader(ResourceLocation resourceLocation) throws IOException { + return new ShaderInstance(Minecraft.getInstance().getResourceManager(), resourceLocation, DefaultVertexFormat.POSITION_TEX); + } + + public static void unloadShader(ShaderInstance shaderObject) { + if (shaderObject != null) { + shaderObject.close(); + } + } + + public static boolean allowedShader() { + return ConfigHolder.INSTANCE.client.shader.useShader; + } + + public static RenderTarget renderFullImageInFBO(RenderTarget fbo, ShaderInstance shader, + Consumer uniformApplicator) { + if (fbo == null || shader == null || !allowedShader()) return fbo; + // int lastID = glGetInteger(GL30.GL_FRAMEBUFFER_BINDING); + + fbo.bindWrite(true); + + Program program = FULL_IMAGE_PROGRAMS.get(shader); + if (program == null) { + program = shader.getFragmentProgram(); + FULL_IMAGE_PROGRAMS.put(shader, program); + } + + shader.safeGetUniform("u_resolution").set(fbo.width, fbo.height); + if (uniformApplicator != null) { + uniformApplicator.accept(shader); + } + + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder buffer = tesselator.getBuilder(); + + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); + buffer.vertex(-1, 1, 0).color(0xFFFFFFFF).uv(0, 0).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(-1, -1, 0).color(0xFFFFFFFF).uv(0, 1).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(1, -1, 0).color(0xFFFFFFFF).uv(1, 1).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); + buffer.vertex(1, 1, 0).color(0xFFFFFFFF).uv(1, 0).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); + tesselator.end(); + + shader.clear(); + // GlStateManager.viewport(0, 0, mc.displayWidth, mc.displayHeight); + + // OpenGlHelper.glBindFramebuffer(OpenGlHelper.GL_FRAMEBUFFER, lastID); + fbo.unbindWrite(); + return fbo; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java new file mode 100644 index 00000000000..1c69425a23c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java @@ -0,0 +1,187 @@ +package com.gregtechceu.gtceu.client.shader.post; + +import com.gregtechceu.gtceu.client.shader.PingPongBuffer; +import com.gregtechceu.gtceu.client.shader.PostTarget; +import com.gregtechceu.gtceu.client.shader.Shaders; +import com.gregtechceu.gtceu.client.util.RenderUtil; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.systems.RenderSystem; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; + +public class BloomEffect { + + private static PostTarget[] downSampleFBO; + private static PostTarget[] upSampleFBO; + + public static float strength = ConfigHolder.INSTANCE.client.shader.strength; + public static float baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; + public static float highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; + public static float lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + public static float step = ConfigHolder.INSTANCE.client.shader.step; + + private static void blend(PostTarget bloom, RenderTarget backgroundFBO) { + // bind main fbo + backgroundFBO.bindRead(); + + // bind blur fbo + bloom.bindRead(); + + // blend shader + Shaders.renderFullImageInFBO(PingPongBuffer.swap(), Shaders.BLOOM_COMBINE, shaderInstance -> { + shaderInstance.setSampler("buffer_a", backgroundFBO.getColorTextureId()); + shaderInstance.setSampler("buffer_b", bloom.getColorTextureId()); + shaderInstance.safeGetUniform("intensive").set(strength); + shaderInstance.safeGetUniform("base").set(baseBrightness); + shaderInstance.safeGetUniform("threshold_up").set(highBrightnessThreshold); + shaderInstance.safeGetUniform("threshold_down").set(lowBrightnessThreshold); + }); + + RenderSystem.bindTexture(0); + RenderSystem.setShaderTexture(GL13.GL_TEXTURE1, 0); + + RenderSystem.bindTexture(0); + RenderSystem.setShaderTexture(GL13.GL_TEXTURE0, 0); + + PingPongBuffer.bindFramebufferTexture(); + } + + private static void cleanUp(int lastWidth, int lastHeight) { + if (downSampleFBO == null || downSampleFBO.length != ConfigHolder.INSTANCE.client.shader.nMips) { + if (downSampleFBO != null) { + for (int i = 0; i < downSampleFBO.length; i++) { + downSampleFBO[i].destroyBuffers(); + upSampleFBO[i].destroyBuffers(); + } + } + + downSampleFBO = new PostTarget[ConfigHolder.INSTANCE.client.shader.nMips]; + upSampleFBO = new PostTarget[ConfigHolder.INSTANCE.client.shader.nMips]; + + int resX = lastWidth / 2; + int resY = lastHeight / 2; + + for (int i = 0; i < ConfigHolder.INSTANCE.client.shader.nMips; i++) { + downSampleFBO[i] = new PostTarget(resX, resY, false); + upSampleFBO[i] = new PostTarget(resX, resY, false); + downSampleFBO[i].setClearColor(0, 0, 0, 0); + upSampleFBO[i].setClearColor(0, 0, 0, 0); + downSampleFBO[i].setFilterMode(GL11.GL_LINEAR); + upSampleFBO[i].setFilterMode(GL11.GL_LINEAR); + resX /= 2; + resY /= 2; + } + } else if (RenderUtil.updateFBOSize(downSampleFBO[0], lastWidth / 2, lastHeight / 2)) { + int resX = lastWidth / 2; + int resY = lastHeight / 2; + for (int i = 0; i < ConfigHolder.INSTANCE.client.shader.nMips; i++) { + RenderUtil.updateFBOSize(downSampleFBO[i], resX, resY); + RenderUtil.updateFBOSize(upSampleFBO[i], resX, resY); + downSampleFBO[i].setFilterMode(GL11.GL_LINEAR); + upSampleFBO[i].setFilterMode(GL11.GL_LINEAR); + resX /= 2; + resY /= 2; + } + } + PingPongBuffer.updateSize(lastWidth, lastHeight); + } + + public static void renderLOG(PostTarget highLightFBO, RenderTarget backgroundFBO) { + PingPongBuffer.updateSize(backgroundFBO.width, backgroundFBO.height); + BlurEffect.updateSize(backgroundFBO.width, backgroundFBO.height); + highLightFBO.bindRead(); + blend(BlurEffect.renderBlur1(step), backgroundFBO); + } + + public static void renderUnity(PostTarget highLightFBO, RenderTarget backgroundFBO) { + cleanUp(backgroundFBO.width, backgroundFBO.height); + + renderDownSampling(highLightFBO, downSampleFBO[0]); + for (int i = 0; i < downSampleFBO.length - 1; i++) { + renderDownSampling(downSampleFBO[i], downSampleFBO[i + 1]); + } + + renderUpSampling(downSampleFBO[downSampleFBO.length - 1], downSampleFBO[downSampleFBO.length - 2], + upSampleFBO[downSampleFBO.length - 2]); + for (int i = upSampleFBO.length - 2; i > 0; i--) { + renderUpSampling(upSampleFBO[i], downSampleFBO[i - 1], upSampleFBO[i - 1]); + } + renderUpSampling(upSampleFBO[0], highLightFBO, PingPongBuffer.swap()); + + RenderSystem.bindTexture(0); + RenderSystem.setShaderTexture(GL13.GL_TEXTURE1, 0); + + RenderSystem.bindTexture(0); + RenderSystem.setShaderTexture(GL13.GL_TEXTURE0, 0); + + blend(PingPongBuffer.getCurrentBuffer(false), backgroundFBO); + } + + private static void renderDownSampling(RenderTarget U, RenderTarget D) { + U.bindRead(); + Shaders.renderFullImageInFBO(D, Shaders.DOWN_SAMPLING, + uniformCache -> uniformCache.safeGetUniform("u_resolution2").set(U.width, U.height)); + } + + private static void renderUpSampling(RenderTarget U, RenderTarget D, RenderTarget T) { + U.bindRead(); + RenderSystem.setShaderTexture(0, U.getColorTextureId()); + + D.bindRead(); + RenderSystem.setShaderTexture(1, D.getColorTextureId()); + + Shaders.renderFullImageInFBO(T, Shaders.UP_SAMPLING, uniformCache -> { + uniformCache.setSampler("upTexture", U.getColorTextureId()); + uniformCache.setSampler("downTexture", D.getColorTextureId()); + uniformCache.safeGetUniform("u_resolution2").set((float) U.width, (float) U.height); + }); + } + + public static void renderUnreal(PostTarget highLightFBO, RenderTarget backgroundFBO) { + cleanUp(backgroundFBO.width, backgroundFBO.height); + + // blur all mips + int[] kernelSizeArray = new int[] { 3, 5, 7, 9, 11 }; + highLightFBO.bindRead(); + for (int i = 0; i < downSampleFBO.length; i++) { + RenderTarget buffer_h = downSampleFBO[i]; + int kernel = kernelSizeArray[i]; + Shaders.renderFullImageInFBO(buffer_h, Shaders.S_BLUR, uniformCache -> { + uniformCache.safeGetUniform("texSize").set((float) buffer_h.width, (float) buffer_h.height); + uniformCache.safeGetUniform("blurDir").set(step, 0); + uniformCache.safeGetUniform("kernel_radius").set(kernel); + }).bindRead(); + + RenderTarget buffer_v = upSampleFBO[i]; + Shaders.renderFullImageInFBO(buffer_v, Shaders.S_BLUR, uniformCache -> { + uniformCache.safeGetUniform("texSize").set((float) buffer_h.width, (float) buffer_h.height); + uniformCache.safeGetUniform("blurDir").set(0, step); + uniformCache.safeGetUniform("kernel_radius").set(kernel); + }).bindRead(); + } + + // composite all mips + for (int i = 0; i < downSampleFBO.length; i++) { + upSampleFBO[i].bindRead(); + RenderSystem.setShaderTexture(GL13.GL_TEXTURE0 + i, upSampleFBO[i].getColorTextureId()); + } + + Shaders.renderFullImageInFBO(downSampleFBO[0], Shaders.COMPOSITE, uniformCache -> { + //noinspection PointlessArithmeticExpression + uniformCache.setSampler("blurTexture1", GL13.GL_TEXTURE0 + 0); + uniformCache.setSampler("blurTexture2", GL13.GL_TEXTURE0 + 1); + uniformCache.setSampler("blurTexture3", GL13.GL_TEXTURE0 + 2); + uniformCache.setSampler("blurTexture4", GL13.GL_TEXTURE0 + 3); + uniformCache.setSampler("blurTexture5", GL13.GL_TEXTURE0 + 4); + uniformCache.safeGetUniform("bloomStrength").set(strength); + uniformCache.safeGetUniform("bloomRadius").set(1.0f); + }); + + for (int i = downSampleFBO.length - 1; i >= 0; i--) { + RenderSystem.setShaderTexture(GL13.GL_TEXTURE0 + i, 0); + } + + blend(downSampleFBO[0], backgroundFBO); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomType.java b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomType.java new file mode 100644 index 00000000000..e5000091c1e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomType.java @@ -0,0 +1,42 @@ +package com.gregtechceu.gtceu.client.shader.post; + +import org.jetbrains.annotations.NotNull; + +public enum BloomType { + + /** + * Simple Gaussian Blur + */ + GAUSSIAN, + /** + * Unity Bloom + */ + UNITY, + /** + * Unreal Bloom + */ + UNREAL, + /** + * No bloom at all :O + */ + DISABLED; + + public int getValue() { + return switch (this) { + case GAUSSIAN -> 0; + case UNITY -> 1; + case UNREAL -> 2; + case DISABLED -> -1; + }; + } + + @NotNull + public static BloomType fromValue(int value) { + return switch (value) { + case 0 -> GAUSSIAN; + case 1 -> UNITY; + case 2 -> UNREAL; + default -> DISABLED; + }; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java new file mode 100644 index 00000000000..b5054b2eda7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java @@ -0,0 +1,64 @@ +package com.gregtechceu.gtceu.client.shader.post; + +import com.gregtechceu.gtceu.client.shader.PingPongBuffer; +import com.gregtechceu.gtceu.client.shader.PostTarget; +import com.gregtechceu.gtceu.client.shader.Shaders; +import com.gregtechceu.gtceu.client.util.RenderUtil; +import com.mojang.blaze3d.pipeline.RenderTarget; +import org.lwjgl.opengl.GL11; + +public class BlurEffect { + + private static PostTarget BLUR_H; + private static PostTarget BLUR_W; + private static PostTarget BLUR_H2; + private static PostTarget BLUR_W2; + + public static void updateSize(int lastWidth, int lastHeight) { + if (BLUR_H == null) { + BLUR_H = new PostTarget(lastWidth / 8, lastHeight / 8, false); + BLUR_H2 = new PostTarget(lastWidth / 4, lastHeight / 4, false); + BLUR_W = new PostTarget(lastWidth / 8, lastHeight / 8, false); + BLUR_W2 = new PostTarget(lastWidth / 4, lastHeight / 4, false); + BLUR_H.setClearColor(0, 0, 0, 0); + BLUR_H2.setClearColor(0, 0, 0, 0); + BLUR_W.setClearColor(0, 0, 0, 0); + BLUR_W2.setClearColor(0, 0, 0, 0); + BLUR_H.setFilterMode(GL11.GL_LINEAR); + BLUR_H2.setFilterMode(GL11.GL_LINEAR); + BLUR_W.setFilterMode(GL11.GL_LINEAR); + BLUR_W2.setFilterMode(GL11.GL_LINEAR); + } else if (RenderUtil.updateFBOSize(BLUR_H, lastWidth / 8, lastHeight / 8)) { + RenderUtil.updateFBOSize(BLUR_H2, lastWidth / 4, lastHeight / 4); + RenderUtil.updateFBOSize(BLUR_W, lastWidth / 8, lastHeight / 8); + RenderUtil.updateFBOSize(BLUR_W2, lastWidth / 4, lastHeight / 4); + BLUR_H.setFilterMode(GL11.GL_LINEAR); + BLUR_H2.setFilterMode(GL11.GL_LINEAR); + BLUR_W.setFilterMode(GL11.GL_LINEAR); + BLUR_W2.setFilterMode(GL11.GL_LINEAR); + } + PingPongBuffer.updateSize(lastWidth, lastHeight); + } + + public static PostTarget renderBlur1(float step) { + Shaders.renderFullImageInFBO(BLUR_H2, Shaders.BLUR, + shaderInstance -> shaderInstance.safeGetUniform("blurDir").set(0, step)).bindRead(); + Shaders.renderFullImageInFBO(BLUR_W2, Shaders.BLUR, + uniformCache -> uniformCache.safeGetUniform("blurDir").set(step, 0)).bindRead(); + Shaders.renderFullImageInFBO(BLUR_H, Shaders.BLUR, + uniformCache -> uniformCache.safeGetUniform("blurDir").set(0, step)).bindRead(); + Shaders.renderFullImageInFBO(BLUR_W, Shaders.BLUR, + uniformCache -> uniformCache.safeGetUniform("blurDir").set(step, 0)).bindRead(); + return BLUR_W; + } + + public static RenderTarget renderBlur2(int loop, float step) { + for (int i = 0; i < loop; i++) { + Shaders.renderFullImageInFBO(PingPongBuffer.swap(true), Shaders.BLUR, + uniformCache -> uniformCache.safeGetUniform("blurDir").set(0, step)).bindRead(); + Shaders.renderFullImageInFBO(PingPongBuffer.swap(), Shaders.BLUR, + uniformCache -> uniformCache.safeGetUniform("blurDir").set(step, 0)).bindRead(); + } + return PingPongBuffer.getCurrentBuffer(false); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java new file mode 100644 index 00000000000..97b4d4fee83 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -0,0 +1,650 @@ +package com.gregtechceu.gtceu.client.util; + +import com.google.common.collect.ImmutableList; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.particle.GTParticle; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.IRenderSetup; +import com.gregtechceu.gtceu.client.shader.PostTarget; +import com.gregtechceu.gtceu.client.shader.Shaders; +import com.gregtechceu.gtceu.client.shader.post.BloomEffect; +import com.gregtechceu.gtceu.client.shader.post.BloomType; + +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.RenderTypeAccessor; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Getter; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderStateShard; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Predicate; +import java.util.function.Supplier; + +@OnlyIn(Dist.CLIENT) +public class BloomEffectUtil { + + private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); + private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); + + private static final ReentrantLock BLOOM_RENDER_LOCK = new ReentrantLock(); + + private static RenderType bloom; + @Getter + private static PostTarget bloomFBO; + + /** + * @return {@link RenderType} instance for the bloom render layer. + */ + @NotNull + public static RenderType getBloomLayer() { + return Objects.requireNonNull(bloom, "Bloom effect is not initialized yet"); + } + + /** + * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom + * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is + * disabled, {@link RenderType#cutout()} is returned instead. + * + * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#cutout()} if bloom + * layer is disabled + * @see #getEffectiveBloomLayer(RenderType) + */ + @NotNull + public static RenderType getEffectiveBloomLayer() { + return getEffectiveBloomLayer(RenderType.cutout()); + } + + /** + * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom + * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is + * disabled, the fallback layer specified is returned instead. + * + * @param fallback Block render layer to be returned when bloom layer is disabled + * @return {@link RenderType} instance for the bloom render layer, or {@code fallback} if bloom layer is + * disabled + * @see #getEffectiveBloomLayer(boolean, RenderType) + */ + @Contract("null -> _; !null -> !null") + public static RenderType getEffectiveBloomLayer(RenderType fallback) { + return GTCEu.isOptifineLoaded() ? fallback : bloom; + } + + /** + * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom + * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is + * disabled, {@link RenderType#CUTOUT} is returned instead. + * + * @param isBloomActive Whether bloom layer should be active. If this value is {@code false}, {@code fallback} layer + * will be returned. Has no effect if Optifine is present. + * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#CUTOUT} if bloom + * layer is disabled + * @see #getEffectiveBloomLayer(boolean, RenderType) + */ + @NotNull + public static RenderType getEffectiveBloomLayer(boolean isBloomActive) { + return getEffectiveBloomLayer(isBloomActive, RenderType.cutout()); + } + + /** + * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom + * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is + * disabled, the fallback layer specified is returned instead. + * + * @param isBloomActive Whether bloom layer should be active. If this value is {@code false}, {@code fallback} layer + * will be returned. Has no effect if Optifine is present. + * @param fallback Block render layer to be returned when bloom layer is disabled + * @return {@link RenderType} instance for the bloom render layer, or {@code fallback} if bloom layer is + * disabled + */ + @Contract("_, null -> _; _, !null -> !null") + public static RenderType getEffectiveBloomLayer(boolean isBloomActive, RenderType fallback) { + return GTCEu.isOptifineLoaded() || !isBloomActive ? fallback : bloom; + } + + /** + *

+ * Register a custom bloom render callback for subsequent world render. The render call persists until the + * {@code blockEntity} is invalidated, or the world associated with {@code blockEntity} or the ticket is + * manually freed by calling {@link BloomRenderTicket#invalidate()}. + *

+ *

+ * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * returned instead. + *

+ * + * @param setup Render setup, if exists + * @param bloomType Type of the bloom + * @param render Rendering callback + * @param blockEntity Meta tile entity instance + * @return Ticket for the registered bloom render callback + * @throws NullPointerException if {@code bloomType == null || render == null || blockEntity == null} + */ + @NotNull + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, + @NotNull BloomType bloomType, + @NotNull IBloomEffect render, + @NotNull BlockEntity blockEntity) { + Objects.requireNonNull(blockEntity, "blockEntity == null"); + return registerBloomRender(setup, bloomType, + new IBloomEffect() { + + @Override + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { + render.renderBloomEffect(poseStack, buffer, context); + } + + @Override + public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { + return blockEntity.getLevel() == context.renderViewEntity().level() && + render.shouldRenderBloomEffect(context); + } + }, + t -> !blockEntity.isRemoved(), + blockEntity::getLevel); + } + + /** + *

+ * Register a custom bloom render callback for subsequent world render. The render call persists until the + * {@code particle} is invalidated, or the ticket is manually freed by calling + * {@link BloomRenderTicket#invalidate()}. + *

+ *

+ * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * returned instead. + *

+ * + * @param setup Render setup, if exists + * @param bloomType Type of the bloom + * @param render Rendering callback + * @param particle Particle instance + * @return Ticket for the registered bloom render callback + * @throws NullPointerException if {@code bloomType == null || render == null || metaTileEntity == null} + */ + @NotNull + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, + @NotNull BloomType bloomType, + @NotNull IBloomEffect render, + @NotNull GTParticle particle) { + Objects.requireNonNull(particle, "particle == null"); + return registerBloomRender(setup, bloomType, render, t -> particle.isAlive()); + } + + /** + *

+ * Register a custom bloom render callback for subsequent world render. The render call persists until it is + * manually freed by calling {@link BloomRenderTicket#invalidate()}, or invalidated by validity checker. + *

+ *

+ * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * returned instead. + *

+ * + * @param setup Render setup, if exists + * @param bloomType Type of the bloom + * @param render Rendering callback + * @param validityChecker Optional validity checker; returning {@code false} causes the ticket to be invalidated. + * Checked on both pre-/post-render each frame. + * @return Ticket for the registered bloom render callback + * @throws NullPointerException if {@code bloomType == null || render == null} + * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, BlockEntity) + * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, GTParticle) + * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, Predicate, Supplier) + */ + @NotNull + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, + @NotNull BloomType bloomType, + @NotNull IBloomEffect render, + @Nullable Predicate validityChecker) { + return registerBloomRender(setup, bloomType, render, validityChecker, null); + } + + /** + *

+ * Register a custom bloom render callback for subsequent world render. The render call persists until it is + * manually freed by calling {@link BloomRenderTicket#invalidate()}, or invalidated by validity checker. + *

+ *

+ * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * returned instead. + *

+ * + * @param setup Render setup, if exists + * @param bloomType Type of the bloom + * @param render Rendering callback + * @param validityChecker Optional validity checker; returning {@code false} causes the ticket to be invalidated. + * Checked on both pre/post render each frame. + * @param worldContext Optional world bound to the ticket. If the world returned is not null, the bloom ticket + * will be automatically invalidated on world unload. If world context returns {@code null}, + * it will not be affected by aforementioned automatic invalidation. + * @return Ticket for the registered bloom render callback + * @throws NullPointerException if {@code bloomType == null || render == null} + * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, BlockEntity) + * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, GTParticle) + */ + @NotNull + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, + @NotNull BloomType bloomType, + @NotNull IBloomEffect render, + @Nullable Predicate validityChecker, + @Nullable Supplier worldContext) { + if (GTCEu.isOptifineLoaded()) return BloomRenderTicket.INVALID; + BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); + BLOOM_RENDER_LOCK.lock(); + try { + SCHEDULED_BLOOM_RENDERS.add(ticket); + } finally { + BLOOM_RENDER_LOCK.unlock(); + } + return ticket; + } + + /** + * Invalidate tickets associated with given world. + * + * @param world Level + */ + public static void invalidateLevelTickets(@NotNull Level world) { + Objects.requireNonNull(world, "world == null"); + BLOOM_RENDER_LOCK.lock(); + try { + for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == world) { + ticket.invalidate(); + } + } + + for (Map.Entry> e : BLOOM_RENDERS.entrySet()) { + for (BloomRenderTicket ticket : e.getValue()) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == world) { + ticket.invalidate(); + } + } + } + } finally { + BLOOM_RENDER_LOCK.unlock(); + } + } + + public static void init() { + bloom = GTRenderTypes.getBloom(); + ((RenderTypeAccessor)bloom).setChunkLayerId(RenderType.chunkBufferLayers().size()); + RenderType.CHUNK_BUFFER_LAYERS = ImmutableList.builder() + .addAll(RenderType.CHUNK_BUFFER_LAYERS) + .add(bloom) + .build(); + + if (GTCEu.isSodiumRubidiumEmbeddiumLoaded()) { + try { + // Add our render type to embeddium's render passes by force (until an API is added) + + /* FOR UNRELEASED EMBEDDIUM!!! + Field field = DefaultTerrainRenderPasses.class.getDeclaredField("RENDER_PASS_MAPPINGS"); + FieldUtils.removeFinalModifier(field); + field.set(null, new HashMap<>(DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS)); + + TerrainRenderPass bloomPass = TerrainRenderPass.builder() + .layer(bloom) + .fragmentDiscard(true) + .useReverseOrder(true) + .useTranslucencySorting(true) + .build(); + DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS.put(bloom, List.of(bloomPass)); + */ + TerrainRenderPass bloomPass = new TerrainRenderPass(bloom, true, true); + + Field field = DefaultTerrainRenderPasses.class.getDeclaredField("ALL"); + FieldUtils.removeFinalModifier(field); + field.set(null, ArrayUtils.add(DefaultTerrainRenderPasses.ALL, bloomPass)); + } catch (IllegalAccessException | NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + } + + public static final ThreadLocal isRenderingBloom = ThreadLocal.withInitial(() -> false); + + public static void renderBloomBlockLayer(LevelRenderer levelRenderer, + double camX, double camY, double camZ, + PoseStack poseStack, + Camera camera, + Frustum frustum, + RenderType blockRenderLayer, // 70% sure it's translucent uh yeah + double partialTicks, + Matrix4f projectionMatrix, + @NotNull Entity entity) { + Minecraft.getInstance().getProfiler().popPush("BTLayer"); + isRenderingBloom.set(true); + + if (GTCEu.isOptifineLoaded()) { + levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); + return; + } + + BLOOM_RENDER_LOCK.lock(); + try { + renderBloomInternal(levelRenderer, camX, camY, camZ, poseStack, camera, frustum, blockRenderLayer, partialTicks, projectionMatrix, entity); + } finally { + BLOOM_RENDER_LOCK.unlock(); + isRenderingBloom.set(false); + } + } + + private static void renderBloomInternal(LevelRenderer levelRenderer, + double camX, double camY, double camZ, + PoseStack poseStack, + Camera camera, + Frustum frustum, + RenderType blockRenderLayer, + double partialTicks, + Matrix4f projectionMatrix, + @NotNull Entity entity) { + preDraw(); + + EffectRenderContext context = EffectRenderContext.getInstance().update(entity, camera, frustum, (float) partialTicks); + + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { + RenderSystem.depthMask(true); + levelRenderer.renderChunkLayer(bloom, poseStack, camX, camY, camZ, projectionMatrix); + + if (!BLOOM_RENDERS.isEmpty()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + for (List list : BLOOM_RENDERS.values()) { + draw(poseStack, buffer, context, list); + } + } + postDraw(); + RenderSystem.depthMask(false); + + levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); + return; + } + + RenderTarget fbo = Minecraft.getInstance().getMainRenderTarget(); + + if (bloomFBO == null || + bloomFBO.width != fbo.width || + bloomFBO.height != fbo.height || + (fbo.isStencilEnabled() && !bloomFBO.isStencilEnabled())) { + if (bloomFBO == null) { + bloomFBO = new PostTarget(fbo.width, fbo.height, false); + bloomFBO.setClearColor(0, 0, 0, 0); + } else { + bloomFBO.resize(fbo.width, fbo.height, Minecraft.ON_OSX); + } + + if (fbo.isStencilEnabled() && !bloomFBO.isStencilEnabled()) { + bloomFBO.enableStencil(); + } + + if (DepthTextureUtil.isLastBind() && DepthTextureUtil.isUseDefaultFBO()) { + RenderUtil.hookDepthTexture(bloomFBO, DepthTextureUtil.framebufferDepthTexture); + } else { + RenderUtil.hookDepthBuffer(bloomFBO, fbo.getDepthTextureId()); + } + + bloomFBO.setFilterMode(GL11.GL_LINEAR); + } + + RenderSystem.depthMask(true); + fbo.bindWrite(true); + + if (!BLOOM_RENDERS.isEmpty()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + for (List list : BLOOM_RENDERS.values()) { + draw(poseStack, buffer, context, list); + } + } + + // render to BLOOM BUFFER + bloomFBO.clear(Minecraft.ON_OSX); + bloomFBO.bindWrite(false); + + levelRenderer.renderChunkLayer(bloom, poseStack, camX, camY, camZ, projectionMatrix); + + RenderSystem.depthMask(false); + + // fast render bloom layer to main fbo + bloomFBO.bindRead(); + Shaders.renderFullImageInFBO(fbo, Shaders.IMAGE, null); + + // reset transparent layer render state and render + GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo.frameBufferId); + RenderSystem.enableBlend(); + Minecraft.getInstance().getTextureManager().bindForSetup(InventoryMenu.BLOCK_ATLAS); + //GL11.glShadeModel(GL11.GL_SMOOTH); + + levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); + + Minecraft.getInstance().getProfiler().popPush("bloom"); + + // blend bloom + transparent + fbo.bindRead(); + RenderSystem.blendFunc(GL11.GL_DST_ALPHA, GL11.GL_ZERO); + Shaders.renderFullImageInFBO(bloomFBO, Shaders.IMAGE, null); + RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + // render bloom effect to fbo + BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; + BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; + BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; + BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; + switch (ConfigHolder.INSTANCE.client.shader.bloomStyle) { + case 0 -> BloomEffect.renderLOG(bloomFBO, fbo); + case 1 -> BloomEffect.renderUnity(bloomFBO, fbo); + case 2 -> BloomEffect.renderUnreal(bloomFBO, fbo); + default -> { + postDraw(); + RenderSystem.depthMask(false); + RenderSystem.disableBlend(); + return; + } + } + + RenderSystem.depthMask(false); + + // render bloom blend result to fbo + RenderSystem.disableBlend(); + Shaders.renderFullImageInFBO(fbo, Shaders.IMAGE, null); + + // ********** render custom bloom ************ + + if (!BLOOM_RENDERS.isEmpty()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + for (var e : BLOOM_RENDERS.entrySet()) { + BloomRenderKey key = e.getKey(); + List list = e.getValue(); + + RenderSystem.depthMask(true); + + bloomFBO.clear(Minecraft.ON_OSX); + bloomFBO.bindWrite(true); + + draw(poseStack, buffer, context, list); + + RenderSystem.depthMask(false); + + // blend bloom + transparent + fbo.bindRead(); + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GL11.GL_DST_ALPHA, GL11.GL_ZERO); + Shaders.renderFullImageInFBO(bloomFBO, Shaders.IMAGE, null); + RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + switch (key.bloomType) { + case GAUSSIAN -> BloomEffect.renderLOG(bloomFBO, fbo); + case UNITY -> BloomEffect.renderUnity(bloomFBO, fbo); + case UNREAL -> BloomEffect.renderUnreal(bloomFBO, fbo); + default -> { + RenderSystem.disableBlend(); + continue; + } + } + + // render bloom blend result to fbo + RenderSystem.disableBlend(); + Shaders.renderFullImageInFBO(fbo, Shaders.IMAGE, null); + } + postDraw(); + } + } + + private static void preDraw() { + for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { + if (!ticket.isValid()) continue; + BLOOM_RENDERS.computeIfAbsent(new BloomRenderKey(ticket.renderSetup, ticket.bloomType), + k -> new ArrayList<>()).add(ticket); + } + SCHEDULED_BLOOM_RENDERS.clear(); + } + + private static void draw(@NotNull PoseStack poseStack, + @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context, + @NotNull List tickets) { + boolean initialized = false; + @Nullable + IRenderSetup renderSetup = null; + for (BloomRenderTicket ticket : tickets) { + ticket.checkValidity(); + if (!ticket.isValid() || !ticket.render.shouldRenderBloomEffect(context)) continue; + if (!initialized) { + initialized = true; + renderSetup = ticket.renderSetup; + if (renderSetup != null) { + renderSetup.preDraw(buffer); + } + } + ticket.render.renderBloomEffect(poseStack, buffer, context); + } + if (initialized && renderSetup != null) { + renderSetup.postDraw(buffer); + } + } + + private static void postDraw() { + for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext();) { + List list = it.next(); + + if (!list.isEmpty()) { + if (!list.removeIf(ticket -> { + ticket.checkValidity(); + return !ticket.isValid(); + }) || !list.isEmpty()) continue; + } + + it.remove(); + } + } + + private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) {} + + public static final class BloomRenderTicket { + + public static final BloomRenderTicket INVALID = new BloomRenderTicket(); + + @Nullable + private final IRenderSetup renderSetup; + private final BloomType bloomType; + private final IBloomEffect render; + @Nullable + private final Predicate validityChecker; + @Nullable + private final Supplier worldContext; + + private boolean invalidated; + + BloomRenderTicket() { + this(null, BloomType.DISABLED, (p, b, c) -> {}, null, null); + this.invalidated = true; + } + + BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType, + @NotNull IBloomEffect render, @Nullable Predicate validityChecker, + @Nullable Supplier worldContext) { + this.renderSetup = renderSetup; + this.bloomType = Objects.requireNonNull(bloomType, "bloomType == null"); + this.render = Objects.requireNonNull(render, "render == null"); + this.validityChecker = validityChecker; + this.worldContext = worldContext; + } + + @Nullable + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.9") + public IRenderSetup getRenderSetup() { + return this.renderSetup; + } + + @NotNull + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.9") + public BloomType getBloomType() { + return this.bloomType; + } + + public boolean isValid() { + return !this.invalidated; + } + + public void invalidate() { + this.invalidated = true; + } + + private void checkValidity() { + if (!this.invalidated && this.validityChecker != null && !this.validityChecker.test(this)) { + invalidate(); + } + } + } + + /** + * @deprecated use ticket-based bloom render hooks + */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.9") + public interface IBloomRenderFast extends IRenderSetup { + + /** + * Custom Bloom Style. + * + * @return 0 - Simple Gaussian Blur Bloom + *

+ * 1 - Unity Bloom + *

+ *

+ * 2 - Unreal Bloom + *

+ */ + int customBloomStyle(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomUtils.java deleted file mode 100644 index 6325e1f7086..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gregtechceu.gtceu.client.util; - -import com.lowdragmc.shimmer.client.postprocessing.PostProcessing; - -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import java.util.function.Consumer; - -@OnlyIn(Dist.CLIENT) -public class BloomUtils { - - public static void entityBloom(Consumer sourceConsumer) { - // Shimmer will call PostProcessing.BLOOM_UNREAL.renderEntityPost in LevelRenderer#renderLevel - // We probably don't need to call it ourselves - PostProcessing.BLOOM_UNREAL.postEntity(sourceConsumer); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java new file mode 100644 index 00000000000..767f73209fc --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java @@ -0,0 +1,171 @@ +package com.gregtechceu.gtceu.client.util; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.platform.TextureUtil; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.event.TickEvent; +import org.lwjgl.opengl.*; + +/** + * Created with IntelliJ IDEA. + * + * @author KilaBash + * @date 2021/09/11 + * @implNote You'll need it when you need to get deep textures to do more cool things. + * The default FBO is used, unfortunately, sometimes we have to abandon native way to create a new fbo. + * But generally not. + */ +@OnlyIn(Dist.CLIENT) +public class DepthTextureUtil { + + public static int framebufferObject; + public static int framebufferDepthTexture; + private static boolean useDefaultFBO = true; + private static boolean lastBind; + private static int lastWidth, lastHeight; + + private static boolean shouldRenderDepthTexture() { + return lastBind && !GTCEu.isOptifineLoaded() && ConfigHolder.INSTANCE.client.hookDepthTexture; + } + + public static void onPreWorldRender(TickEvent.RenderTickEvent event) { + Minecraft mc = Minecraft.getInstance(); + if (event.phase == TickEvent.Phase.START && mc.level != null) { + if (shouldRenderDepthTexture()) { + if (useDefaultFBO && GL11.glGetError() != 0) { // if we can't use the vanilla fbo.... okay, why not + // create our own fbo? + useDefaultFBO = false; + if (framebufferDepthTexture != 0) { + disposeDepthTexture(); + createDepthTexture(); + } + } + if (framebufferDepthTexture == 0) { + createDepthTexture(); + } else if (lastWidth != mc.getMainRenderTarget().width || + lastHeight != mc.getMainRenderTarget().height) { + disposeDepthTexture(); + createDepthTexture(); + } + } else { + disposeDepthTexture(); + } + lastBind = false; + } + } + + public static void renderWorld(RenderLevelStageEvent event) { // re-render world in our own fbo. + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) { + return; + } + Minecraft mc = Minecraft.getInstance(); + Entity viewer = mc.getCameraEntity(); + if (DepthTextureUtil.framebufferDepthTexture != 0 && mc.level != null && viewer != null && + !DepthTextureUtil.useDefaultFBO) { + int lastFBO = GlStateManager.getBoundFramebuffer(); + GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebufferObject); + RenderSystem.clear(GL11.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); + var projectionMatrix = RenderSystem.getProjectionMatrix(); + mc.levelRenderer.renderChunkLayer(RenderType.solid(), event.getPoseStack(), + viewer.getX(), viewer.getY(), viewer.getZ(), projectionMatrix); + mc.levelRenderer.renderChunkLayer(RenderType.solid(), event.getPoseStack(), + viewer.getX(), viewer.getY(), viewer.getZ(), projectionMatrix); + GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, lastFBO); + } + } + + public static void createDepthTexture() { + int lastFBO = GlStateManager._getInteger(GL30.GL_FRAMEBUFFER_BINDING); + RenderTarget framebuffer = Minecraft.getInstance().getMainRenderTarget(); + boolean stencil = framebuffer.isStencilEnabled() && useDefaultFBO; + + if (useDefaultFBO) { + framebufferObject = framebuffer.frameBufferId; + } else { + framebufferObject = GlStateManager.glGenFramebuffers(); + } + + framebufferDepthTexture = TextureUtil.generateTextureId(); // gen texture + RenderSystem.bindTexture(framebufferDepthTexture); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL14.GL_DEPTH_TEXTURE_MODE, GL11.GL_LUMINANCE); + RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_FUNC, GL11.GL_LEQUAL); + GlStateManager._texImage2D(GL11.GL_TEXTURE_2D, 0, + stencil ? GL30.GL_DEPTH24_STENCIL8 : GL14.GL_DEPTH_COMPONENT24, + framebuffer.viewWidth, + framebuffer.viewHeight, 0, + stencil ? GL30.GL_DEPTH_STENCIL : GL11.GL_DEPTH_COMPONENT, + stencil ? GL30.GL_UNSIGNED_INT_24_8 : GL11.GL_UNSIGNED_INT, null); + RenderSystem.bindTexture(0); + + lastWidth = framebuffer.viewWidth; + lastHeight = framebuffer.viewHeight; + + GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebufferObject); // bind buffer then bind depth texture + GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, + stencil ? GL30.GL_DEPTH_STENCIL_ATTACHMENT : GL30.GL_DEPTH_ATTACHMENT, + GL11.GL_TEXTURE_2D, + framebufferDepthTexture, 0); + + if (BloomEffectUtil.getBloomFBO() != null && useDefaultFBO) { + RenderUtil.hookDepthTexture(BloomEffectUtil.getBloomFBO(), framebufferDepthTexture); + } + + GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, lastFBO); + } + + public static void disposeDepthTexture() { + if (framebufferDepthTexture != 0 || framebufferObject != 0) { + if (useDefaultFBO) { + RenderTarget framebuffer = Minecraft.getInstance().getMainRenderTarget(); + RenderTarget bloomFBO = BloomEffectUtil.getBloomFBO(); + if (bloomFBO != null) { + RenderUtil.hookDepthBuffer(bloomFBO, framebuffer.getDepthTextureId()); + } + RenderUtil.hookDepthBuffer(framebuffer, framebuffer.getDepthTextureId()); + } else { + RenderSystem.glDeleteBuffers(framebufferObject); + } + RenderSystem.deleteTexture(framebufferDepthTexture); + framebufferObject = 0; + framebufferDepthTexture = 0; + } + } + + public static void bindDepthTexture() { + lastBind = true; + if (useDefaultFBO && framebufferDepthTexture != 0) { + RenderTarget mainTarget = Minecraft.getInstance().getMainRenderTarget(); + RenderUtil.hookDepthBuffer(mainTarget, mainTarget.getDepthTextureId()); + } + RenderSystem.bindTexture(framebufferDepthTexture); + } + + public static void unBindDepthTexture() { + RenderSystem.bindTexture(0); + if (useDefaultFBO) { + RenderTarget framebuffer = Minecraft.getInstance().getMainRenderTarget(); + RenderUtil.hookDepthTexture(framebuffer, framebufferDepthTexture); + } + } + + public static boolean isUseDefaultFBO() { + return useDefaultFBO; + } + + public static boolean isLastBind() { + return framebufferObject != 0; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java index 33971070d43..9d1c4473e8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java @@ -63,4 +63,22 @@ private static void fillHorizontalGradient(GuiGraphics graphics, VertexConsumer consumer.vertex(matrix4f, (float) x2, (float) y2, (float) z).color(r2, g2, b2, a2).endVertex(); consumer.vertex(matrix4f, (float) x2, (float) y1, (float) z).color(r2, g2, b2, a2).endVertex(); } + + public static int interpolateColor(int color1, int color2, float blend) { + int a1 = color1 >> 24 & 255; + int r1 = color1 >> 16 & 255; + int g1 = color1 >> 8 & 255; + int b1 = color1 & 255; + + int a2 = color2 >> 24 & 255; + int r2 = color2 >> 16 & 255; + int g2 = color2 >> 8 & 255; + int b2 = color2 & 255; + + int a = (int) (a1 * (1 - blend) + a2 * blend); + int r = (int) (r1 * (1 - blend) + r2 * blend); + int g = (int) (g1 * (1 - blend) + g2 * blend); + int b = (int) (b1 * (1 - blend) + b2 * blend); + return a << 24 | r << 16 | g << 8 | b; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java b/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java new file mode 100644 index 00000000000..e91b3cd9358 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java @@ -0,0 +1,88 @@ +package com.gregtechceu.gtceu.client.util; + +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; + +import lombok.Getter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +/** + * Collection of various information for rendering purposes. + */ +@Accessors(fluent = true) +public final class EffectRenderContext { + + private static final EffectRenderContext instance = new EffectRenderContext(); + + public static EffectRenderContext getInstance() { + return instance; + } + + @Getter + private Frustum frustum = new Frustum(Minecraft.getInstance().levelRenderer.getFrustum()); + + @Nullable + private Entity renderViewEntity; + @Getter + private float partialTicks; + @Getter + private double cameraX; + @Getter + private double cameraY; + @Getter + private double cameraZ; + @NotNull + @Getter + private Vec3 cameraViewDir = Vec3.ZERO; + @Getter + private float rotationX; + @Getter + private float rotationZ; + @Getter + private float rotationYZ; + @Getter + private float rotationXY; + @Getter + private float rotationXZ; + + @NotNull + public EffectRenderContext update(@NotNull Entity renderViewEntity, Camera camera, Frustum frustum, + float partialTicks) { + this.renderViewEntity = renderViewEntity; + this.partialTicks = partialTicks; + + this.cameraX = camera.getPosition().x; + this.cameraY = camera.getPosition().y; + this.cameraZ = camera.getPosition().z; + this.cameraViewDir = renderViewEntity.getViewVector(partialTicks); + + float i = 1 - (Minecraft.getInstance().options.getCameraType().isFirstPerson() ? 0 : 2); + float pitch = renderViewEntity.getYRot(); + float yaw = renderViewEntity.getXRot(); + this.rotationX = Mth.cos(yaw * Mth.DEG_TO_RAD) * i; + this.rotationZ = Mth.sin(yaw * Mth.DEG_TO_RAD) * i; + this.rotationYZ = -this.rotationX * Mth.sin(pitch * Mth.DEG_TO_RAD) * i; + this.rotationXY = this.rotationZ * Mth.sin(pitch * Mth.DEG_TO_RAD) * i; + this.rotationXZ = Mth.cos(pitch * Mth.DEG_TO_RAD); + + this.frustum = frustum; + + return this; + } + + /** + * @return render view entity + */ + @NotNull + public Entity renderViewEntity() { + return Objects.requireNonNull(renderViewEntity, "renderViewEntity not available yet"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java new file mode 100644 index 00000000000..9fc75b8e4e3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java @@ -0,0 +1,38 @@ +package com.gregtechceu.gtceu.client.util; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.client.renderer.IRenderSetup; +import com.gregtechceu.gtceu.client.shader.post.BloomType; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.NotNull; + +/** + * Render callback interface for + * {@link BloomEffectUtil#registerBloomRender(IRenderSetup, BloomType, IBloomEffect, BlockEntity)}. + */ +@FunctionalInterface +public interface IBloomEffect { + + /** + * Render the bloom effect. + * + * @param buffer buffer builder + * @param context render context + */ + @OnlyIn(Dist.CLIENT) + void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context); + + /** + * @param context render context + * @return if this effect should be rendered; returning {@code false} skips + * {@link #renderBloomEffect(PoseStack, BufferBuilder, EffectRenderContext)} call. + */ + @OnlyIn(Dist.CLIENT) + default boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { + return true; + } +} 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 5acfe490fb3..47314a1cad5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java @@ -1,7 +1,9 @@ package com.gregtechceu.gtceu.client.util; +import com.mojang.blaze3d.vertex.BufferBuilder; import net.minecraft.core.Direction; import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -88,4 +90,118 @@ public static void renderRing(PoseStack poseStack, VertexConsumer buffer, float } } + + public static void renderCubeFrame(BufferBuilder buffer, double minX, double minY, double minZ, double maxX, + double maxY, double maxZ, float r, float g, float b, float a) { + buffer.vertex(minX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(maxX, minY, minZ).color(r, g, b, a).endVertex(); + + buffer.vertex(minX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(minX, maxY, minZ).color(r, g, b, a).endVertex(); + + buffer.vertex(minX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(minX, minY, maxZ).color(r, g, b, a).endVertex(); + + buffer.vertex(maxX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(minX, maxY, maxZ).color(r, g, b, a).endVertex(); + + buffer.vertex(maxX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(maxX, minY, maxZ).color(r, g, b, a).endVertex(); + + buffer.vertex(maxX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(maxX, maxY, minZ).color(r, g, b, a).endVertex(); + + buffer.vertex(minX, maxY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(minX, maxY, maxZ).color(r, g, b, a).endVertex(); + + buffer.vertex(minX, maxY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(maxX, maxY, minZ).color(r, g, b, a).endVertex(); + + buffer.vertex(maxX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(maxX, minY, maxZ).color(r, g, b, a).endVertex(); + + buffer.vertex(maxX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(maxX, maxY, minZ).color(r, g, b, a).endVertex(); + + buffer.vertex(minX, minY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(maxX, minY, maxZ).color(r, g, b, a).endVertex(); + + buffer.vertex(minX, minY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(minX, maxY, maxZ).color(r, g, b, a).endVertex(); + } + + public static void renderCubeFace(PoseStack poseStack, VertexConsumer buffer, AABB cuboid, float r, float g, + float b, float a, + boolean shade) { + renderCubeFace(poseStack, buffer, + (float) cuboid.minX, (float) cuboid.minY, (float) cuboid.minZ, + (float) cuboid.maxX, (float) cuboid.maxY, (float) cuboid.maxZ, + r, g, b, a, shade); + } + + public static void renderCubeFace(PoseStack poseStack, VertexConsumer buffer, + float minX, float minY, float minZ, + float maxX, float maxY, float maxZ, + float red, float green, float blue, float alpha) { + renderCubeFace(poseStack, buffer, minX, minY, minZ, maxX, maxY, maxZ, red, green, blue, alpha, false); + } + + public static void renderCubeFace(PoseStack poseStack, VertexConsumer buffer, + float minX, float minY, float minZ, + float maxX, float maxY, float maxZ, + float red, float green, float blue, float a, + boolean shade) { + Matrix4f pose = poseStack.last().pose(); + float r = red, g = green, b = blue; + + if (shade) { + r *= 0.6f; + g *= 0.6f; + b *= 0.6f; + } + buffer.vertex(pose, minX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, minX, minY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, minX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, minX, maxY, minZ).color(r, g, b, a).endVertex(); + + buffer.vertex(pose, maxX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, maxY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, minY, maxZ).color(r, g, b, a).endVertex(); + + if (shade) { + r = red * 0.5f; + g = green * 0.5f; + b = blue * 0.5f; + } + buffer.vertex(pose, minX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, minY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, minX, minY, maxZ).color(r, g, b, a).endVertex(); + + if (shade) { + r = red; + g = green; + b = blue; + } + buffer.vertex(pose, minX, maxY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, minX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, maxY, minZ).color(r, g, b, a).endVertex(); + + if (shade) { + r = red * 0.8f; + g = green * 0.8f; + b = blue * 0.8f; + } + buffer.vertex(pose, minX, minY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, minX, maxY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, maxY, minZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, minY, minZ).color(r, g, b, a).endVertex(); + + buffer.vertex(pose, minX, minY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, minY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, maxX, maxY, maxZ).color(r, g, b, a).endVertex(); + buffer.vertex(pose, minX, maxY, maxZ).color(r, g, b, a).endVertex(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java new file mode 100644 index 00000000000..d6a4e59a0db --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java @@ -0,0 +1,44 @@ +package com.gregtechceu.gtceu.client.util; + +import com.gregtechceu.gtceu.client.shader.PostTarget; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; +import net.minecraft.client.Minecraft; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.lwjgl.opengl.*; + +@OnlyIn(Dist.CLIENT) +public class RenderUtil { + + public static boolean updateFBOSize(PostTarget fbo, int width, int height) { + if (fbo.width != width || fbo.height != height) { + fbo.createBuffers(width, height, Minecraft.ON_OSX); + return true; + } + return false; + } + + public static void hookDepthBuffer(RenderTarget fbo, int depthBuffer) { + // Hook DepthBuffer + GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo.frameBufferId); + GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, + depthBuffer, 0); + if (fbo.isStencilEnabled()) { + GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_STENCIL_ATTACHMENT, GL11.GL_TEXTURE_2D, + depthBuffer, 0); + } + } + + public static void hookDepthTexture(RenderTarget fbo, int depthTexture) { + // Hook DepthTexture + GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo.frameBufferId); + if (fbo.isStencilEnabled()) { + GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, + GL11.GL_TEXTURE_2D, depthTexture, 0); + } else { + GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, + GL11.GL_TEXTURE_2D, depthTexture, 0); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java index ca8e848311b..80c6b2d0cd2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -10,6 +10,8 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; +import com.gregtechceu.gtceu.client.particle.GTOverheatParticle; +import com.gregtechceu.gtceu.client.particle.GTParticleManager; import com.gregtechceu.gtceu.common.block.CableBlock; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; @@ -32,10 +34,15 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import lombok.Getter; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,6 +67,8 @@ public class CableBlockEntity extends PipeBlockEntity currentEnergyNet = new WeakReference<>(null); + @SideOnly(Side.CLIENT) + private GTOverheatParticle particle; private static final int meltTemp = 3000; private final EnumMap handlers = new EnumMap<>(Direction.class); @@ -241,6 +250,26 @@ public boolean incrementAmperage(long amps, long voltage) { return false; } + @OnlyIn(Dist.CLIENT) + public boolean isParticleAlive() { + return particle != null && particle.isAlive(); + } + + @OnlyIn(Dist.CLIENT) + public void createParticle() { + particle = new GTOverheatParticle(this, meltTemp, getPipeBlock().getShape(getBlockState(), level, getBlockPos(), CollisionContext.empty()), + getPipeType().insulationLevel >= 0); + GTParticleManager.INSTANCE.addEffect(particle); + } + + @OnlyIn(Dist.CLIENT) + public void killParticle() { + if (isParticleAlive()) { + particle.setExpired(); + particle = null; + } + } + public void applyHeat(int amount) { heatQueue += amount; if (!level.isClientSide && heatSubs == null && temperature + heatQueue > getDefaultTemp()) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java index 49cd4899488..daf0588582d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java @@ -136,14 +136,16 @@ public static NonNullBiConsumer, RegistrateBloc if (border) { model.texture("active", "block/lamps/" + color.getName()); if (state.getValue(LampBlock.BLOOM)) { - model.texture("active_overlay", "block/lamps/" + color.getName() + "_emissive"); + model.texture("active_overlay", "block/lamps/" + color.getName() + "_emissive") + .renderType(GTCEu.id("bloom")); } else { model.texture("active_overlay", "block/lamps/" + color.getName()); } } else { if (state.getValue(LampBlock.BLOOM)) { model.texture("active", - "block/lamps/" + color.getName() + "_borderless_emissive"); + "block/lamps/" + color.getName() + "_borderless_emissive") + .renderType(GTCEu.id("bloom")); } else { model.texture("active", "block/lamps/" + color.getName() + "_borderless"); @@ -245,7 +247,8 @@ public static NonNullBiConsumer, RegistrateBloc ModelFile inactive = prov.models().cubeAll(name, coilType.getTexture()); ModelFile active = prov.models().withExistingParent(name + "_active", GTCEu.id("block/cube_2_layer/all")) .texture("bot_all", coilType.getTexture()) - .texture("top_all", coilType.getTexture().withSuffix("_bloom")); + .texture("top_all", coilType.getTexture().withSuffix("_bloom")) + .renderType(GTCEu.id("bloom")); prov.getVariantBuilder(block) .partialState().with(ActiveBlock.ACTIVE, false).modelForState().modelFile(inactive).addModel() .partialState().with(ActiveBlock.ACTIVE, true).modelForState().modelFile(active).addModel(); @@ -302,7 +305,8 @@ public static NonNullBiConsumer, RegistrateBl ModelFile active = prov.models().withExistingParent(name + "_active", GTCEu.id("block/fire_box_active")) .texture("side", type.side()) .texture("bottom", type.bottom()) - .texture("top", type.top()); + .texture("top", type.top()) + .renderType(GTCEu.id("bloom")); prov.getVariantBuilder(block) .partialState().with(ActiveBlock.ACTIVE, false).modelForState().modelFile(inactive).addModel() .partialState().with(ActiveBlock.ACTIVE, true).modelForState().modelFile(active).addModel(); diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index d2595fab50d..b29dd27e6f3 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -622,6 +622,16 @@ public static class ClientConfigs { @Configurable public ArmorHud armorHud = new ArmorHud(); + @Configurable + @Configurable.Comment("Config options for Shaders and Post-processing Effects") + public ShaderOptions shader = new ShaderOptions(); + + @Configurable + @Configurable.Comment({ + "Whether to hook depth texture. Has no effect on performance, but if there is a problem with rendering, try disabling it.", + "Default: true" }) + public boolean hookDepthTexture = true; + public static class ArmorHud { @Configurable @@ -638,6 +648,173 @@ public static class ArmorHud { @Configurable.Range(min = 0, max = 100) public int hudOffsetY = 0; } + + public static class ShaderOptions { + + @Configurable + @Configurable.Comment("Bloom config options for the fusion reactor.") + public FusionBloom fusionBloom = new FusionBloom(); + + @Configurable + @Configurable.Comment("Particle config option for the Assembly Line") + public boolean assemblyLineParticles = true; + + @Configurable + @Configurable.Comment("Bloom config options for the heat effect (cable burning).") + public HeatEffectBloom heatEffectBloom = new HeatEffectBloom(); + + @Configurable + @Configurable.Comment({ "Whether to use shader programs.", "Default: true" }) + public boolean useShader = true; + + @Configurable + @Configurable.Comment({ "Whether or not to enable Emissive Textures with bloom effect.", "Default: true" }) + public boolean emissiveTexturesBloom = true; + + @Configurable + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast)", "1 - Unity Bloom", + "2 - Unreal Bloom", "Default: 2" }) + @Configurable.Range(min = 0, max = 2) + public int bloomStyle = 2; + + @Configurable + @Configurable.Comment({ + "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights " + + "(e.g., daytime).", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", + "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) + @Configurable.DecimalRange(min = 0) + public float highBrightnessThreshold = 0.5f; + + @Configurable + @Configurable.Comment({ + "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts " + + "(e.g., night/caves).", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", + "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) + @Configurable.DecimalRange(min = 0) + public float lowBrightnessThreshold = 0.2f; + + @Configurable + @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", + "This value should be smaller than highBrightnessThreshold.", + "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "Default: 0.1" }) + @Configurable.DecimalRange(min = 0) + public float baseBrightness = 0.1f; + + @Configurable + @Configurable.Comment({ "Mipmap Size.", "Higher values increase quality, but are slower to render.", + "Default: 5" }) + @Configurable.Range(min = 2, max = 5) + public int nMips = 5; + + @Configurable + @Configurable.Comment({ "Bloom Strength", + "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "Default: 2" }) + @Configurable.DecimalRange(min = 0) + public float strength = 1.5f; + + @Configurable + @Configurable.Comment({ "Blur Step (bloom range)", "Default: 1" }) + @Configurable.DecimalRange(min = 0) + public float step = 1; + + + + public static class FusionBloom { + + @Configurable + @Configurable.Comment({ "Whether to use shader programs.", "Default: true" }) + public boolean useShader = true; + + @Configurable + @Configurable.Comment({ "Bloom Strength", + "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "Default: 2" }) + @Configurable.DecimalRange(min = 0) + public double strength = 1.5; + + @Configurable + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast)", "1 - Unity Bloom", + "2 - Unreal Bloom", "Default: 2" }) + @Configurable.Range(min = 0, max = 2) + public int bloomStyle = 1; + + @Configurable + @Configurable.Comment({ + "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights " + + "(e.g., daytime).", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", + "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) + @Configurable.DecimalRange(min = 0) + public double highBrightnessThreshold = 1.3; + + @Configurable + @Configurable.Comment({ + "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts " + + "(e.g., night/caves).", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", + "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) + @Configurable.DecimalRange(min = 0) + public double lowBrightnessThreshold = 0.3; + + @Configurable + @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", + "This value should be smaller than highBrightnessThreshold.", + "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "Default: 0.1" }) + @Configurable.DecimalRange(min = 0) + public double baseBrightness = 0; + } + + public static class HeatEffectBloom { + + @Configurable + @Configurable.Comment({ "Whether to use shader programs.", "Default: true" }) + public boolean useShader = true; + + @Configurable + @Configurable.Comment({ "Bloom Strength", + "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "Default: 2" }) + @Configurable.DecimalRange(min = 0) + public double strength = 1.1; + + @Configurable + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast)", "1 - Unity Bloom", + "2 - Unreal Bloom", "Default: 2" }) + @Configurable.Range(min = 0, max = 2) + public int bloomStyle = 2; + + @Configurable + @Configurable.Comment({ + "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights " + + "(e.g., daytime).", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", + "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) + @Configurable.DecimalRange(min = 0) + public double highBrightnessThreshold = 1.4; + + @Configurable + @Configurable.Comment({ + "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts " + + "(e.g., night/caves).", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", + "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) + @Configurable.DecimalRange(min = 0) + public double lowBrightnessThreshold = 0.6; + + @Configurable + @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", + "This value should be smaller than highBrightnessThreshold.", + "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "Default: 0.1" }) + @Configurable.DecimalRange(min = 0) + public double baseBrightness = 0; + } + } } public static class DeveloperConfigs { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 605bcce1955..5dc18ea2d23 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -3,10 +3,12 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; import net.minecraft.server.level.BlockDestructionProgress; @@ -98,12 +100,23 @@ private void renderLevel(PoseStack poseStack, float partialTick, long finishNano } } + @Inject(method = "renderChunkLayer", at = @At("HEAD"), cancellable = true) + private void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo ci) { + if (renderType != BloomEffectUtil.getBloomLayer() || BloomEffectUtil.isRenderingBloom.get()) return; + BloomEffectUtil.renderBloomBlockLayer((LevelRenderer) (Object) this, camX, camY, camZ, poseStack, + this.minecraft.gameRenderer.getMainCamera(), this.getFrustum(), renderType, + minecraft.getPartialTick(), projectionMatrix, this.minecraft.cameraEntity); + ci.cancel(); + } + @Shadow - public static void renderShape(PoseStack poseStack, VertexConsumer consumer, VoxelShape shape, double x, double y, - double z, float red, float green, float blue, float alpha) { + private static void renderShape(PoseStack poseStack, VertexConsumer consumer, VoxelShape shape, double x, double y, + double z, float red, float green, float blue, float alpha) { throw new AssertionError(); } + @Shadow public abstract Frustum getFrustum(); + @Inject(method = "renderHitOutline", at = @At("HEAD")) private void renderHitOutline(PoseStack poseStack, VertexConsumer consumer, Entity entity, double camX, double camY, double camZ, BlockPos pos, BlockState state, CallbackInfo ci) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java new file mode 100644 index 00000000000..4f2d322586d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java @@ -0,0 +1,12 @@ +package com.gregtechceu.gtceu.core.mixins; + +import net.minecraft.client.renderer.RenderType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RenderType.class) +public interface RenderTypeAccessor { + + @Accessor(remap = false) + void setChunkLayerId(int id); +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index e416b85be76..e8175fc5653 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -22,6 +22,11 @@ public net.minecraft.world.entity.Entity m_20115_(IZ)V # setSharedFlag public net.minecraft.world.entity.vehicle.Boat f_38285_ # DATA_ID_TYPE +# for bloom +public-f net.minecraft.client.renderer.RenderType f_234324_ # CHUNK_BUFFER_LAYERS +public net.minecraft.client.renderer.LevelRenderer m_172993_(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V # renderChunkLayer +public com.mojang.blaze3d.shaders.Program$Type m_85571_()I # getGlType + # for AE2 to be able to load (idk why but it needs these?) public net.minecraft.world.level.block.Blocks m_50774_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # always public net.minecraft.world.level.block.Blocks m_50805_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # never diff --git a/src/main/resources/assets/gtceu/shaders/core/black_hole.fsh b/src/main/resources/assets/gtceu/shaders/core/black_hole.fsh new file mode 100644 index 00000000000..a3c161f8ab8 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/black_hole.fsh @@ -0,0 +1,215 @@ +#version 140 + +#define AA 2 //change to 1 to increase performance +#define _Speed 3.0 //disk rotation speed +#define _Steps 12. //disk texture layers +#define _Size 0.3 //size of BH + +uniform float u_time; +uniform vec2 u_resolution; +uniform vec3 eye; +uniform vec3 target; +uniform sampler2D texture; + +float hash(float x){ return fract(sin(x)*152754.742);} +float hash(vec2 x){ return hash(x.x + hash(x.y));} + +float value(vec2 p, float f) //value noise +{ + float bl = hash(floor(p*f + vec2(0.,0.))); + float br = hash(floor(p*f + vec2(1.,0.))); + float tl = hash(floor(p*f + vec2(0.,1.))); + float tr = hash(floor(p*f + vec2(1.,1.))); + + vec2 fr = fract(p*f); + fr = (3. - 2.*fr)*fr*fr; + float b = mix(bl, br, fr.x); + float t = mix(tl, tr, fr.x); + return mix(b,t, fr.y); +} + +vec3 background(vec2 fragCoord, float r) +{ + vec2 uv = fragCoord.xy / u_resolution.xy; + vec2 lpos = u_resolution.xy / 2. / u_resolution.x; + vec2 texC2 = fragCoord.xy / u_resolution.x; + vec2 texC = mix(uv, lpos, (20. * r / (distance((texC2 * 2.0 - lpos * 2.0) * 5. + lpos, lpos) - r))); //Black hole shader + vec3 getColor = texture2D(texture,texC).rgb; + return getColor; +} + +vec4 raymarchDisk(vec3 ray, vec3 zeroPos) +{ + //return vec4(1.,1.,1.,0.); //no disk + + vec3 position = zeroPos; + float lengthPos = length(position.xz); + float dist = min(1., lengthPos*(1./_Size) *0.5) * _Size * 0.4 *(1./_Steps) /( abs(ray.y) ); + + position += dist*_Steps*ray*0.5; + + vec2 deltaPos; + deltaPos.x = -zeroPos.z*0.01 + zeroPos.x; + deltaPos.y = zeroPos.x*0.01 + zeroPos.z; + deltaPos = normalize(deltaPos - zeroPos.xz); + + float parallel = dot(ray.xz, deltaPos); + parallel /= sqrt(lengthPos); + parallel *= 0.5; + float redShift = parallel +0.3; + redShift *= redShift; + + redShift = clamp(redShift, 0., 1.); + + float disMix = clamp((lengthPos - _Size * 2.)*(1./_Size)*0.24, 0., 1.); + vec3 insideCol = mix(vec3(1.0,0.8,0.0), vec3(0.5,0.13,0.02)*0.2, disMix); + + insideCol *= mix(vec3(0.4, 0.2, 0.1), vec3(1.6, 2.4, 4.0), redShift); + insideCol *= 1.25; + redShift += 0.12; + redShift *= redShift; + + vec4 o = vec4(0.); + + for(float i = 0. ; i < _Steps; i++) + { + position -= dist * ray ; + + float intensity =clamp( 1. - abs((i - 0.8) * (1./_Steps) * 2.), 0., 1.); + float lengthPos = length(position.xz); + float distMult = 1.; + + distMult *= clamp((lengthPos - _Size * 0.75) * (1./_Size) * 1.5, 0., 1.); + distMult *= clamp(( _Size * 10. -lengthPos) * (1./_Size) * 0.20, 0., 1.); + distMult *= distMult; + + float u = lengthPos + u_time* _Size*0.3 + intensity * _Size * 0.2; + + vec2 xy ; + float rot = mod(u_time*_Speed, 8192.); + xy.x = -position.z*sin(rot) + position.x*cos(rot); + xy.y = position.x*sin(rot) + position.z*cos(rot); + + float x = abs( xy.x/(xy.y)); + float angle = 0.02*atan(x); + + const float f = 70.; + float noise = value( vec2( angle, u * (1./_Size) * 0.05), f); + noise = noise*0.66 + 0.33*value( vec2( angle, u * (1./_Size) * 0.05), f*2.); + + float extraWidth = noise * 1. * (1. - clamp(i * (1./_Steps)*2. - 1., 0., 1.)); + + float alpha = clamp(noise*(intensity + extraWidth)*( (1./_Size) * 10. + 0.01 ) * dist * distMult , 0., 1.); + + vec3 col = 2.*mix(vec3(0.3,0.2,0.15)*insideCol, insideCol, min(1.,intensity*2.)); + o = clamp(vec4(col*alpha + o.rgb*(1.-alpha), o.a*(1.-alpha) + alpha), vec4(0.), vec4(1.)); + + lengthPos *= (1./_Size); + + o.rgb+= redShift*(intensity*1. + 0.5)* (1./_Steps) * 100.*distMult/(lengthPos*lengthPos); + } + + o.rgb = clamp(o.rgb - 0.005, 0., 1.); + return o ; +} + + +mat4 viewMatrix(vec3 eye, vec3 center, vec3 up) { + // Based on gluLookAt man page + vec3 f = normalize(center - eye); + vec3 s = normalize(cross(f, up)); + vec3 u = cross(s, f); + return mat4( + vec4(s, 0.0), + vec4(u, 0.0), + vec4(-f, 0.0), + vec4(0.0, 0.0, 0.0, 1) + ); +} + +vec3 rayDirection(float fieldOfView, vec2 size, vec2 fragCoord) { + vec2 xy = fragCoord - size / 2.0; + float z = size.y / tan(radians(fieldOfView) / 2.0); + return normalize(vec3(xy, -z)); +} + +void main() +{ + gl_FragColor = vec4(0.);; + + vec2 fragCoordRot; + fragCoordRot.x = gl_FragCoord.x*1.0; + fragCoordRot.y = gl_FragCoord.y*1.0; + + for( int j=0; j _Size * 1000.) //ray escaped BH + { + vec3 bg = background (gl_FragCoord.xy, 1./r); + outCol = vec4(col.rgb*col.a + bg.rgb*(1.-col.a) + glow.rgb *(1.-col.a), 1.); + break; + } + + else if (abs(pos.y) <= _Size * 0.002 ) //ray hit accretion disk + { + vec4 diskCol = raymarchDisk(ray, pos); //render disk + pos.y = 0.; + pos += abs(_Size * 0.001 /ray.y) * ray; + col = vec4(diskCol.rgb*(1.-col.a) + col.rgb, col.a + diskCol.a*(1.-col.a)); + } + } + + //if the ray never escaped or got sucked in + if(outCol.r == 100.) + outCol = vec4(col.rgb + glow.rgb *(col.a + glow.a) , 1.); + + col = outCol; + col.rgb = pow( col.rgb, vec3(0.6) ); + + gl_FragColor += col/float(AA*AA); + } +} diff --git a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh new file mode 100644 index 00000000000..c3e821eb892 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh @@ -0,0 +1,31 @@ +#version 120 + +varying vec2 texCoord0; + + +uniform sampler2D buffer_a; +uniform sampler2D buffer_b; +uniform float intensive; +uniform float base; +uniform float threshold_up; +uniform float threshold_down; + +// All components are in the range [0…1], including hue. +//vec3 rgb2hsv(vec3 c) { +// vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); +// vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); +// vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); +// +// float d = q.x - min(q.w, q.y); +// float e = 1.0e-10; +// return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +//} + +void main(void){ + vec3 bloom = texture2D(buffer_b, texCoord0).rgb * intensive; + vec3 background = texture2D(buffer_a, texCoord0).rgb; +// gl_FragColor = vec4(background + bloom * ((1 - rgb2hsv(background).z) * (threshold_up - threshold_down) + threshold_down + base), 1.); + float max = max(background.b, max(background.r, background.g)); + float min = min(background.b, min(background.r, background.g)); + gl_FragColor = vec4(background + bloom * ((1. - (max + min) / 2.) * (threshold_up - threshold_down) + threshold_down + base), 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json new file mode 100644 index 00000000000..ea9cf7daac2 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json @@ -0,0 +1,21 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:image", + "fragment": "gtceu:bloom_combine", + "attributes": [ + ], + "samplers": [ + { "name": "buffer_a" }, + { "name": "buffer_b" } + ], + "uniforms": [ + { "name": "intensive", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "base", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "threshold_up", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "threshold_down", "type": "float", "count": 1, "values": [ 0.0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.fsh b/src/main/resources/assets/gtceu/shaders/core/blur.fsh new file mode 100644 index 00000000000..0482e20a7ef --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/blur.fsh @@ -0,0 +1,25 @@ +#version 120 + +varying vec2 texCoord0; + +uniform sampler2D DiffuseSampler; +uniform vec2 u_resolution; +uniform vec2 blurDir; + +void main(void){ + vec2 pixelSize = blurDir.xy / u_resolution.xy; + vec4 out_colour = vec4(0.0); + + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -5.) * 0.0093; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -4.) * 0.028002; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -3.) * 0.065984; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -2.) * 0.121703; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -1.) * 0.175713; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 0.) * 0.198596; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 1.) * 0.175713; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 2.) * 0.121703; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 3.) * 0.065984; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 4.) * 0.028002; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 5.) * 0.0093; + gl_FragColor = vec4(out_colour.rgb, 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.json b/src/main/resources/assets/gtceu/shaders/core/blur.json new file mode 100644 index 00000000000..69cb55a91c9 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/blur.json @@ -0,0 +1,18 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:image", + "fragment": "gtceu:blur", + "attributes": [ + ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "blurDir", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/composite.fsh b/src/main/resources/assets/gtceu/shaders/core/composite.fsh new file mode 100644 index 00000000000..113ee2c7b01 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/composite.fsh @@ -0,0 +1,25 @@ +#version 120 + +varying vec2 texCoord0; + +uniform sampler2D blurTexture1; +uniform sampler2D blurTexture2; +uniform sampler2D blurTexture3; +uniform sampler2D blurTexture4; +uniform sampler2D blurTexture5; +uniform float bloomStrength; +uniform float bloomRadius; +//uniform float bloomFactors[NUM_MIPS]; +//uniform vec3 bloomTintColors[NUM_MIPS]; + +float lerpBloomFactor(const in float factor) { + float mirrorFactor = 1.2 - factor; + return mix(factor, mirrorFactor, bloomRadius); +} +void main() { + gl_FragColor = bloomStrength * ( lerpBloomFactor(1.) * texture2D(blurTexture1, texCoord0) + + lerpBloomFactor(0.8) * texture2D(blurTexture2, texCoord0) + + lerpBloomFactor(0.6) * texture2D(blurTexture3, texCoord0) + + lerpBloomFactor(0.4) * texture2D(blurTexture4, texCoord0) + + lerpBloomFactor(0.2) * texture2D(blurTexture5, texCoord0) ); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/composite.json b/src/main/resources/assets/gtceu/shaders/core/composite.json new file mode 100644 index 00000000000..14d201576c0 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/composite.json @@ -0,0 +1,22 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:image", + "fragment": "gtceu:composite", + "attributes": [ + ], + "samplers": [ + { "name": "blurTexture1" }, + { "name": "blurTexture2" }, + { "name": "blurTexture3" }, + { "name": "blurTexture4" }, + { "name": "blurTexture5" } + ], + "uniforms": [ + { "name": "bloomStrength", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "bloomRadius", "type": "float", "count": 1, "values": [ 0.0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh new file mode 100644 index 00000000000..86fe8f5401b --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh @@ -0,0 +1,46 @@ +#version 120 + +varying vec2 texCoord0; + +uniform sampler2D DiffuseSampler; +uniform vec2 u_resolution; +uniform vec2 u_resolution2; + +vec4 four_k(vec3 textel, vec2 uv) { + return (texture2D(DiffuseSampler, uv + textel.xx) //1 1 + + texture2D(DiffuseSampler, uv + textel.xy) // 1 -1 + + texture2D(DiffuseSampler, uv + textel.yx) // -1 1 + + texture2D(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 +} + +void main(void) { + vec3 textel1 = vec3(1., -1., 0.) / u_resolution2.xyx; + vec3 textel2 = vec3(1., -1., 0.) / u_resolution.xyx; + + vec4 out_colour = (four_k(textel1, texCoord0 + textel2.yy) + + four_k(textel1, texCoord0 + textel2.zy) + + four_k(textel1, texCoord0 + textel2.yz) + + four_k(textel1, texCoord0)) * 0.25 * 0.125; + + out_colour += (four_k(textel1, texCoord0 + textel2.xy) + + four_k(textel1, texCoord0 + textel2.zy) + + four_k(textel1, texCoord0 + textel2.xz) + + four_k(textel1, texCoord0)) * 0.25 * 0.125; + + out_colour += (four_k(textel1, texCoord0 + textel2.yx) + + four_k(textel1, texCoord0 + textel2.yz) + + four_k(textel1, texCoord0 + textel2.zx) + + four_k(textel1, texCoord0)) * 0.25 * 0.125; + + out_colour += (four_k(textel1, texCoord0 + textel2.xx) + + four_k(textel1, texCoord0 + textel2.xz) + + four_k(textel1, texCoord0 + textel2.zx) + + four_k(textel1, texCoord0)) * 0.25 * 0.125; + + out_colour += (four_k(textel1, texCoord0 + textel1.xx) + + four_k(textel1, texCoord0 + textel1.xy) + + four_k(textel1, texCoord0 + textel1.yx) + + four_k(textel1, texCoord0 + textel1.yy)) * 0.25 * 0.5; + + gl_FragColor = vec4(out_colour.rgb, 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.json b/src/main/resources/assets/gtceu/shaders/core/down_sampling.json new file mode 100644 index 00000000000..efb7863235b --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/down_sampling.json @@ -0,0 +1,18 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:image", + "fragment": "gtceu:blur", + "attributes": [ + ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/image.fsh b/src/main/resources/assets/gtceu/shaders/core/image.fsh new file mode 100644 index 00000000000..12faad8b792 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/image.fsh @@ -0,0 +1,9 @@ +#version 120 + +varying vec2 texCoord0; + +uniform sampler2D DiffuseSampler; + +void main(void) { + gl_FragColor = texture2D(DiffuseSampler, texCoord0).rgba; +} diff --git a/src/main/resources/assets/gtceu/shaders/core/image.json b/src/main/resources/assets/gtceu/shaders/core/image.json new file mode 100644 index 00000000000..d169780a4ba --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/image.json @@ -0,0 +1,16 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:image", + "fragment": "gtceu:image", + "attributes": [ + ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/image.vsh b/src/main/resources/assets/gtceu/shaders/core/image.vsh new file mode 100644 index 00000000000..86480891db8 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/image.vsh @@ -0,0 +1,10 @@ +#version 120 + +in vec3 Position; + +varying vec2 texCoord0; + +void main(void){ + gl_Position = vec4(Position, 1.0); + texCoord0 = Position.xy * 0.5 + 0.5; +} diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh new file mode 100644 index 00000000000..8e69ddcfe70 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh @@ -0,0 +1,31 @@ +#version 120 + +varying vec2 texCoord0; + +uniform sampler2D DiffuseSampler; +uniform vec2 u_resolution; +uniform vec2 texSize; +uniform vec2 blurDir; +uniform int kernel_radius; + + +float gaussianPdf(in float x, in float sigma) { + return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma; +} + +void main(void){ + vec2 invSize = 1.0 / texSize; + float fSigma = float(kernel_radius); + float weightSum = gaussianPdf(0.0, fSigma); + vec3 diffuseSum = texture2D(DiffuseSampler, texCoord0).rgb * weightSum; + for( int i = 1; i < kernel_radius; i ++ ) { + float x = float(i); + float w = gaussianPdf(x, fSigma); + vec2 uvOffset = blurDir * invSize * x; + vec3 sample1 = texture2D(DiffuseSampler, texCoord0 + uvOffset).rgb; + vec3 sample2 = texture2D(DiffuseSampler, texCoord0 - uvOffset).rgb; + diffuseSum += (sample1 + sample2) * w; + weightSum += 2.0 * w; + } + gl_FragColor = vec4(diffuseSum/weightSum, 1.0); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json new file mode 100644 index 00000000000..37409cf5e55 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json @@ -0,0 +1,20 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:image", + "fragment": "gtceu:seperable_blur", + "attributes": [ + ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + { "name": "u_texture", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "texSize", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "blurDir", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "kernel_radius", "type": "int", "count": 1, "values": [ 0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh new file mode 100644 index 00000000000..a3ccc46fefc --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh @@ -0,0 +1,36 @@ +#version 120 + +varying vec2 texCoord0; + +uniform sampler2D upTexture; +uniform sampler2D downTexture; +uniform vec2 u_resolution; +uniform vec2 u_resolution2; + +vec4 four_k(vec3 textel, vec2 uv) { + return (texture2D(upTexture, uv + textel.xx) //1 1 + + texture2D(upTexture, uv + textel.xy) // 1 -1 + + texture2D(upTexture, uv + textel.yx) // -1 1 + + texture2D(upTexture, uv + textel.yy)) * 0.25; // -1 -1 +} + +vec4 up_sampling(vec3 textel, vec2 uv) { + return vec4(four_k(textel, uv).rgb + texture2D(downTexture, uv).rgb, 1.); +} + +void main(void) { + vec3 textel = vec3(1., -1., 0.) / u_resolution.xyx; +// out_colour = up_sampling(textel, texCoord0); + + vec4 out_colour = texture2D(upTexture, texCoord0 + textel.xx); + out_colour += texture2D(upTexture, texCoord0 + textel.xz) * 2.0; + out_colour += texture2D(upTexture, texCoord0 + textel.xy); + out_colour += texture2D(upTexture, texCoord0 + textel.yz) * 2.0; + out_colour += texture2D(upTexture, texCoord0) * 4.0; + out_colour += texture2D(upTexture, texCoord0 + textel.zx) * 2.0; + out_colour += texture2D(upTexture, texCoord0 + textel.yy); + out_colour += texture2D(upTexture, texCoord0 + textel.zy) * 2.0; + out_colour += texture2D(upTexture, texCoord0 + textel.yx); + + gl_FragColor = vec4(out_colour.rgb * 0.8 / 16. + texture2D(downTexture, texCoord0).rgb * 0.8, 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/up_sampling.json b/src/main/resources/assets/gtceu/shaders/core/up_sampling.json new file mode 100644 index 00000000000..a7209863ad4 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/up_sampling.json @@ -0,0 +1,19 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:image", + "fragment": "gtceu:blur", + "attributes": [ + ], + "samplers": [ + { "name": "upTexture" }, + { "name": "downTexture" } + ], + "uniforms": [ + { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] } + ] +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index ec71dfef3bb..b68d88d7f6a 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -16,6 +16,7 @@ "LevelRendererMixin", "ModelManagerMixin", "MultiPlayerGameModeMixin", + "RenderTypeAccessor", "rei.FluidEntryRendererMixin" ], "mixins": [ From 30167c132678bed237071a001ae239ee7050e156 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 3 Oct 2024 15:46:19 +0300 Subject: [PATCH 002/269] it no worky --- dependencies.gradle | 2 +- gradle/scripts/moddevgradle.gradle | 25 +++++ .../forge/ForgeClientEventListener.java | 7 ++ .../client/particle/GTParticleManager.java | 5 +- .../gtceu/client/renderer/GTRenderTypes.java | 3 +- .../gtceu/client/shader/post/BloomEffect.java | 19 ++-- .../gtceu/client/util/BloomEffectUtil.java | 95 +++++++++---------- .../client/util/EffectRenderContext.java | 15 ++- .../gtceu/config/ConfigHolder.java | 2 - .../DefaultTerrainRenderPassesAccessor.java | 17 ++++ .../assets/gtceu/shaders/core/blur.fsh | 24 ++--- .../assets/gtceu/shaders/core/blur.json | 2 +- .../gtceu/shaders/core/down_sampling.fsh | 10 +- .../gtceu/shaders/core/down_sampling.json | 2 +- .../assets/gtceu/shaders/core/image.fsh | 4 +- .../assets/gtceu/shaders/core/image.json | 2 +- .../gtceu/shaders/core/seperable_blur.fsh | 8 +- .../gtceu/shaders/core/seperable_blur.json | 2 +- src/main/resources/gtceu.mixins.json | 1 + 19 files changed, 144 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java diff --git a/dependencies.gradle b/dependencies.gradle index 5946f47e34c..8b5417a8810 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -58,7 +58,7 @@ dependencies { // Shimmer modCompileOnly(forge.shimmer.forge) { transitive = false } - modCompileOnly("maven.modrinth:embeddium:0.3.31+mc1.20.1") + modImplementation("maven.modrinth:embeddium:0.3.31+mc1.20.1") modCompileOnly("maven.modrinth:oculus:1.20.1-1.7.0") // JAVD diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index d5c5545250e..e0ed2ffa138 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -84,3 +84,28 @@ idea { downloadJavadoc = true } } + +tasks.register("run + RenderDoc", Exec.class) { + var javaHome = org.gradle.internal.jvm.Jvm.current().javaHome + + commandLine = [ + "C:\\Program Files\\RenderDoc\\renderdoccmd.exe", + "capture", + "--opt-api-validation", // Remove if you don't want api validation + "--opt-api-validation-unmute", // Remove if you don't want api validation + "--opt-hook-children", + "--wait-for-exit", + "--working-dir", + ".", + "$javaHome/bin/java.exe", + "-Xmx64m", + "-Xms64m", + //"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005", // Uncomment for remote debug + "-Dorg.gradle.appname=gradlew", + "-Dorg.gradle.java.home=$javaHome", + "-classpath", + "./gradle/wrapper/gradle-wrapper.jar", + "org.gradle.wrapper.GradleWrapperMain", + "runClient", + ] +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 1a7d80450bf..7158086e9b9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.client.TooltipsHandler; import com.gregtechceu.gtceu.client.renderer.BlockHighLightRenderer; import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.gregtechceu.gtceu.client.util.TooltipHelper; import net.minecraftforge.api.distmarker.Dist; @@ -13,6 +14,7 @@ import net.minecraftforge.client.event.*; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -35,6 +37,11 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { } } + @SubscribeEvent + public static void onLevelUnload(LevelEvent.Unload event) { + BloomEffectUtil.invalidateLevelTickets(event.getLevel()); + } + @SubscribeEvent public static void onBlockHighlightEvent(RenderHighlightEvent.Block event) { BlockHighLightRenderer.renderBlockHighLight(event.getPoseStack(), event.getCamera(), event.getTarget(), diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 82b49170dae..16cd73ba9c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -123,8 +123,9 @@ public void renderParticles(@NotNull PoseStack poseStack, @NotNull Entity render Frustum frustum, float partialTicks) { if (depthEnabledParticles.isEmpty() && depthDisabledParticles.isEmpty()) return; - EffectRenderContext instance = EffectRenderContext.getInstance().update(renderViewEntity, camera, frustum, - partialTicks); + EffectRenderContext instance = EffectRenderContext.getInstance() + .update(renderViewEntity, camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, + frustum, partialTicks); RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); 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 fdb19ba296f..8f48184b358 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.client.renderer; +import com.gregtechceu.gtceu.client.shader.Shaders; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraftforge.api.distmarker.Dist; @@ -22,7 +23,7 @@ public class GTRenderTypes extends RenderType { 256, false, false, RenderType.CompositeState.builder() .setCullState(RenderStateShard.NO_CULL) - .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_NO_CRUMBLING_SHADER) + .setShaderState(new RenderStateShard.ShaderStateShard(() -> Shaders.BLOOM_COMBINE)) .setTransparencyState(RenderStateShard.ADDITIVE_TRANSPARENCY) .setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java index 1c69425a23c..c41d2e554a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java @@ -30,8 +30,8 @@ private static void blend(PostTarget bloom, RenderTarget backgroundFBO) { // blend shader Shaders.renderFullImageInFBO(PingPongBuffer.swap(), Shaders.BLOOM_COMBINE, shaderInstance -> { - shaderInstance.setSampler("buffer_a", backgroundFBO.getColorTextureId()); - shaderInstance.setSampler("buffer_b", bloom.getColorTextureId()); + shaderInstance.setSampler("buffer_a", backgroundFBO); + shaderInstance.setSampler("buffer_b", bloom); shaderInstance.safeGetUniform("intensive").set(strength); shaderInstance.safeGetUniform("base").set(baseBrightness); shaderInstance.safeGetUniform("threshold_up").set(highBrightnessThreshold); @@ -132,8 +132,8 @@ private static void renderUpSampling(RenderTarget U, RenderTarget D, RenderTarge RenderSystem.setShaderTexture(1, D.getColorTextureId()); Shaders.renderFullImageInFBO(T, Shaders.UP_SAMPLING, uniformCache -> { - uniformCache.setSampler("upTexture", U.getColorTextureId()); - uniformCache.setSampler("downTexture", D.getColorTextureId()); + uniformCache.setSampler("upTexture", U); + uniformCache.setSampler("downTexture", D); uniformCache.safeGetUniform("u_resolution2").set((float) U.width, (float) U.height); }); } @@ -168,12 +168,11 @@ public static void renderUnreal(PostTarget highLightFBO, RenderTarget background } Shaders.renderFullImageInFBO(downSampleFBO[0], Shaders.COMPOSITE, uniformCache -> { - //noinspection PointlessArithmeticExpression - uniformCache.setSampler("blurTexture1", GL13.GL_TEXTURE0 + 0); - uniformCache.setSampler("blurTexture2", GL13.GL_TEXTURE0 + 1); - uniformCache.setSampler("blurTexture3", GL13.GL_TEXTURE0 + 2); - uniformCache.setSampler("blurTexture4", GL13.GL_TEXTURE0 + 3); - uniformCache.setSampler("blurTexture5", GL13.GL_TEXTURE0 + 4); + uniformCache.setSampler("blurTexture1", downSampleFBO[0]); + uniformCache.setSampler("blurTexture2", downSampleFBO[1]); + uniformCache.setSampler("blurTexture3", downSampleFBO.length > 2 ? downSampleFBO[2] : null); + uniformCache.setSampler("blurTexture4", downSampleFBO.length > 3 ? downSampleFBO[3] : null); + uniformCache.setSampler("blurTexture5", downSampleFBO.length > 4 ? downSampleFBO[4] : null); uniformCache.safeGetUniform("bloomStrength").set(strength); uniformCache.safeGetUniform("bloomRadius").set(1.0f); }); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 97b4d4fee83..c89fdd0a885 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -12,6 +12,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.RenderTypeAccessor; +import com.gregtechceu.gtceu.core.mixins.embeddium.DefaultTerrainRenderPassesAccessor; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; @@ -30,6 +31,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -44,6 +46,7 @@ import org.lwjgl.opengl.GL30; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.*; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; @@ -71,7 +74,7 @@ public static RenderType getBloomLayer() { /** * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is + * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is * disabled, {@link RenderType#cutout()} is returned instead. * * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#cutout()} if bloom @@ -85,7 +88,7 @@ public static RenderType getEffectiveBloomLayer() { /** * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is + * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is * disabled, the fallback layer specified is returned instead. * * @param fallback Block render layer to be returned when bloom layer is disabled @@ -95,17 +98,17 @@ public static RenderType getEffectiveBloomLayer() { */ @Contract("null -> _; !null -> !null") public static RenderType getEffectiveBloomLayer(RenderType fallback) { - return GTCEu.isOptifineLoaded() ? fallback : bloom; + return GTCEu.isIrisOculusLoaded() ? fallback : bloom; } /** * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is - * disabled, {@link RenderType#CUTOUT} is returned instead. + * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is + * disabled, {@link RenderType#cutout()} is returned instead. * * @param isBloomActive Whether bloom layer should be active. If this value is {@code false}, {@code fallback} layer - * will be returned. Has no effect if Optifine is present. - * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#CUTOUT} if bloom + * will be returned. Has no effect if Iris/Oculus is present. + * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#cutout()} if bloom * layer is disabled * @see #getEffectiveBloomLayer(boolean, RenderType) */ @@ -116,18 +119,18 @@ public static RenderType getEffectiveBloomLayer(boolean isBloomActive) { /** * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Optifine. If the actual bloom layer is + * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is * disabled, the fallback layer specified is returned instead. * * @param isBloomActive Whether bloom layer should be active. If this value is {@code false}, {@code fallback} layer - * will be returned. Has no effect if Optifine is present. + * will be returned. Has no effect if Iris/Oculus is present. * @param fallback Block render layer to be returned when bloom layer is disabled * @return {@link RenderType} instance for the bloom render layer, or {@code fallback} if bloom layer is * disabled */ @Contract("_, null -> _; _, !null -> !null") public static RenderType getEffectiveBloomLayer(boolean isBloomActive, RenderType fallback) { - return GTCEu.isOptifineLoaded() || !isBloomActive ? fallback : bloom; + return GTCEu.isIrisOculusLoaded() || !isBloomActive ? fallback : bloom; } /** @@ -137,7 +140,7 @@ public static RenderType getEffectiveBloomLayer(boolean isBloomActive, RenderTyp * manually freed by calling {@link BloomRenderTicket#invalidate()}. *

*

- * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. *

* @@ -179,7 +182,7 @@ public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { * {@link BloomRenderTicket#invalidate()}. *

*

- * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. *

* @@ -205,7 +208,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup * manually freed by calling {@link BloomRenderTicket#invalidate()}, or invalidated by validity checker. *

*

- * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. *

* @@ -234,7 +237,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup * manually freed by calling {@link BloomRenderTicket#invalidate()}, or invalidated by validity checker. *

*

- * This method does not register bloom render ticket when Optifine is present, and an invalid ticket will be + * This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. *

* @@ -257,7 +260,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { - if (GTCEu.isOptifineLoaded()) return BloomRenderTicket.INVALID; + if (GTCEu.isIrisOculusLoaded()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.lock(); try { @@ -269,23 +272,23 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup } /** - * Invalidate tickets associated with given world. + * Invalidate tickets associated with given level. * - * @param world Level + * @param level the level that was unloaded */ - public static void invalidateLevelTickets(@NotNull Level world) { - Objects.requireNonNull(world, "world == null"); + public static void invalidateLevelTickets(@NotNull LevelAccessor level) { + Objects.requireNonNull(level, "level == null"); BLOOM_RENDER_LOCK.lock(); try { for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { - if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == world) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { ticket.invalidate(); } } for (Map.Entry> e : BLOOM_RENDERS.entrySet()) { for (BloomRenderTicket ticket : e.getValue()) { - if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == world) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { ticket.invalidate(); } } @@ -304,30 +307,24 @@ public static void init() { .build(); if (GTCEu.isSodiumRubidiumEmbeddiumLoaded()) { - try { - // Add our render type to embeddium's render passes by force (until an API is added) - - /* FOR UNRELEASED EMBEDDIUM!!! - Field field = DefaultTerrainRenderPasses.class.getDeclaredField("RENDER_PASS_MAPPINGS"); - FieldUtils.removeFinalModifier(field); - field.set(null, new HashMap<>(DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS)); - - TerrainRenderPass bloomPass = TerrainRenderPass.builder() - .layer(bloom) - .fragmentDiscard(true) - .useReverseOrder(true) - .useTranslucencySorting(true) - .build(); - DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS.put(bloom, List.of(bloomPass)); - */ - TerrainRenderPass bloomPass = new TerrainRenderPass(bloom, true, true); - - Field field = DefaultTerrainRenderPasses.class.getDeclaredField("ALL"); - FieldUtils.removeFinalModifier(field); - field.set(null, ArrayUtils.add(DefaultTerrainRenderPasses.ALL, bloomPass)); - } catch (IllegalAccessException | NoSuchFieldException e) { - throw new RuntimeException(e); - } + // Add our render type to embeddium's render passes by force (until an API is added) + + /* FOR UNRELEASED EMBEDDIUM!!! + Field field = DefaultTerrainRenderPasses.class.getDeclaredField("RENDER_PASS_MAPPINGS"); + FieldUtils.removeFinalModifier(field); + field.set(null, new HashMap<>(DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS)); + + TerrainRenderPass bloomPass = TerrainRenderPass.builder() + .layer(bloom) + .fragmentDiscard(true) + .useReverseOrder(false) + .useTranslucencySorting(true) + .build(); + DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS.put(bloom, List.of(bloomPass)); + */ + TerrainRenderPass bloomPass = new TerrainRenderPass(bloom, false, true); + + DefaultTerrainRenderPassesAccessor.setAll(ArrayUtils.add(DefaultTerrainRenderPasses.ALL, bloomPass)); } } @@ -345,14 +342,14 @@ public static void renderBloomBlockLayer(LevelRenderer levelRenderer, Minecraft.getInstance().getProfiler().popPush("BTLayer"); isRenderingBloom.set(true); - if (GTCEu.isOptifineLoaded()) { + if (GTCEu.isIrisOculusLoaded()) { levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); return; } BLOOM_RENDER_LOCK.lock(); try { - renderBloomInternal(levelRenderer, camX, camY, camZ, poseStack, camera, frustum, blockRenderLayer, partialTicks, projectionMatrix, entity); + renderBloomInternal(levelRenderer, camX, camY, camZ, poseStack, frustum, blockRenderLayer, partialTicks, projectionMatrix, entity); } finally { BLOOM_RENDER_LOCK.unlock(); isRenderingBloom.set(false); @@ -362,7 +359,6 @@ public static void renderBloomBlockLayer(LevelRenderer levelRenderer, private static void renderBloomInternal(LevelRenderer levelRenderer, double camX, double camY, double camZ, PoseStack poseStack, - Camera camera, Frustum frustum, RenderType blockRenderLayer, double partialTicks, @@ -370,7 +366,8 @@ private static void renderBloomInternal(LevelRenderer levelRenderer, @NotNull Entity entity) { preDraw(); - EffectRenderContext context = EffectRenderContext.getInstance().update(entity, camera, frustum, (float) partialTicks); + EffectRenderContext context = EffectRenderContext.getInstance() + .update(entity, camX, camY, camZ, frustum, (float) partialTicks); if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { RenderSystem.depthMask(true); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java b/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java index e91b3cd9358..670ec134f36 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java @@ -39,9 +39,6 @@ public static EffectRenderContext getInstance() { private double cameraY; @Getter private double cameraZ; - @NotNull - @Getter - private Vec3 cameraViewDir = Vec3.ZERO; @Getter private float rotationX; @Getter @@ -54,15 +51,15 @@ public static EffectRenderContext getInstance() { private float rotationXZ; @NotNull - public EffectRenderContext update(@NotNull Entity renderViewEntity, Camera camera, Frustum frustum, - float partialTicks) { + public EffectRenderContext update(@NotNull Entity renderViewEntity, + double camX, double camY, double camZ, + Frustum frustum, float partialTicks) { this.renderViewEntity = renderViewEntity; this.partialTicks = partialTicks; - this.cameraX = camera.getPosition().x; - this.cameraY = camera.getPosition().y; - this.cameraZ = camera.getPosition().z; - this.cameraViewDir = renderViewEntity.getViewVector(partialTicks); + this.cameraX = camX; + this.cameraY = camY; + this.cameraZ = camZ; float i = 1 - (Minecraft.getInstance().options.getCameraType().isFirstPerson() ? 0 : 2); float pitch = renderViewEntity.getYRot(); diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index b29dd27e6f3..d2fa24339e4 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -721,8 +721,6 @@ public static class ShaderOptions { @Configurable.DecimalRange(min = 0) public float step = 1; - - public static class FusionBloom { @Configurable diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java new file mode 100644 index 00000000000..5685005d50e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java @@ -0,0 +1,17 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = DefaultTerrainRenderPasses.class, remap = false) +public interface DefaultTerrainRenderPassesAccessor { + + @Mutable + @Accessor(value = "ALL") + static void setAll(TerrainRenderPass[] value) { + throw new AssertionError(); + } +} diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.fsh b/src/main/resources/assets/gtceu/shaders/core/blur.fsh index 0482e20a7ef..e10b449e3e1 100644 --- a/src/main/resources/assets/gtceu/shaders/core/blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/blur.fsh @@ -2,7 +2,7 @@ varying vec2 texCoord0; -uniform sampler2D DiffuseSampler; +uniform sampler2D Sampler0; uniform vec2 u_resolution; uniform vec2 blurDir; @@ -10,16 +10,16 @@ void main(void){ vec2 pixelSize = blurDir.xy / u_resolution.xy; vec4 out_colour = vec4(0.0); - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -5.) * 0.0093; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -4.) * 0.028002; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -3.) * 0.065984; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -2.) * 0.121703; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -1.) * 0.175713; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 0.) * 0.198596; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 1.) * 0.175713; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 2.) * 0.121703; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 3.) * 0.065984; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 4.) * 0.028002; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 5.) * 0.0093; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -5.) * 0.0093; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -4.) * 0.028002; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -3.) * 0.065984; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -2.) * 0.121703; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -1.) * 0.175713; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 0.) * 0.198596; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 1.) * 0.175713; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 2.) * 0.121703; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 3.) * 0.065984; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 4.) * 0.028002; + out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 5.) * 0.0093; gl_FragColor = vec4(out_colour.rgb, 1.); } diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.json b/src/main/resources/assets/gtceu/shaders/core/blur.json index 69cb55a91c9..7fb0bf03421 100644 --- a/src/main/resources/assets/gtceu/shaders/core/blur.json +++ b/src/main/resources/assets/gtceu/shaders/core/blur.json @@ -9,7 +9,7 @@ "attributes": [ ], "samplers": [ - { "name": "DiffuseSampler" } + { "name": "Sampler0" } ], "uniforms": [ { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh index 86fe8f5401b..f27f303e9ce 100644 --- a/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh @@ -2,15 +2,15 @@ varying vec2 texCoord0; -uniform sampler2D DiffuseSampler; +uniform sampler2D Sampler0; uniform vec2 u_resolution; uniform vec2 u_resolution2; vec4 four_k(vec3 textel, vec2 uv) { - return (texture2D(DiffuseSampler, uv + textel.xx) //1 1 - + texture2D(DiffuseSampler, uv + textel.xy) // 1 -1 - + texture2D(DiffuseSampler, uv + textel.yx) // -1 1 - + texture2D(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 + return (texture2D(Sampler0, uv + textel.xx) //1 1 + + texture2D(Sampler0, uv + textel.xy) // 1 -1 + + texture2D(Sampler0, uv + textel.yx) // -1 1 + + texture2D(Sampler0, uv + textel.yy)) * 0.25; // -1 -1 } void main(void) { diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.json b/src/main/resources/assets/gtceu/shaders/core/down_sampling.json index efb7863235b..29cfa1c65b3 100644 --- a/src/main/resources/assets/gtceu/shaders/core/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/core/down_sampling.json @@ -9,7 +9,7 @@ "attributes": [ ], "samplers": [ - { "name": "DiffuseSampler" } + { "name": "Sampler0" } ], "uniforms": [ { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, diff --git a/src/main/resources/assets/gtceu/shaders/core/image.fsh b/src/main/resources/assets/gtceu/shaders/core/image.fsh index 12faad8b792..bdc4bc382fa 100644 --- a/src/main/resources/assets/gtceu/shaders/core/image.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/image.fsh @@ -2,8 +2,8 @@ varying vec2 texCoord0; -uniform sampler2D DiffuseSampler; +uniform sampler2D Sampler0; void main(void) { - gl_FragColor = texture2D(DiffuseSampler, texCoord0).rgba; + gl_FragColor = texture2D(Sampler0, texCoord0).rgba; } diff --git a/src/main/resources/assets/gtceu/shaders/core/image.json b/src/main/resources/assets/gtceu/shaders/core/image.json index d169780a4ba..e0beb7c0bb8 100644 --- a/src/main/resources/assets/gtceu/shaders/core/image.json +++ b/src/main/resources/assets/gtceu/shaders/core/image.json @@ -9,7 +9,7 @@ "attributes": [ ], "samplers": [ - { "name": "DiffuseSampler" } + { "name": "Sampler0" } ], "uniforms": [ ] diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh index 8e69ddcfe70..178466f212f 100644 --- a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh @@ -2,7 +2,7 @@ varying vec2 texCoord0; -uniform sampler2D DiffuseSampler; +uniform sampler2D Sampler0; uniform vec2 u_resolution; uniform vec2 texSize; uniform vec2 blurDir; @@ -17,13 +17,13 @@ void main(void){ vec2 invSize = 1.0 / texSize; float fSigma = float(kernel_radius); float weightSum = gaussianPdf(0.0, fSigma); - vec3 diffuseSum = texture2D(DiffuseSampler, texCoord0).rgb * weightSum; + vec3 diffuseSum = texture2D(Sampler0, texCoord0).rgb * weightSum; for( int i = 1; i < kernel_radius; i ++ ) { float x = float(i); float w = gaussianPdf(x, fSigma); vec2 uvOffset = blurDir * invSize * x; - vec3 sample1 = texture2D(DiffuseSampler, texCoord0 + uvOffset).rgb; - vec3 sample2 = texture2D(DiffuseSampler, texCoord0 - uvOffset).rgb; + vec3 sample1 = texture2D(Sampler0, texCoord0 + uvOffset).rgb; + vec3 sample2 = texture2D(Sampler0, texCoord0 - uvOffset).rgb; diffuseSum += (sample1 + sample2) * w; weightSum += 2.0 * w; } diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json index 37409cf5e55..7c4bda96f86 100644 --- a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json +++ b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json @@ -9,7 +9,7 @@ "attributes": [ ], "samplers": [ - { "name": "DiffuseSampler" } + { "name": "Sampler0" } ], "uniforms": [ { "name": "u_texture", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index b68d88d7f6a..2a9266cbda3 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -58,6 +58,7 @@ "ae2.GenericStackInvAccessor", "create.RotationPropagatorMixin", "embeddium.BiomeColorCacheMixin", + "embeddium.DefaultTerrainRenderPassesAccessor", "embeddium.VanillaColorAdapterMixin", "emi.FluidEmiStackMixin", "jei.FluidHelperMixin", From 5a7e9f876a495cff92cde5cd4cc11824e42f1937 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 3 Oct 2024 21:54:47 +0300 Subject: [PATCH 003/269] wtfuck (need to remake completely) --- .../gtceu/client/renderer/GTRenderTypes.java | 3 +- .../gtceu/client/shader/Shaders.java | 31 +++++++----------- .../gtceu/client/shader/post/BloomEffect.java | 10 +++--- .../gtceu/client/util/BloomEffectUtil.java | 21 +++++------- .../gtceu/core/mixins/LevelRendererMixin.java | 28 ++++++++++------ .../embeddium/DefaultMaterialsMixin.java | 25 +++++++++++++++ .../assets/gtceu/shaders/core/black_hole.fsh | 10 +++--- .../gtceu/shaders/core/bloom_combine.fsh | 12 ++++--- .../gtceu/shaders/core/bloom_combine.json | 9 +++--- .../assets/gtceu/shaders/core/blur.fsh | 32 ++++++++++--------- .../assets/gtceu/shaders/core/blur.json | 7 ++-- .../assets/gtceu/shaders/core/composite.fsh | 9 ++++-- .../assets/gtceu/shaders/core/composite.json | 5 +-- .../gtceu/shaders/core/down_sampling.fsh | 20 ++++++------ .../gtceu/shaders/core/down_sampling.json | 6 ++-- .../assets/gtceu/shaders/core/image.fsh | 10 +++--- .../assets/gtceu/shaders/core/image.json | 1 + .../assets/gtceu/shaders/core/image.vsh | 16 +++++++--- .../gtceu/shaders/core/seperable_blur.fsh | 15 +++++---- .../gtceu/shaders/core/seperable_blur.json | 11 ++++--- .../assets/gtceu/shaders/core/up_sampling.fsh | 10 +++--- .../gtceu/shaders/core/up_sampling.json | 5 +-- src/main/resources/gtceu.mixins.json | 1 + 23 files changed, 174 insertions(+), 123 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java 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 8f48184b358..78cf7e08ead 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.client.renderer; -import com.gregtechceu.gtceu.client.shader.Shaders; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraftforge.api.distmarker.Dist; @@ -23,7 +22,7 @@ public class GTRenderTypes extends RenderType { 256, false, false, RenderType.CompositeState.builder() .setCullState(RenderStateShard.NO_CULL) - .setShaderState(new RenderStateShard.ShaderStateShard(() -> Shaders.BLOOM_COMBINE)) + .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) .setTransparencyState(RenderStateShard.ADDITIVE_TRANSPARENCY) .setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java index 8d0e9b14f97..af5cac195ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java @@ -3,7 +3,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.config.ConfigHolder; import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.shaders.Program; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; @@ -11,6 +13,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.lwjgl.opengl.GL30; import java.io.IOException; import java.util.HashMap; @@ -21,7 +24,6 @@ public class Shaders { public static Minecraft mc; - private final static Map FULL_IMAGE_PROGRAMS; public static ShaderInstance IMAGE; // public static ShaderObject BLACK_HOLE; @@ -40,7 +42,6 @@ public class Shaders { static { mc = Minecraft.getInstance(); - FULL_IMAGE_PROGRAMS = new HashMap<>(); if (allowedShader()) { initShaders(); } @@ -55,7 +56,6 @@ public static void initShaders() { UP_SAMPLING = initShader(UP_SAMPLING, GTCEu.id("up_sampling")); S_BLUR = initShader(S_BLUR, GTCEu.id("seperable_blur")); COMPOSITE = initShader(COMPOSITE, GTCEu.id("composite")); - FULL_IMAGE_PROGRAMS.clear(); } private static ShaderInstance initShader(ShaderInstance object, ResourceLocation location) { @@ -85,16 +85,10 @@ public static boolean allowedShader() { public static RenderTarget renderFullImageInFBO(RenderTarget fbo, ShaderInstance shader, Consumer uniformApplicator) { if (fbo == null || shader == null || !allowedShader()) return fbo; - // int lastID = glGetInteger(GL30.GL_FRAMEBUFFER_BINDING); + // int lastID = GlStateManager.getBoundFramebuffer(); fbo.bindWrite(true); - Program program = FULL_IMAGE_PROGRAMS.get(shader); - if (program == null) { - program = shader.getFragmentProgram(); - FULL_IMAGE_PROGRAMS.put(shader, program); - } - shader.safeGetUniform("u_resolution").set(fbo.width, fbo.height); if (uniformApplicator != null) { uniformApplicator.accept(shader); @@ -103,18 +97,17 @@ public static RenderTarget renderFullImageInFBO(RenderTarget fbo, ShaderInstance Tesselator tesselator = Tesselator.getInstance(); BufferBuilder buffer = tesselator.getBuilder(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); - buffer.vertex(-1, 1, 0).color(0xFFFFFFFF).uv(0, 0).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); - buffer.vertex(-1, -1, 0).color(0xFFFFFFFF).uv(0, 1).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); - buffer.vertex(1, -1, 0).color(0xFFFFFFFF).uv(1, 1).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); - buffer.vertex(1, 1, 0).color(0xFFFFFFFF).uv(1, 0).uv2(LightTexture.FULL_BRIGHT).normal(0.0f, 0.0f, 1.0f).endVertex(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); + buffer.vertex(-1, 1, 0).color(0xFFFFFFFF).uv(0, 0).endVertex(); + buffer.vertex(-1, -1, 0).color(0xFFFFFFFF).uv(0, 1).endVertex(); + buffer.vertex(1, -1, 0).color(0xFFFFFFFF).uv(1, 1).endVertex(); + buffer.vertex(1, 1, 0).color(0xFFFFFFFF).uv(1, 0).endVertex(); tesselator.end(); - shader.clear(); - // GlStateManager.viewport(0, 0, mc.displayWidth, mc.displayHeight); + // RenderSystem.viewport(0, 0, mc.getWindow().getWidth(), mc.getWindow().getHeight()); - // OpenGlHelper.glBindFramebuffer(OpenGlHelper.GL_FRAMEBUFFER, lastID); - fbo.unbindWrite(); + // GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, lastID); + fbo.bindWrite(false); return fbo; } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java index c41d2e554a5..72558adc29c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java @@ -168,11 +168,11 @@ public static void renderUnreal(PostTarget highLightFBO, RenderTarget background } Shaders.renderFullImageInFBO(downSampleFBO[0], Shaders.COMPOSITE, uniformCache -> { - uniformCache.setSampler("blurTexture1", downSampleFBO[0]); - uniformCache.setSampler("blurTexture2", downSampleFBO[1]); - uniformCache.setSampler("blurTexture3", downSampleFBO.length > 2 ? downSampleFBO[2] : null); - uniformCache.setSampler("blurTexture4", downSampleFBO.length > 3 ? downSampleFBO[3] : null); - uniformCache.setSampler("blurTexture5", downSampleFBO.length > 4 ? downSampleFBO[4] : null); + uniformCache.setSampler("blurTexture1", upSampleFBO[0]); + uniformCache.setSampler("blurTexture2", upSampleFBO[1]); + uniformCache.setSampler("blurTexture3", upSampleFBO.length > 2 ? upSampleFBO[2] : null); + uniformCache.setSampler("blurTexture4", upSampleFBO.length > 3 ? upSampleFBO[3] : null); + uniformCache.setSampler("blurTexture5", upSampleFBO.length > 4 ? upSampleFBO[4] : null); uniformCache.safeGetUniform("bloomStrength").set(strength); uniformCache.safeGetUniform("bloomRadius").set(1.0f); }); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index c89fdd0a885..614a1816363 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -21,11 +21,10 @@ import lombok.Getter; import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import net.minecraft.client.Camera; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; @@ -36,7 +35,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.reflect.FieldUtils; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -45,8 +43,6 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL30; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.util.*; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; @@ -298,6 +294,8 @@ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { } } + public static Supplier> EMBEDDIUM_MATERIAL_BLOOM; + public static void init() { bloom = GTRenderTypes.getBloom(); ((RenderTypeAccessor)bloom).setChunkLayerId(RenderType.chunkBufferLayers().size()); @@ -323,24 +321,22 @@ public static void init() { DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS.put(bloom, List.of(bloomPass)); */ TerrainRenderPass bloomPass = new TerrainRenderPass(bloom, false, true); - DefaultTerrainRenderPassesAccessor.setAll(ArrayUtils.add(DefaultTerrainRenderPasses.ALL, bloomPass)); + + Material bloomMaterial = new Material(bloomPass, AlphaCutoffParameter.ZERO, true); + EMBEDDIUM_MATERIAL_BLOOM = () -> () -> bloomMaterial; } } - public static final ThreadLocal isRenderingBloom = ThreadLocal.withInitial(() -> false); - - public static void renderBloomBlockLayer(LevelRenderer levelRenderer, + public static void renderBloomChunkLayer(LevelRenderer levelRenderer, double camX, double camY, double camZ, PoseStack poseStack, - Camera camera, Frustum frustum, RenderType blockRenderLayer, // 70% sure it's translucent uh yeah double partialTicks, Matrix4f projectionMatrix, @NotNull Entity entity) { Minecraft.getInstance().getProfiler().popPush("BTLayer"); - isRenderingBloom.set(true); if (GTCEu.isIrisOculusLoaded()) { levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); @@ -352,7 +348,6 @@ public static void renderBloomBlockLayer(LevelRenderer levelRenderer, renderBloomInternal(levelRenderer, camX, camY, camZ, poseStack, frustum, blockRenderLayer, partialTicks, projectionMatrix, entity); } finally { BLOOM_RENDER_LOCK.unlock(); - isRenderingBloom.set(false); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 5dc18ea2d23..9c94b09bb7d 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -4,6 +4,8 @@ import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -58,9 +60,10 @@ public abstract class LevelRendererMixin { @Inject( method = { "renderLevel" }, at = { @At("HEAD") }) - private void renderLevel(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, - Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, - Matrix4f projectionMatrix, CallbackInfo ci) { + private void gtceu$renderAOEBreakAnimation(PoseStack poseStack, + float partialTick, long finishNanoTime, boolean renderBlockOutline, + Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, + Matrix4f projectionMatrix, CallbackInfo ci) { if (minecraft.player == null || minecraft.level == null) return; ItemStack mainHandItem = minecraft.player.getMainHandItem(); @@ -100,13 +103,18 @@ private void renderLevel(PoseStack poseStack, float partialTick, long finishNano } } - @Inject(method = "renderChunkLayer", at = @At("HEAD"), cancellable = true) - private void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo ci) { - if (renderType != BloomEffectUtil.getBloomLayer() || BloomEffectUtil.isRenderingBloom.get()) return; - BloomEffectUtil.renderBloomBlockLayer((LevelRenderer) (Object) this, camX, camY, camZ, poseStack, - this.minecraft.gameRenderer.getMainCamera(), this.getFrustum(), renderType, - minecraft.getPartialTick(), projectionMatrix, this.minecraft.cameraEntity); - ci.cancel(); + @WrapOperation(method = "renderLevel", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V") + ) + private void gtceu$renderBloomLayer(LevelRenderer instance, RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, Operation original) { + if (renderType != RenderType.translucent()) { + original.call(instance, renderType, poseStack, camX, camY, camZ, projectionMatrix); + return; + } + BloomEffectUtil.renderBloomChunkLayer(instance, camX, camY, camZ, poseStack, + this.getFrustum(), renderType, minecraft.getPartialTick(), projectionMatrix, + this.minecraft.cameraEntity); } @Shadow diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java new file mode 100644 index 00000000000..2e4575c9b72 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java @@ -0,0 +1,25 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import net.minecraft.client.renderer.RenderType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = DefaultMaterials.class, remap = false) +public class DefaultMaterialsMixin { + + @Inject(method = "forRenderLayer", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/RenderType;translucent()Lnet/minecraft/client/renderer/RenderType;", + remap = true), + cancellable = true) + private static void gtceu$allowBloomMaterial(RenderType layer, CallbackInfoReturnable cir) { + if (layer == BloomEffectUtil.getBloomLayer()) { + cir.setReturnValue(BloomEffectUtil.EMBEDDIUM_MATERIAL_BLOOM.get().get()); + } + } +} diff --git a/src/main/resources/assets/gtceu/shaders/core/black_hole.fsh b/src/main/resources/assets/gtceu/shaders/core/black_hole.fsh index a3c161f8ab8..52f8332eb78 100644 --- a/src/main/resources/assets/gtceu/shaders/core/black_hole.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/black_hole.fsh @@ -9,7 +9,7 @@ uniform float u_time; uniform vec2 u_resolution; uniform vec3 eye; uniform vec3 target; -uniform sampler2D texture; +uniform sampler2D Sampler0; float hash(float x){ return fract(sin(x)*152754.742);} float hash(vec2 x){ return hash(x.x + hash(x.y));} @@ -34,7 +34,7 @@ vec3 background(vec2 fragCoord, float r) vec2 lpos = u_resolution.xy / 2. / u_resolution.x; vec2 texC2 = fragCoord.xy / u_resolution.x; vec2 texC = mix(uv, lpos, (20. * r / (distance((texC2 * 2.0 - lpos * 2.0) * 5. + lpos, lpos) - r))); //Black hole shader - vec3 getColor = texture2D(texture,texC).rgb; + vec3 getColor = texture2D(Sampler0,texC).rgb; return getColor; } @@ -133,9 +133,11 @@ vec3 rayDirection(float fieldOfView, vec2 size, vec2 fragCoord) { return normalize(vec3(xy, -z)); } +out vec4 fragColor; + void main() { - gl_FragColor = vec4(0.);; + fragColor = vec4(0.); vec2 fragCoordRot; fragCoordRot.x = gl_FragCoord.x*1.0; @@ -210,6 +212,6 @@ void main() col = outCol; col.rgb = pow( col.rgb, vec3(0.6) ); - gl_FragColor += col/float(AA*AA); + fragColor += col/float(AA*AA); } } diff --git a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh index c3e821eb892..03c029d7c72 100644 --- a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh @@ -1,6 +1,6 @@ -#version 120 +#version 150 -varying vec2 texCoord0; +out vec2 texCoord0; uniform sampler2D buffer_a; @@ -21,11 +21,13 @@ uniform float threshold_down; // return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); //} -void main(void){ +out vec4 fragColor; + +void main() { vec3 bloom = texture2D(buffer_b, texCoord0).rgb * intensive; vec3 background = texture2D(buffer_a, texCoord0).rgb; -// gl_FragColor = vec4(background + bloom * ((1 - rgb2hsv(background).z) * (threshold_up - threshold_down) + threshold_down + base), 1.); +// fragColor = vec4(background + bloom * ((1 - rgb2hsv(background).z) * (threshold_up - threshold_down) + threshold_down + base), 1.); float max = max(background.b, max(background.r, background.g)); float min = min(background.b, min(background.r, background.g)); - gl_FragColor = vec4(background + bloom * ((1. - (max + min) / 2.) * (threshold_up - threshold_down) + threshold_down + base), 1.); + fragColor = vec4(background + bloom * ((1. - (max + min) / 2.) * (threshold_up - threshold_down) + threshold_down + base), 1.); } diff --git a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json index ea9cf7daac2..9bf6e27b528 100644 --- a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json +++ b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json @@ -7,15 +7,16 @@ "vertex": "gtceu:image", "fragment": "gtceu:bloom_combine", "attributes": [ + "Position" ], "samplers": [ { "name": "buffer_a" }, { "name": "buffer_b" } ], "uniforms": [ - { "name": "intensive", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "base", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "threshold_up", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "threshold_down", "type": "float", "count": 1, "values": [ 0.0 ] } + { "name": "intensive", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "base", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "threshold_up", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "threshold_down", "type": "float", "count": 1, "values": [ 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.fsh b/src/main/resources/assets/gtceu/shaders/core/blur.fsh index e10b449e3e1..12716113d38 100644 --- a/src/main/resources/assets/gtceu/shaders/core/blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/blur.fsh @@ -1,25 +1,27 @@ -#version 120 +#version 150 -varying vec2 texCoord0; +out vec2 texCoord0; -uniform sampler2D Sampler0; +uniform sampler2D DiffuseSampler; uniform vec2 u_resolution; uniform vec2 blurDir; +out vec4 fragColor; + void main(void){ vec2 pixelSize = blurDir.xy / u_resolution.xy; vec4 out_colour = vec4(0.0); - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -5.) * 0.0093; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -4.) * 0.028002; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -3.) * 0.065984; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -2.) * 0.121703; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * -1.) * 0.175713; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 0.) * 0.198596; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 1.) * 0.175713; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 2.) * 0.121703; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 3.) * 0.065984; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 4.) * 0.028002; - out_colour += texture2D(Sampler0, texCoord0 + pixelSize * 5.) * 0.0093; - gl_FragColor = vec4(out_colour.rgb, 1.); + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -5.) * 0.0093; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -4.) * 0.028002; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -3.) * 0.065984; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -2.) * 0.121703; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -1.) * 0.175713; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 0.) * 0.198596; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 1.) * 0.175713; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 2.) * 0.121703; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 3.) * 0.065984; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 4.) * 0.028002; + out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 5.) * 0.0093; + fragColor = vec4(out_colour.rgb, 1.); } diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.json b/src/main/resources/assets/gtceu/shaders/core/blur.json index 7fb0bf03421..0db3a422274 100644 --- a/src/main/resources/assets/gtceu/shaders/core/blur.json +++ b/src/main/resources/assets/gtceu/shaders/core/blur.json @@ -7,12 +7,13 @@ "vertex": "gtceu:image", "fragment": "gtceu:blur", "attributes": [ + "Position" ], "samplers": [ - { "name": "Sampler0" } + { "name": "DiffuseSampler" } ], "uniforms": [ - { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "blurDir", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] } + { "name": "u_resolution", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "blurDir", "type": "float", "count": 2, "values": [ 1.0, 0.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/core/composite.fsh b/src/main/resources/assets/gtceu/shaders/core/composite.fsh index 113ee2c7b01..ece2dc8954b 100644 --- a/src/main/resources/assets/gtceu/shaders/core/composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/composite.fsh @@ -1,6 +1,6 @@ -#version 120 +#version 150 -varying vec2 texCoord0; +out vec2 texCoord0; uniform sampler2D blurTexture1; uniform sampler2D blurTexture2; @@ -16,8 +16,11 @@ float lerpBloomFactor(const in float factor) { float mirrorFactor = 1.2 - factor; return mix(factor, mirrorFactor, bloomRadius); } + +out vec4 fragColor; + void main() { - gl_FragColor = bloomStrength * ( lerpBloomFactor(1.) * texture2D(blurTexture1, texCoord0) + + fragColor = bloomStrength * ( lerpBloomFactor(1.) * texture2D(blurTexture1, texCoord0) + lerpBloomFactor(0.8) * texture2D(blurTexture2, texCoord0) + lerpBloomFactor(0.6) * texture2D(blurTexture3, texCoord0) + lerpBloomFactor(0.4) * texture2D(blurTexture4, texCoord0) + diff --git a/src/main/resources/assets/gtceu/shaders/core/composite.json b/src/main/resources/assets/gtceu/shaders/core/composite.json index 14d201576c0..c08547ec01f 100644 --- a/src/main/resources/assets/gtceu/shaders/core/composite.json +++ b/src/main/resources/assets/gtceu/shaders/core/composite.json @@ -7,6 +7,7 @@ "vertex": "gtceu:image", "fragment": "gtceu:composite", "attributes": [ + "Position" ], "samplers": [ { "name": "blurTexture1" }, @@ -16,7 +17,7 @@ { "name": "blurTexture5" } ], "uniforms": [ - { "name": "bloomStrength", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "bloomRadius", "type": "float", "count": 1, "values": [ 0.0 ] } + { "name": "bloomStrength", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "bloomRadius", "type": "float", "count": 1, "values": [ 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh index f27f303e9ce..0eb801ef1a7 100644 --- a/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh @@ -1,19 +1,21 @@ -#version 120 +#version 150 -varying vec2 texCoord0; +out vec2 texCoord0; -uniform sampler2D Sampler0; +uniform sampler2D DiffuseSampler; uniform vec2 u_resolution; uniform vec2 u_resolution2; vec4 four_k(vec3 textel, vec2 uv) { - return (texture2D(Sampler0, uv + textel.xx) //1 1 - + texture2D(Sampler0, uv + textel.xy) // 1 -1 - + texture2D(Sampler0, uv + textel.yx) // -1 1 - + texture2D(Sampler0, uv + textel.yy)) * 0.25; // -1 -1 + return (texture2D(DiffuseSampler, uv + textel.xx) //1 1 + + texture2D(DiffuseSampler, uv + textel.xy) // 1 -1 + + texture2D(DiffuseSampler, uv + textel.yx) // -1 1 + + texture2D(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 } -void main(void) { +out vec4 fragColor; + +void main() { vec3 textel1 = vec3(1., -1., 0.) / u_resolution2.xyx; vec3 textel2 = vec3(1., -1., 0.) / u_resolution.xyx; @@ -42,5 +44,5 @@ void main(void) { + four_k(textel1, texCoord0 + textel1.yx) + four_k(textel1, texCoord0 + textel1.yy)) * 0.25 * 0.5; - gl_FragColor = vec4(out_colour.rgb, 1.); + fragColor = vec4(out_colour.rgb, 1.); } diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.json b/src/main/resources/assets/gtceu/shaders/core/down_sampling.json index 29cfa1c65b3..f1f37554be1 100644 --- a/src/main/resources/assets/gtceu/shaders/core/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/core/down_sampling.json @@ -9,10 +9,10 @@ "attributes": [ ], "samplers": [ - { "name": "Sampler0" } + { "name": "DiffuseSampler" } ], "uniforms": [ - { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] } + { "name": "u_resolution", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/core/image.fsh b/src/main/resources/assets/gtceu/shaders/core/image.fsh index bdc4bc382fa..7414d2026f2 100644 --- a/src/main/resources/assets/gtceu/shaders/core/image.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/image.fsh @@ -1,9 +1,11 @@ -#version 120 +#version 150 -varying vec2 texCoord0; +out vec2 texCoord0; uniform sampler2D Sampler0; -void main(void) { - gl_FragColor = texture2D(Sampler0, texCoord0).rgba; +out vec4 fragColor; + +void main() { + fragColor = texture2D(Sampler0, texCoord0).rgba; } diff --git a/src/main/resources/assets/gtceu/shaders/core/image.json b/src/main/resources/assets/gtceu/shaders/core/image.json index e0beb7c0bb8..653aecd81fe 100644 --- a/src/main/resources/assets/gtceu/shaders/core/image.json +++ b/src/main/resources/assets/gtceu/shaders/core/image.json @@ -7,6 +7,7 @@ "vertex": "gtceu:image", "fragment": "gtceu:image", "attributes": [ + "Position" ], "samplers": [ { "name": "Sampler0" } diff --git a/src/main/resources/assets/gtceu/shaders/core/image.vsh b/src/main/resources/assets/gtceu/shaders/core/image.vsh index 86480891db8..a524695142e 100644 --- a/src/main/resources/assets/gtceu/shaders/core/image.vsh +++ b/src/main/resources/assets/gtceu/shaders/core/image.vsh @@ -1,10 +1,18 @@ -#version 120 +#version 150 in vec3 Position; -varying vec2 texCoord0; +out vec2 texCoord0; void main(void){ - gl_Position = vec4(Position, 1.0); - texCoord0 = Position.xy * 0.5 + 0.5; + float x = -1.0; + float y = -1.0; + if (Position.x > 0.001){ + x = 1.0; + } + if (Position.y > 0.001){ + y = 1.0; + } + gl_Position = vec4(x, y, 0.2, 1.0); + texCoord0 = Position.xy; } diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh index 178466f212f..3eb53dbecc3 100644 --- a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh @@ -1,13 +1,14 @@ -#version 120 +#version 150 -varying vec2 texCoord0; +out vec2 texCoord0; -uniform sampler2D Sampler0; +uniform sampler2D DiffuseSampler; uniform vec2 u_resolution; uniform vec2 texSize; uniform vec2 blurDir; uniform int kernel_radius; +out vec4 fragColor; float gaussianPdf(in float x, in float sigma) { return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma; @@ -17,15 +18,15 @@ void main(void){ vec2 invSize = 1.0 / texSize; float fSigma = float(kernel_radius); float weightSum = gaussianPdf(0.0, fSigma); - vec3 diffuseSum = texture2D(Sampler0, texCoord0).rgb * weightSum; + vec3 diffuseSum = texture2D(DiffuseSampler, texCoord0).rgb * weightSum; for( int i = 1; i < kernel_radius; i ++ ) { float x = float(i); float w = gaussianPdf(x, fSigma); vec2 uvOffset = blurDir * invSize * x; - vec3 sample1 = texture2D(Sampler0, texCoord0 + uvOffset).rgb; - vec3 sample2 = texture2D(Sampler0, texCoord0 - uvOffset).rgb; + vec3 sample1 = texture2D(DiffuseSampler, texCoord0 + uvOffset).rgb; + vec3 sample2 = texture2D(DiffuseSampler, texCoord0 - uvOffset).rgb; diffuseSum += (sample1 + sample2) * w; weightSum += 2.0 * w; } - gl_FragColor = vec4(diffuseSum/weightSum, 1.0); + fragColor = vec4(diffuseSum/weightSum, 1.0); } diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json index 7c4bda96f86..ffb0280afa3 100644 --- a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json +++ b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json @@ -7,14 +7,15 @@ "vertex": "gtceu:image", "fragment": "gtceu:seperable_blur", "attributes": [ + "Position" ], "samplers": [ - { "name": "Sampler0" } + { "name": "DiffuseSampler" } ], "uniforms": [ - { "name": "u_texture", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "texSize", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "blurDir", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "kernel_radius", "type": "int", "count": 1, "values": [ 0 ] } + { "name": "u_texture", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "texSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "blurDir", "type": "float", "count": 2, "values": [ 1.0, 0.0 ] }, + { "name": "kernel_radius", "type": "int", "count": 1, "values": [ 1 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh index a3ccc46fefc..5cf1e9c7500 100644 --- a/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh @@ -1,6 +1,6 @@ -#version 120 +#version 150 -varying vec2 texCoord0; +out vec2 texCoord0; uniform sampler2D upTexture; uniform sampler2D downTexture; @@ -18,7 +18,9 @@ vec4 up_sampling(vec3 textel, vec2 uv) { return vec4(four_k(textel, uv).rgb + texture2D(downTexture, uv).rgb, 1.); } -void main(void) { +out vec4 fragColor; + +void main() { vec3 textel = vec3(1., -1., 0.) / u_resolution.xyx; // out_colour = up_sampling(textel, texCoord0); @@ -32,5 +34,5 @@ void main(void) { out_colour += texture2D(upTexture, texCoord0 + textel.zy) * 2.0; out_colour += texture2D(upTexture, texCoord0 + textel.yx); - gl_FragColor = vec4(out_colour.rgb * 0.8 / 16. + texture2D(downTexture, texCoord0).rgb * 0.8, 1.); + fragColor = vec4(out_colour.rgb * 0.8 / 16. + texture2D(downTexture, texCoord0).rgb * 0.8, 1.); } diff --git a/src/main/resources/assets/gtceu/shaders/core/up_sampling.json b/src/main/resources/assets/gtceu/shaders/core/up_sampling.json index a7209863ad4..9a82edd2788 100644 --- a/src/main/resources/assets/gtceu/shaders/core/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/core/up_sampling.json @@ -7,13 +7,14 @@ "vertex": "gtceu:image", "fragment": "gtceu:blur", "attributes": [ + "Position" ], "samplers": [ { "name": "upTexture" }, { "name": "downTexture" } ], "uniforms": [ - { "name": "u_resolution", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] } + { "name": "u_resolution", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } ] } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 2a9266cbda3..0f20eb008be 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -58,6 +58,7 @@ "ae2.GenericStackInvAccessor", "create.RotationPropagatorMixin", "embeddium.BiomeColorCacheMixin", + "embeddium.DefaultMaterialsMixin", "embeddium.DefaultTerrainRenderPassesAccessor", "embeddium.VanillaColorAdapterMixin", "emi.FluidEmiStackMixin", From 0c29e200028fc83215b4c690288e26f6367edfd8 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 4 Oct 2024 14:29:32 +0300 Subject: [PATCH 004/269] I think this should work? still need to fix the rendertype injections tho --- .../gregtechceu/gtceu/client/ClientProxy.java | 6 + .../gtceu/client/renderer/GTRenderTypes.java | 10 +- .../gtceu/client/shader/GTShaders.java | 123 +++++++++ .../gtceu/client/shader/PingPongBuffer.java | 57 ---- .../gtceu/client/shader/PostTarget.java | 12 - .../gtceu/client/shader/Shaders.java | 113 -------- .../gtceu/client/shader/post/BloomEffect.java | 174 ------------ .../gtceu/client/shader/post/BlurEffect.java | 64 ----- .../gtceu/client/util/BloomEffectUtil.java | 255 +++++------------- .../gtceu/client/util/DepthTextureUtil.java | 171 ------------ .../gtceu/client/util/RenderUtil.java | 3 +- .../gtceu/config/ConfigHolder.java | 4 +- .../gtceu/core/mixins/LevelRendererMixin.java | 22 +- .../gtceu/core/mixins/PostChainAccessor.java | 15 ++ .../gtceu/core/mixins/PostPassMixin.java | 31 +++ .../gtceu/shaders/core/bloom_combine.fsh | 33 --- .../gtceu/shaders/core/bloom_combine.json | 22 -- .../assets/gtceu/shaders/core/blur.fsh | 27 -- .../assets/gtceu/shaders/core/blur.json | 19 -- .../assets/gtceu/shaders/core/composite.fsh | 28 -- .../assets/gtceu/shaders/core/composite.json | 23 -- .../gtceu/shaders/core/down_sampling.fsh | 48 ---- .../gtceu/shaders/core/down_sampling.json | 18 -- .../assets/gtceu/shaders/core/image.fsh | 11 - .../assets/gtceu/shaders/core/image.json | 17 -- .../gtceu/shaders/core/rendertype_bloom.fsh | 18 ++ .../gtceu/shaders/core/rendertype_bloom.json | 22 ++ .../gtceu/shaders/core/rendertype_bloom.vsh | 18 ++ .../gtceu/shaders/core/seperable_blur.fsh | 32 --- .../gtceu/shaders/core/seperable_blur.json | 21 -- .../assets/gtceu/shaders/core/up_sampling.fsh | 38 --- .../gtceu/shaders/core/up_sampling.json | 20 -- .../gtceu/shaders/post/bloom_unity.json | 116 ++++++++ .../gtceu/shaders/post/bloom_unreal.json | 225 ++++++++++++++++ .../assets/gtceu/shaders/program/blit.fsh | 11 + .../assets/gtceu/shaders/program/blit.json | 16 ++ .../{core/image.vsh => program/blit.vsh} | 10 +- .../gtceu/shaders/program/down_sampling.fsh | 47 ++++ .../gtceu/shaders/program/down_sampling.json | 17 ++ .../shaders/program/filter_bloom_color.fsh | 16 ++ .../shaders/program/filter_bloom_color.json | 17 ++ .../gtceu/shaders/program/seperable_blur.fsh | 30 +++ .../gtceu/shaders/program/seperable_blur.json | 20 ++ .../gtceu/shaders/program/unity_composite.fsh | 48 ++++ .../shaders/program/unity_composite.json | 22 ++ .../shaders/program/unreal_composite.fsh | 66 +++++ .../shaders/program/unreal_composite.json | 23 ++ .../gtceu/shaders/program/up_sampling.fsh | 36 +++ .../gtceu/shaders/program/up_sampling.json | 17 ++ .../shaders/program/vanilla_composite.fsh | 22 ++ .../shaders/program/vanilla_composite.json | 22 ++ src/main/resources/gtceu.mixins.json | 146 +++++----- 52 files changed, 1167 insertions(+), 1235 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/PostPassMixin.java delete mode 100644 src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/bloom_combine.json delete mode 100644 src/main/resources/assets/gtceu/shaders/core/blur.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/blur.json delete mode 100644 src/main/resources/assets/gtceu/shaders/core/composite.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/composite.json delete mode 100644 src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/down_sampling.json delete mode 100644 src/main/resources/assets/gtceu/shaders/core/image.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/image.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/seperable_blur.json delete mode 100644 src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/up_sampling.json create mode 100644 src/main/resources/assets/gtceu/shaders/post/bloom_unity.json create mode 100644 src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json create mode 100644 src/main/resources/assets/gtceu/shaders/program/blit.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/blit.json rename src/main/resources/assets/gtceu/shaders/{core/image.vsh => program/blit.vsh} (64%) create mode 100644 src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/down_sampling.json create mode 100644 src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json create mode 100644 src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/seperable_blur.json create mode 100644 src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/unity_composite.json create mode 100644 src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/unreal_composite.json create mode 100644 src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/up_sampling.json create mode 100644 src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 1ce47d712ee..c05c1100981 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.client.particle.HazardParticle; import com.gregtechceu.gtceu.client.renderer.entity.GTBoatRenderer; import com.gregtechceu.gtceu.client.renderer.entity.GTExplosiveRenderer; +import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; @@ -103,4 +104,9 @@ public void onRegisterParticleProviders(RegisterParticleProvidersEvent event) { public void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { event.register("bloom", BloomEffectUtil.getBloomLayer(), Sheets.cutoutBlockSheet()); } + + @SubscribeEvent + public void onRegisterShaders(RegisterShadersEvent event) { + GTShaders.onRegisterShaders(event); + } } 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 78cf7e08ead..f3b9024d9ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.client.renderer; +import com.gregtechceu.gtceu.client.shader.GTShaders; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraftforge.api.distmarker.Dist; @@ -11,6 +12,11 @@ @OnlyIn(Dist.CLIENT) public class GTRenderTypes extends RenderType { + public static final RenderStateShard.ShaderStateShard BLOOM_SHADER = new RenderStateShard.ShaderStateShard(GTShaders::getBloomShader); + protected static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard("bloom_target", + () -> GTShaders.BLOOM_TARGET.bindWrite(false), + () -> GTShaders.BLOOM_TARGET.bindWrite(false)); + private static final RenderType LIGHT_RING = RenderType.create("light_ring", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 256, false, false, RenderType.CompositeState.builder() @@ -21,10 +27,10 @@ public class GTRenderTypes extends RenderType { private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, false, false, RenderType.CompositeState.builder() + .setShaderState(BLOOM_SHADER) + .setOutputState(BLOOM_TARGET) .setCullState(RenderStateShard.NO_CULL) - .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) .setTransparencyState(RenderStateShard.ADDITIVE_TRANSPARENCY) - .setLayeringState(RenderStateShard.VIEW_OFFSET_Z_LAYERING) .createCompositeState(false)); private GTRenderTypes(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java new file mode 100644 index 00000000000..3f9545fff64 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -0,0 +1,123 @@ +package com.gregtechceu.gtceu.client.shader; + +import com.google.gson.JsonSyntaxException; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.shader.post.BloomType; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.PostChain; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceProvider; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.RegisterShadersEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.io.IOException; + +@OnlyIn(Dist.CLIENT) +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, modid = GTCEu.MOD_ID, value = Dist.CLIENT) +public class GTShaders { + + public static final Minecraft mc = Minecraft.getInstance(); + + public static ShaderInstance BLOOM_SHADER; + + public static PostChain BLOOM_CHAIN; + public static BloomType BLOOM_TYPE; + public static RenderTarget BLOOM_TARGET; + + public static ShaderInstance getBloomShader() { + return BLOOM_SHADER; + } + + @SubscribeEvent + public static void onRenderTickStart(TickEvent.RenderTickEvent event) { + if (event.phase != TickEvent.Phase.START) { + return; + } + if (BLOOM_CHAIN != null) { + BLOOM_CHAIN.process(event.renderTickTime); + } + } + + public static void onRegisterShaders(RegisterShadersEvent event) { + if (!allowedShader()) { + return; + } + + ResourceProvider resourceProvider = event.getResourceProvider(); + + try { + event.registerShader( + new ShaderInstance(resourceProvider, GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), + shader -> BLOOM_SHADER = shader); + } catch (IOException ioException) { + GTCEu.LOGGER.error("Failed to load shader: gtceu:rendertype_bloom", ioException); + BLOOM_SHADER = null; + } + + initPostShaders(); + } + + public static void initPostShaders() { + if (BLOOM_CHAIN != null) { + BLOOM_CHAIN.close(); + } + + ResourceLocation id; + + switch (ConfigHolder.INSTANCE.client.shader.bloomStyle) { + case 0 -> { + id = GTCEu.id("shaders/post/bloom_gaussian.json"); + BLOOM_TYPE = BloomType.GAUSSIAN; + } + case 1 -> { + id = GTCEu.id("shaders/post/bloom_unity.json"); + BLOOM_TYPE = BloomType.UNITY; + } + case 2 -> { + id = GTCEu.id("shaders/post/bloom_unreal.json"); + BLOOM_TYPE = BloomType.UNREAL; + } + default -> { + GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomStyle); + BLOOM_TYPE = BloomType.DISABLED; + BLOOM_CHAIN = null; + BLOOM_TARGET = null; + return; + } + } + + try { + BLOOM_CHAIN = new PostChain(mc.getTextureManager(), mc.getResourceManager(), mc.getMainRenderTarget(), id); + BLOOM_CHAIN.resize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); + BLOOM_TARGET = BLOOM_CHAIN.getTempTarget("final"); + } catch (IOException ioexception) { + GTCEu.LOGGER.error("Failed to load shader: {}", id, ioexception); + BLOOM_CHAIN = null; + BLOOM_TARGET = null; + } catch (JsonSyntaxException jsonsyntaxexception) { + GTCEu.LOGGER.error("Failed to parse shader: {}", id, jsonsyntaxexception); + BLOOM_CHAIN = null; + BLOOM_TARGET = null; + } + } + + public static boolean allowedShader() { + return ConfigHolder.INSTANCE.client.shader.useShader && !GTCEu.isIrisOculusLoaded(); + } + + public static float getITime(float pPartialTicks) { + if (mc.level == null) { + return System.currentTimeMillis() % 1200000 / 1000f; + } else { + return ((mc.level.getGameTime() % 24000) + pPartialTicks) / 20f; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java b/src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java deleted file mode 100644 index f167a164ec4..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/PingPongBuffer.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gregtechceu.gtceu.client.shader; - -import com.gregtechceu.gtceu.client.util.RenderUtil; -import net.minecraft.client.Minecraft; - -public class PingPongBuffer { - - private static final PostTarget BUFFER_A; - private static final PostTarget BUFFER_B; - private static boolean flag; - - static { - BUFFER_A = new PostTarget(10, 10, false); - BUFFER_B = new PostTarget(10, 10, false); - BUFFER_A.setClearColor(0, 0, 0, 0); - BUFFER_B.setClearColor(0, 0, 0, 0); - } - - public static void updateSize(int width, int height) { - RenderUtil.updateFBOSize(BUFFER_A, width, height); - RenderUtil.updateFBOSize(BUFFER_B, width, height); - } - - public static void cleanAllUp() { - BUFFER_A.clear(Minecraft.ON_OSX); - BUFFER_B.clear(Minecraft.ON_OSX); - } - - public static PostTarget getCurrentBuffer(boolean clean) { - PostTarget buffer = flag ? BUFFER_A : BUFFER_B; - if (clean) { - buffer.clear(Minecraft.ON_OSX); - } - return buffer; - } - - public static PostTarget getNextBuffer(boolean clean) { - PostTarget buffer = flag ? BUFFER_B : BUFFER_A; - if (clean) { - buffer.clear(Minecraft.ON_OSX); - } - return buffer; - } - - public static PostTarget swap() { - return swap(false); - } - - public static PostTarget swap(boolean clean) { - flag = !flag; - return getCurrentBuffer(clean); - } - - public static void bindFramebufferTexture() { - getCurrentBuffer(false).bindRead(); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java b/src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java deleted file mode 100644 index 2bce0001a5d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/PostTarget.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.client.shader; - -import com.mojang.blaze3d.pipeline.RenderTarget; -import net.minecraft.client.Minecraft; - -public class PostTarget extends RenderTarget { - - public PostTarget(int width, int height, boolean useDepth) { - super(useDepth); - this.resize(width, height, Minecraft.ON_OSX); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java deleted file mode 100644 index af5cac195ee..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/Shaders.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.gregtechceu.gtceu.client.shader; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.shaders.Program; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.lwjgl.opengl.GL30; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; - -@OnlyIn(Dist.CLIENT) -public class Shaders { - - public static Minecraft mc; - - public static ShaderInstance IMAGE; - // public static ShaderObject BLACK_HOLE; - - public static ShaderInstance BLOOM_COMBINE; - - public static ShaderInstance BLUR; - - // Unity - public static ShaderInstance DOWN_SAMPLING; - public static ShaderInstance UP_SAMPLING; - - // Unreal - public static ShaderInstance S_BLUR; - public static ShaderInstance COMPOSITE; - - static { - mc = Minecraft.getInstance(); - if (allowedShader()) { - initShaders(); - } - } - - public static void initShaders() { - IMAGE = initShader(IMAGE, GTCEu.id("image")); - // BLACK_HOLE = initShader(BLACK_HOLE, FRAGMENT, GTCEu.id("black_hole")); - BLOOM_COMBINE = initShader(BLOOM_COMBINE, GTCEu.id("bloom_combine")); - BLUR = initShader(BLUR, GTCEu.id("blur")); - DOWN_SAMPLING = initShader(DOWN_SAMPLING, GTCEu.id("down_sampling")); - UP_SAMPLING = initShader(UP_SAMPLING, GTCEu.id("up_sampling")); - S_BLUR = initShader(S_BLUR, GTCEu.id("seperable_blur")); - COMPOSITE = initShader(COMPOSITE, GTCEu.id("composite")); - } - - private static ShaderInstance initShader(ShaderInstance object, ResourceLocation location) { - unloadShader(object); - try { - return loadShader(location); - } catch (Exception exception) { - GTCEu.LOGGER.error("error while loading shader {}", location, exception); - } - return null; - } - - public static ShaderInstance loadShader(ResourceLocation resourceLocation) throws IOException { - return new ShaderInstance(Minecraft.getInstance().getResourceManager(), resourceLocation, DefaultVertexFormat.POSITION_TEX); - } - - public static void unloadShader(ShaderInstance shaderObject) { - if (shaderObject != null) { - shaderObject.close(); - } - } - - public static boolean allowedShader() { - return ConfigHolder.INSTANCE.client.shader.useShader; - } - - public static RenderTarget renderFullImageInFBO(RenderTarget fbo, ShaderInstance shader, - Consumer uniformApplicator) { - if (fbo == null || shader == null || !allowedShader()) return fbo; - // int lastID = GlStateManager.getBoundFramebuffer(); - - fbo.bindWrite(true); - - shader.safeGetUniform("u_resolution").set(fbo.width, fbo.height); - if (uniformApplicator != null) { - uniformApplicator.accept(shader); - } - - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder buffer = tesselator.getBuilder(); - - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); - buffer.vertex(-1, 1, 0).color(0xFFFFFFFF).uv(0, 0).endVertex(); - buffer.vertex(-1, -1, 0).color(0xFFFFFFFF).uv(0, 1).endVertex(); - buffer.vertex(1, -1, 0).color(0xFFFFFFFF).uv(1, 1).endVertex(); - buffer.vertex(1, 1, 0).color(0xFFFFFFFF).uv(1, 0).endVertex(); - tesselator.end(); - - // RenderSystem.viewport(0, 0, mc.getWindow().getWidth(), mc.getWindow().getHeight()); - - // GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, lastID); - fbo.bindWrite(false); - return fbo; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java index 72558adc29c..a061f1184d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java @@ -1,186 +1,12 @@ package com.gregtechceu.gtceu.client.shader.post; -import com.gregtechceu.gtceu.client.shader.PingPongBuffer; -import com.gregtechceu.gtceu.client.shader.PostTarget; -import com.gregtechceu.gtceu.client.shader.Shaders; -import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.systems.RenderSystem; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL13; public class BloomEffect { - private static PostTarget[] downSampleFBO; - private static PostTarget[] upSampleFBO; - public static float strength = ConfigHolder.INSTANCE.client.shader.strength; public static float baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; public static float highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; public static float lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; public static float step = ConfigHolder.INSTANCE.client.shader.step; - - private static void blend(PostTarget bloom, RenderTarget backgroundFBO) { - // bind main fbo - backgroundFBO.bindRead(); - - // bind blur fbo - bloom.bindRead(); - - // blend shader - Shaders.renderFullImageInFBO(PingPongBuffer.swap(), Shaders.BLOOM_COMBINE, shaderInstance -> { - shaderInstance.setSampler("buffer_a", backgroundFBO); - shaderInstance.setSampler("buffer_b", bloom); - shaderInstance.safeGetUniform("intensive").set(strength); - shaderInstance.safeGetUniform("base").set(baseBrightness); - shaderInstance.safeGetUniform("threshold_up").set(highBrightnessThreshold); - shaderInstance.safeGetUniform("threshold_down").set(lowBrightnessThreshold); - }); - - RenderSystem.bindTexture(0); - RenderSystem.setShaderTexture(GL13.GL_TEXTURE1, 0); - - RenderSystem.bindTexture(0); - RenderSystem.setShaderTexture(GL13.GL_TEXTURE0, 0); - - PingPongBuffer.bindFramebufferTexture(); - } - - private static void cleanUp(int lastWidth, int lastHeight) { - if (downSampleFBO == null || downSampleFBO.length != ConfigHolder.INSTANCE.client.shader.nMips) { - if (downSampleFBO != null) { - for (int i = 0; i < downSampleFBO.length; i++) { - downSampleFBO[i].destroyBuffers(); - upSampleFBO[i].destroyBuffers(); - } - } - - downSampleFBO = new PostTarget[ConfigHolder.INSTANCE.client.shader.nMips]; - upSampleFBO = new PostTarget[ConfigHolder.INSTANCE.client.shader.nMips]; - - int resX = lastWidth / 2; - int resY = lastHeight / 2; - - for (int i = 0; i < ConfigHolder.INSTANCE.client.shader.nMips; i++) { - downSampleFBO[i] = new PostTarget(resX, resY, false); - upSampleFBO[i] = new PostTarget(resX, resY, false); - downSampleFBO[i].setClearColor(0, 0, 0, 0); - upSampleFBO[i].setClearColor(0, 0, 0, 0); - downSampleFBO[i].setFilterMode(GL11.GL_LINEAR); - upSampleFBO[i].setFilterMode(GL11.GL_LINEAR); - resX /= 2; - resY /= 2; - } - } else if (RenderUtil.updateFBOSize(downSampleFBO[0], lastWidth / 2, lastHeight / 2)) { - int resX = lastWidth / 2; - int resY = lastHeight / 2; - for (int i = 0; i < ConfigHolder.INSTANCE.client.shader.nMips; i++) { - RenderUtil.updateFBOSize(downSampleFBO[i], resX, resY); - RenderUtil.updateFBOSize(upSampleFBO[i], resX, resY); - downSampleFBO[i].setFilterMode(GL11.GL_LINEAR); - upSampleFBO[i].setFilterMode(GL11.GL_LINEAR); - resX /= 2; - resY /= 2; - } - } - PingPongBuffer.updateSize(lastWidth, lastHeight); - } - - public static void renderLOG(PostTarget highLightFBO, RenderTarget backgroundFBO) { - PingPongBuffer.updateSize(backgroundFBO.width, backgroundFBO.height); - BlurEffect.updateSize(backgroundFBO.width, backgroundFBO.height); - highLightFBO.bindRead(); - blend(BlurEffect.renderBlur1(step), backgroundFBO); - } - - public static void renderUnity(PostTarget highLightFBO, RenderTarget backgroundFBO) { - cleanUp(backgroundFBO.width, backgroundFBO.height); - - renderDownSampling(highLightFBO, downSampleFBO[0]); - for (int i = 0; i < downSampleFBO.length - 1; i++) { - renderDownSampling(downSampleFBO[i], downSampleFBO[i + 1]); - } - - renderUpSampling(downSampleFBO[downSampleFBO.length - 1], downSampleFBO[downSampleFBO.length - 2], - upSampleFBO[downSampleFBO.length - 2]); - for (int i = upSampleFBO.length - 2; i > 0; i--) { - renderUpSampling(upSampleFBO[i], downSampleFBO[i - 1], upSampleFBO[i - 1]); - } - renderUpSampling(upSampleFBO[0], highLightFBO, PingPongBuffer.swap()); - - RenderSystem.bindTexture(0); - RenderSystem.setShaderTexture(GL13.GL_TEXTURE1, 0); - - RenderSystem.bindTexture(0); - RenderSystem.setShaderTexture(GL13.GL_TEXTURE0, 0); - - blend(PingPongBuffer.getCurrentBuffer(false), backgroundFBO); - } - - private static void renderDownSampling(RenderTarget U, RenderTarget D) { - U.bindRead(); - Shaders.renderFullImageInFBO(D, Shaders.DOWN_SAMPLING, - uniformCache -> uniformCache.safeGetUniform("u_resolution2").set(U.width, U.height)); - } - - private static void renderUpSampling(RenderTarget U, RenderTarget D, RenderTarget T) { - U.bindRead(); - RenderSystem.setShaderTexture(0, U.getColorTextureId()); - - D.bindRead(); - RenderSystem.setShaderTexture(1, D.getColorTextureId()); - - Shaders.renderFullImageInFBO(T, Shaders.UP_SAMPLING, uniformCache -> { - uniformCache.setSampler("upTexture", U); - uniformCache.setSampler("downTexture", D); - uniformCache.safeGetUniform("u_resolution2").set((float) U.width, (float) U.height); - }); - } - - public static void renderUnreal(PostTarget highLightFBO, RenderTarget backgroundFBO) { - cleanUp(backgroundFBO.width, backgroundFBO.height); - - // blur all mips - int[] kernelSizeArray = new int[] { 3, 5, 7, 9, 11 }; - highLightFBO.bindRead(); - for (int i = 0; i < downSampleFBO.length; i++) { - RenderTarget buffer_h = downSampleFBO[i]; - int kernel = kernelSizeArray[i]; - Shaders.renderFullImageInFBO(buffer_h, Shaders.S_BLUR, uniformCache -> { - uniformCache.safeGetUniform("texSize").set((float) buffer_h.width, (float) buffer_h.height); - uniformCache.safeGetUniform("blurDir").set(step, 0); - uniformCache.safeGetUniform("kernel_radius").set(kernel); - }).bindRead(); - - RenderTarget buffer_v = upSampleFBO[i]; - Shaders.renderFullImageInFBO(buffer_v, Shaders.S_BLUR, uniformCache -> { - uniformCache.safeGetUniform("texSize").set((float) buffer_h.width, (float) buffer_h.height); - uniformCache.safeGetUniform("blurDir").set(0, step); - uniformCache.safeGetUniform("kernel_radius").set(kernel); - }).bindRead(); - } - - // composite all mips - for (int i = 0; i < downSampleFBO.length; i++) { - upSampleFBO[i].bindRead(); - RenderSystem.setShaderTexture(GL13.GL_TEXTURE0 + i, upSampleFBO[i].getColorTextureId()); - } - - Shaders.renderFullImageInFBO(downSampleFBO[0], Shaders.COMPOSITE, uniformCache -> { - uniformCache.setSampler("blurTexture1", upSampleFBO[0]); - uniformCache.setSampler("blurTexture2", upSampleFBO[1]); - uniformCache.setSampler("blurTexture3", upSampleFBO.length > 2 ? upSampleFBO[2] : null); - uniformCache.setSampler("blurTexture4", upSampleFBO.length > 3 ? upSampleFBO[3] : null); - uniformCache.setSampler("blurTexture5", upSampleFBO.length > 4 ? upSampleFBO[4] : null); - uniformCache.safeGetUniform("bloomStrength").set(strength); - uniformCache.safeGetUniform("bloomRadius").set(1.0f); - }); - - for (int i = downSampleFBO.length - 1; i >= 0; i--) { - RenderSystem.setShaderTexture(GL13.GL_TEXTURE0 + i, 0); - } - - blend(downSampleFBO[0], backgroundFBO); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java b/src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java deleted file mode 100644 index b5054b2eda7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BlurEffect.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.gregtechceu.gtceu.client.shader.post; - -import com.gregtechceu.gtceu.client.shader.PingPongBuffer; -import com.gregtechceu.gtceu.client.shader.PostTarget; -import com.gregtechceu.gtceu.client.shader.Shaders; -import com.gregtechceu.gtceu.client.util.RenderUtil; -import com.mojang.blaze3d.pipeline.RenderTarget; -import org.lwjgl.opengl.GL11; - -public class BlurEffect { - - private static PostTarget BLUR_H; - private static PostTarget BLUR_W; - private static PostTarget BLUR_H2; - private static PostTarget BLUR_W2; - - public static void updateSize(int lastWidth, int lastHeight) { - if (BLUR_H == null) { - BLUR_H = new PostTarget(lastWidth / 8, lastHeight / 8, false); - BLUR_H2 = new PostTarget(lastWidth / 4, lastHeight / 4, false); - BLUR_W = new PostTarget(lastWidth / 8, lastHeight / 8, false); - BLUR_W2 = new PostTarget(lastWidth / 4, lastHeight / 4, false); - BLUR_H.setClearColor(0, 0, 0, 0); - BLUR_H2.setClearColor(0, 0, 0, 0); - BLUR_W.setClearColor(0, 0, 0, 0); - BLUR_W2.setClearColor(0, 0, 0, 0); - BLUR_H.setFilterMode(GL11.GL_LINEAR); - BLUR_H2.setFilterMode(GL11.GL_LINEAR); - BLUR_W.setFilterMode(GL11.GL_LINEAR); - BLUR_W2.setFilterMode(GL11.GL_LINEAR); - } else if (RenderUtil.updateFBOSize(BLUR_H, lastWidth / 8, lastHeight / 8)) { - RenderUtil.updateFBOSize(BLUR_H2, lastWidth / 4, lastHeight / 4); - RenderUtil.updateFBOSize(BLUR_W, lastWidth / 8, lastHeight / 8); - RenderUtil.updateFBOSize(BLUR_W2, lastWidth / 4, lastHeight / 4); - BLUR_H.setFilterMode(GL11.GL_LINEAR); - BLUR_H2.setFilterMode(GL11.GL_LINEAR); - BLUR_W.setFilterMode(GL11.GL_LINEAR); - BLUR_W2.setFilterMode(GL11.GL_LINEAR); - } - PingPongBuffer.updateSize(lastWidth, lastHeight); - } - - public static PostTarget renderBlur1(float step) { - Shaders.renderFullImageInFBO(BLUR_H2, Shaders.BLUR, - shaderInstance -> shaderInstance.safeGetUniform("blurDir").set(0, step)).bindRead(); - Shaders.renderFullImageInFBO(BLUR_W2, Shaders.BLUR, - uniformCache -> uniformCache.safeGetUniform("blurDir").set(step, 0)).bindRead(); - Shaders.renderFullImageInFBO(BLUR_H, Shaders.BLUR, - uniformCache -> uniformCache.safeGetUniform("blurDir").set(0, step)).bindRead(); - Shaders.renderFullImageInFBO(BLUR_W, Shaders.BLUR, - uniformCache -> uniformCache.safeGetUniform("blurDir").set(step, 0)).bindRead(); - return BLUR_W; - } - - public static RenderTarget renderBlur2(int loop, float step) { - for (int i = 0; i < loop; i++) { - Shaders.renderFullImageInFBO(PingPongBuffer.swap(true), Shaders.BLUR, - uniformCache -> uniformCache.safeGetUniform("blurDir").set(0, step)).bindRead(); - Shaders.renderFullImageInFBO(PingPongBuffer.swap(), Shaders.BLUR, - uniformCache -> uniformCache.safeGetUniform("blurDir").set(step, 0)).bindRead(); - } - return PingPongBuffer.getCurrentBuffer(false); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 614a1816363..6e5dfb11aad 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -5,43 +5,38 @@ import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.IRenderSetup; -import com.gregtechceu.gtceu.client.shader.PostTarget; -import com.gregtechceu.gtceu.client.shader.Shaders; +import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.shader.post.BloomEffect; import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.RenderTypeAccessor; import com.gregtechceu.gtceu.core.mixins.embeddium.DefaultTerrainRenderPassesAccessor; -import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import lombok.Getter; import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.EffectInstance; +import net.minecraft.client.renderer.PostPass; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; -import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.ArrayUtils; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL30; import java.util.*; import java.util.concurrent.locks.ReentrantLock; @@ -57,9 +52,6 @@ public class BloomEffectUtil { private static final ReentrantLock BLOOM_RENDER_LOCK = new ReentrantLock(); private static RenderType bloom; - @Getter - private static PostTarget bloomFBO; - /** * @return {@link RenderType} instance for the bloom render layer. */ @@ -308,9 +300,6 @@ public static void init() { // Add our render type to embeddium's render passes by force (until an API is added) /* FOR UNRELEASED EMBEDDIUM!!! - Field field = DefaultTerrainRenderPasses.class.getDeclaredField("RENDER_PASS_MAPPINGS"); - FieldUtils.removeFinalModifier(field); - field.set(null, new HashMap<>(DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS)); TerrainRenderPass bloomPass = TerrainRenderPass.builder() .layer(bloom) @@ -318,7 +307,9 @@ public static void init() { .useReverseOrder(false) .useTranslucencySorting(true) .build(); - DefaultTerrainRenderPasses.RENDER_PASS_MAPPINGS.put(bloom, List.of(bloomPass)); + var map = new HashMap<>(DefaultTerrainRenderPassesAccessor.getRenderPassMappings()); + map.put(bloom, List.of(bloomPass)); + DefaultTerrainRenderPassesAccessor.setRenderPassMappings(map); */ TerrainRenderPass bloomPass = new TerrainRenderPass(bloom, false, true); DefaultTerrainRenderPassesAccessor.setAll(ArrayUtils.add(DefaultTerrainRenderPasses.ALL, bloomPass)); @@ -328,37 +319,13 @@ public static void init() { } } - public static void renderBloomChunkLayer(LevelRenderer levelRenderer, - double camX, double camY, double camZ, - PoseStack poseStack, - Frustum frustum, - RenderType blockRenderLayer, // 70% sure it's translucent uh yeah - double partialTicks, - Matrix4f projectionMatrix, - @NotNull Entity entity) { + public static void renderBloom(double camX, double camY, double camZ, + PoseStack poseStack, + Frustum frustum, + double partialTicks, + @NotNull Entity entity) { Minecraft.getInstance().getProfiler().popPush("BTLayer"); - if (GTCEu.isIrisOculusLoaded()) { - levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); - return; - } - - BLOOM_RENDER_LOCK.lock(); - try { - renderBloomInternal(levelRenderer, camX, camY, camZ, poseStack, frustum, blockRenderLayer, partialTicks, projectionMatrix, entity); - } finally { - BLOOM_RENDER_LOCK.unlock(); - } - } - - private static void renderBloomInternal(LevelRenderer levelRenderer, - double camX, double camY, double camZ, - PoseStack poseStack, - Frustum frustum, - RenderType blockRenderLayer, - double partialTicks, - Matrix4f projectionMatrix, - @NotNull Entity entity) { preDraw(); EffectRenderContext context = EffectRenderContext.getInstance() @@ -366,7 +333,6 @@ private static void renderBloomInternal(LevelRenderer levelRenderer, if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { RenderSystem.depthMask(true); - levelRenderer.renderChunkLayer(bloom, poseStack, camX, camY, camZ, projectionMatrix); if (!BLOOM_RENDERS.isEmpty()) { BufferBuilder buffer = Tesselator.getInstance().getBuilder(); @@ -377,97 +343,15 @@ private static void renderBloomInternal(LevelRenderer levelRenderer, postDraw(); RenderSystem.depthMask(false); - levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); + render(); return; } - RenderTarget fbo = Minecraft.getInstance().getMainRenderTarget(); - - if (bloomFBO == null || - bloomFBO.width != fbo.width || - bloomFBO.height != fbo.height || - (fbo.isStencilEnabled() && !bloomFBO.isStencilEnabled())) { - if (bloomFBO == null) { - bloomFBO = new PostTarget(fbo.width, fbo.height, false); - bloomFBO.setClearColor(0, 0, 0, 0); - } else { - bloomFBO.resize(fbo.width, fbo.height, Minecraft.ON_OSX); - } - - if (fbo.isStencilEnabled() && !bloomFBO.isStencilEnabled()) { - bloomFBO.enableStencil(); - } - - if (DepthTextureUtil.isLastBind() && DepthTextureUtil.isUseDefaultFBO()) { - RenderUtil.hookDepthTexture(bloomFBO, DepthTextureUtil.framebufferDepthTexture); - } else { - RenderUtil.hookDepthBuffer(bloomFBO, fbo.getDepthTextureId()); - } - - bloomFBO.setFilterMode(GL11.GL_LINEAR); - } - - RenderSystem.depthMask(true); - fbo.bindWrite(true); - - if (!BLOOM_RENDERS.isEmpty()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - for (List list : BLOOM_RENDERS.values()) { - draw(poseStack, buffer, context, list); - } - } - - // render to BLOOM BUFFER - bloomFBO.clear(Minecraft.ON_OSX); - bloomFBO.bindWrite(false); - - levelRenderer.renderChunkLayer(bloom, poseStack, camX, camY, camZ, projectionMatrix); - - RenderSystem.depthMask(false); - - // fast render bloom layer to main fbo - bloomFBO.bindRead(); - Shaders.renderFullImageInFBO(fbo, Shaders.IMAGE, null); - - // reset transparent layer render state and render - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo.frameBufferId); - RenderSystem.enableBlend(); - Minecraft.getInstance().getTextureManager().bindForSetup(InventoryMenu.BLOCK_ATLAS); - //GL11.glShadeModel(GL11.GL_SMOOTH); - - levelRenderer.renderChunkLayer(blockRenderLayer, poseStack, camX, camY, camZ, projectionMatrix); - - Minecraft.getInstance().getProfiler().popPush("bloom"); - - // blend bloom + transparent - fbo.bindRead(); - RenderSystem.blendFunc(GL11.GL_DST_ALPHA, GL11.GL_ZERO); - Shaders.renderFullImageInFBO(bloomFBO, Shaders.IMAGE, null); - RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - // render bloom effect to fbo BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; - switch (ConfigHolder.INSTANCE.client.shader.bloomStyle) { - case 0 -> BloomEffect.renderLOG(bloomFBO, fbo); - case 1 -> BloomEffect.renderUnity(bloomFBO, fbo); - case 2 -> BloomEffect.renderUnreal(bloomFBO, fbo); - default -> { - postDraw(); - RenderSystem.depthMask(false); - RenderSystem.disableBlend(); - return; - } - } - - RenderSystem.depthMask(false); - - // render bloom blend result to fbo - RenderSystem.disableBlend(); - Shaders.renderFullImageInFBO(fbo, Shaders.IMAGE, null); // ********** render custom bloom ************ @@ -478,37 +362,18 @@ private static void renderBloomInternal(LevelRenderer levelRenderer, List list = e.getValue(); RenderSystem.depthMask(true); - - bloomFBO.clear(Minecraft.ON_OSX); - bloomFBO.bindWrite(true); - draw(poseStack, buffer, context, list); - RenderSystem.depthMask(false); - - // blend bloom + transparent - fbo.bindRead(); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GL11.GL_DST_ALPHA, GL11.GL_ZERO); - Shaders.renderFullImageInFBO(bloomFBO, Shaders.IMAGE, null); - RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - switch (key.bloomType) { - case GAUSSIAN -> BloomEffect.renderLOG(bloomFBO, fbo); - case UNITY -> BloomEffect.renderUnity(bloomFBO, fbo); - case UNREAL -> BloomEffect.renderUnreal(bloomFBO, fbo); - default -> { - RenderSystem.disableBlend(); - continue; - } - } - - // render bloom blend result to fbo - RenderSystem.disableBlend(); - Shaders.renderFullImageInFBO(fbo, Shaders.IMAGE, null); } - postDraw(); } + + RenderSystem.blendFunc(GL11.GL_DST_ALPHA, GL11.GL_ZERO); + RenderSystem.enableBlend(); + render(); + RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderSystem.disableBlend(); + + postDraw(); } private static void preDraw() { @@ -558,6 +423,49 @@ private static void postDraw() { } } + private static final String UNREAL_COMPOSITE_SHADER_NAME = "gtceu:unreal_composite"; + private static final String UNITY_COMPOSITE_SHADER_NAME = "gtceu:unity_composite"; + private static final String SEPERABLE_BLUR_SHADER_NAME = "gtceu:seperable_blur"; + private static final String BLOOM_INTENSIVE_UNIFORM = "BloomIntensive"; + private static final String BLOOM_BASE_UNIFORM = "BloomBase"; + private static final String BLOOM_THRESHOLD_UP_UNIFORM = "BloomThresholdUp"; + private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; + private static final String BLUR_DIR_UNIFORM = "BlurDir"; + + private static void render() { + if (GTShaders.allowedShader()) { + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate( + GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE); + // Forcefully insert config values to shader + List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); + for (PostPass pass : passes) { + EffectInstance shader = pass.getEffect(); + int index = passes.indexOf(pass); + if (GTShaders.BLOOM_TYPE == BloomType.UNREAL) { + if (shader.getName().equals(SEPERABLE_BLUR_SHADER_NAME)) { + switch (index) { + case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); + case 2, 4, 6, 8 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); + } + } + } + if (shader.getName().equals(UNITY_COMPOSITE_SHADER_NAME) || + shader.getName().equals(UNREAL_COMPOSITE_SHADER_NAME)) { + shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(BloomEffect.strength); + shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(BloomEffect.baseBrightness); + shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(BloomEffect.highBrightnessThreshold); + shader.safeGetUniform(BLOOM_THRESHOLD_DOWN_UNIFORM).set(BloomEffect.lowBrightnessThreshold); + } + } + + GTShaders.BLOOM_TARGET.blitToScreen(GTShaders.mc.getWindow().getWidth(), GTShaders.mc.getWindow().getHeight(), false); + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + } + } + private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) {} public static final class BloomRenderTicket { @@ -590,20 +498,6 @@ public static final class BloomRenderTicket { this.worldContext = worldContext; } - @Nullable - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.9") - public IRenderSetup getRenderSetup() { - return this.renderSetup; - } - - @NotNull - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.9") - public BloomType getBloomType() { - return this.bloomType; - } - public boolean isValid() { return !this.invalidated; } @@ -618,25 +512,4 @@ private void checkValidity() { } } } - - /** - * @deprecated use ticket-based bloom render hooks - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.9") - public interface IBloomRenderFast extends IRenderSetup { - - /** - * Custom Bloom Style. - * - * @return 0 - Simple Gaussian Blur Bloom - *

- * 1 - Unity Bloom - *

- *

- * 2 - Unreal Bloom - *

- */ - int customBloomStyle(); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java deleted file mode 100644 index 767f73209fc..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/util/DepthTextureUtil.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.gregtechceu.gtceu.client.util; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.platform.TextureUtil; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.RenderLevelStageEvent; -import net.minecraftforge.event.TickEvent; -import org.lwjgl.opengl.*; - -/** - * Created with IntelliJ IDEA. - * - * @author KilaBash - * @date 2021/09/11 - * @implNote You'll need it when you need to get deep textures to do more cool things. - * The default FBO is used, unfortunately, sometimes we have to abandon native way to create a new fbo. - * But generally not. - */ -@OnlyIn(Dist.CLIENT) -public class DepthTextureUtil { - - public static int framebufferObject; - public static int framebufferDepthTexture; - private static boolean useDefaultFBO = true; - private static boolean lastBind; - private static int lastWidth, lastHeight; - - private static boolean shouldRenderDepthTexture() { - return lastBind && !GTCEu.isOptifineLoaded() && ConfigHolder.INSTANCE.client.hookDepthTexture; - } - - public static void onPreWorldRender(TickEvent.RenderTickEvent event) { - Minecraft mc = Minecraft.getInstance(); - if (event.phase == TickEvent.Phase.START && mc.level != null) { - if (shouldRenderDepthTexture()) { - if (useDefaultFBO && GL11.glGetError() != 0) { // if we can't use the vanilla fbo.... okay, why not - // create our own fbo? - useDefaultFBO = false; - if (framebufferDepthTexture != 0) { - disposeDepthTexture(); - createDepthTexture(); - } - } - if (framebufferDepthTexture == 0) { - createDepthTexture(); - } else if (lastWidth != mc.getMainRenderTarget().width || - lastHeight != mc.getMainRenderTarget().height) { - disposeDepthTexture(); - createDepthTexture(); - } - } else { - disposeDepthTexture(); - } - lastBind = false; - } - } - - public static void renderWorld(RenderLevelStageEvent event) { // re-render world in our own fbo. - if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) { - return; - } - Minecraft mc = Minecraft.getInstance(); - Entity viewer = mc.getCameraEntity(); - if (DepthTextureUtil.framebufferDepthTexture != 0 && mc.level != null && viewer != null && - !DepthTextureUtil.useDefaultFBO) { - int lastFBO = GlStateManager.getBoundFramebuffer(); - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebufferObject); - RenderSystem.clear(GL11.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); - var projectionMatrix = RenderSystem.getProjectionMatrix(); - mc.levelRenderer.renderChunkLayer(RenderType.solid(), event.getPoseStack(), - viewer.getX(), viewer.getY(), viewer.getZ(), projectionMatrix); - mc.levelRenderer.renderChunkLayer(RenderType.solid(), event.getPoseStack(), - viewer.getX(), viewer.getY(), viewer.getZ(), projectionMatrix); - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, lastFBO); - } - } - - public static void createDepthTexture() { - int lastFBO = GlStateManager._getInteger(GL30.GL_FRAMEBUFFER_BINDING); - RenderTarget framebuffer = Minecraft.getInstance().getMainRenderTarget(); - boolean stencil = framebuffer.isStencilEnabled() && useDefaultFBO; - - if (useDefaultFBO) { - framebufferObject = framebuffer.frameBufferId; - } else { - framebufferObject = GlStateManager.glGenFramebuffers(); - } - - framebufferDepthTexture = TextureUtil.generateTextureId(); // gen texture - RenderSystem.bindTexture(framebufferDepthTexture); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL14.GL_DEPTH_TEXTURE_MODE, GL11.GL_LUMINANCE); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_FUNC, GL11.GL_LEQUAL); - GlStateManager._texImage2D(GL11.GL_TEXTURE_2D, 0, - stencil ? GL30.GL_DEPTH24_STENCIL8 : GL14.GL_DEPTH_COMPONENT24, - framebuffer.viewWidth, - framebuffer.viewHeight, 0, - stencil ? GL30.GL_DEPTH_STENCIL : GL11.GL_DEPTH_COMPONENT, - stencil ? GL30.GL_UNSIGNED_INT_24_8 : GL11.GL_UNSIGNED_INT, null); - RenderSystem.bindTexture(0); - - lastWidth = framebuffer.viewWidth; - lastHeight = framebuffer.viewHeight; - - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebufferObject); // bind buffer then bind depth texture - GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, - stencil ? GL30.GL_DEPTH_STENCIL_ATTACHMENT : GL30.GL_DEPTH_ATTACHMENT, - GL11.GL_TEXTURE_2D, - framebufferDepthTexture, 0); - - if (BloomEffectUtil.getBloomFBO() != null && useDefaultFBO) { - RenderUtil.hookDepthTexture(BloomEffectUtil.getBloomFBO(), framebufferDepthTexture); - } - - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, lastFBO); - } - - public static void disposeDepthTexture() { - if (framebufferDepthTexture != 0 || framebufferObject != 0) { - if (useDefaultFBO) { - RenderTarget framebuffer = Minecraft.getInstance().getMainRenderTarget(); - RenderTarget bloomFBO = BloomEffectUtil.getBloomFBO(); - if (bloomFBO != null) { - RenderUtil.hookDepthBuffer(bloomFBO, framebuffer.getDepthTextureId()); - } - RenderUtil.hookDepthBuffer(framebuffer, framebuffer.getDepthTextureId()); - } else { - RenderSystem.glDeleteBuffers(framebufferObject); - } - RenderSystem.deleteTexture(framebufferDepthTexture); - framebufferObject = 0; - framebufferDepthTexture = 0; - } - } - - public static void bindDepthTexture() { - lastBind = true; - if (useDefaultFBO && framebufferDepthTexture != 0) { - RenderTarget mainTarget = Minecraft.getInstance().getMainRenderTarget(); - RenderUtil.hookDepthBuffer(mainTarget, mainTarget.getDepthTextureId()); - } - RenderSystem.bindTexture(framebufferDepthTexture); - } - - public static void unBindDepthTexture() { - RenderSystem.bindTexture(0); - if (useDefaultFBO) { - RenderTarget framebuffer = Minecraft.getInstance().getMainRenderTarget(); - RenderUtil.hookDepthTexture(framebuffer, framebufferDepthTexture); - } - } - - public static boolean isUseDefaultFBO() { - return useDefaultFBO; - } - - public static boolean isLastBind() { - return framebufferObject != 0; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java index d6a4e59a0db..617416705a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.client.util; -import com.gregtechceu.gtceu.client.shader.PostTarget; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; @@ -11,7 +10,7 @@ @OnlyIn(Dist.CLIENT) public class RenderUtil { - public static boolean updateFBOSize(PostTarget fbo, int width, int height) { + public static boolean updateFBOSize(RenderTarget fbo, int width, int height) { if (fbo.width != width || fbo.height != height) { fbo.createBuffers(width, height, Minecraft.ON_OSX); return true; diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index d2fa24339e4..b780d97378c 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -672,7 +672,7 @@ public static class ShaderOptions { public boolean emissiveTexturesBloom = true; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast)", "1 - Unity Bloom", + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) @Configurable.Range(min = 0, max = 2) public int bloomStyle = 2; @@ -719,7 +719,7 @@ public static class ShaderOptions { @Configurable @Configurable.Comment({ "Blur Step (bloom range)", "Default: 1" }) @Configurable.DecimalRange(min = 0) - public float step = 1; + public float step = 1.0f; public static class FusionBloom { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 9c94b09bb7d..1ecd9fc9354 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -103,26 +103,20 @@ public abstract class LevelRendererMixin { } } - @WrapOperation(method = "renderLevel", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V") - ) - private void gtceu$renderBloomLayer(LevelRenderer instance, RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, Operation original) { - if (renderType != RenderType.translucent()) { - original.call(instance, renderType, poseStack, camX, camY, camZ, projectionMatrix); - return; - } - BloomEffectUtil.renderBloomChunkLayer(instance, camX, camY, camZ, poseStack, - this.getFrustum(), renderType, minecraft.getPartialTick(), projectionMatrix, - this.minecraft.cameraEntity); - } - @Shadow private static void renderShape(PoseStack poseStack, VertexConsumer consumer, VoxelShape shape, double x, double y, double z, float red, float green, float blue, float alpha) { throw new AssertionError(); } + @Inject(method = "renderLevel", at = @At("RETURN")) + private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, + boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, + LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { + BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, + poseStack, getFrustum(), partialTick, camera.getEntity()); + } + @Shadow public abstract Frustum getFrustum(); @Inject(method = "renderHitOutline", at = @At("HEAD")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java new file mode 100644 index 00000000000..c15278a4f62 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java @@ -0,0 +1,15 @@ +package com.gregtechceu.gtceu.core.mixins; + +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/PostPassMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/PostPassMixin.java new file mode 100644 index 00000000000..1ed1637a334 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/PostPassMixin.java @@ -0,0 +1,31 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.shader.GTShaders; +import net.minecraft.client.renderer.EffectInstance; +import net.minecraft.client.renderer.PostPass; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author KilaBash + * @date 2022/05/03 + * @implNote PostChainMixin, add more features for vanilla PostChain stuff + */ +@Mixin(PostPass.class) +public abstract class PostPassMixin { + @Shadow + @Final + private EffectInstance effect; + + @Inject(method = "process", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/EffectInstance;safeGetUniform(Ljava/lang/String;)Lcom/mojang/blaze3d/shaders/AbstractUniform;", ordinal = 1)) + private void injectParseTargetNode(float pPartialTicks, CallbackInfo ci) { + this.effect.safeGetUniform("iTime").set(GTShaders.getITime(pPartialTicks)); + } +} diff --git a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh deleted file mode 100644 index 03c029d7c72..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.fsh +++ /dev/null @@ -1,33 +0,0 @@ -#version 150 - -out vec2 texCoord0; - - -uniform sampler2D buffer_a; -uniform sampler2D buffer_b; -uniform float intensive; -uniform float base; -uniform float threshold_up; -uniform float threshold_down; - -// All components are in the range [0…1], including hue. -//vec3 rgb2hsv(vec3 c) { -// vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); -// vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); -// vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); -// -// float d = q.x - min(q.w, q.y); -// float e = 1.0e-10; -// return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); -//} - -out vec4 fragColor; - -void main() { - vec3 bloom = texture2D(buffer_b, texCoord0).rgb * intensive; - vec3 background = texture2D(buffer_a, texCoord0).rgb; -// fragColor = vec4(background + bloom * ((1 - rgb2hsv(background).z) * (threshold_up - threshold_down) + threshold_down + base), 1.); - float max = max(background.b, max(background.r, background.g)); - float min = min(background.b, min(background.r, background.g)); - fragColor = vec4(background + bloom * ((1. - (max + min) / 2.) * (threshold_up - threshold_down) + threshold_down + base), 1.); -} diff --git a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json b/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json deleted file mode 100644 index 9bf6e27b528..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/bloom_combine.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:image", - "fragment": "gtceu:bloom_combine", - "attributes": [ - "Position" - ], - "samplers": [ - { "name": "buffer_a" }, - { "name": "buffer_b" } - ], - "uniforms": [ - { "name": "intensive", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "base", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "threshold_up", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "threshold_down", "type": "float", "count": 1, "values": [ 1.0 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.fsh b/src/main/resources/assets/gtceu/shaders/core/blur.fsh deleted file mode 100644 index 12716113d38..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/blur.fsh +++ /dev/null @@ -1,27 +0,0 @@ -#version 150 - -out vec2 texCoord0; - -uniform sampler2D DiffuseSampler; -uniform vec2 u_resolution; -uniform vec2 blurDir; - -out vec4 fragColor; - -void main(void){ - vec2 pixelSize = blurDir.xy / u_resolution.xy; - vec4 out_colour = vec4(0.0); - - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -5.) * 0.0093; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -4.) * 0.028002; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -3.) * 0.065984; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -2.) * 0.121703; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * -1.) * 0.175713; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 0.) * 0.198596; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 1.) * 0.175713; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 2.) * 0.121703; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 3.) * 0.065984; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 4.) * 0.028002; - out_colour += texture2D(DiffuseSampler, texCoord0 + pixelSize * 5.) * 0.0093; - fragColor = vec4(out_colour.rgb, 1.); -} diff --git a/src/main/resources/assets/gtceu/shaders/core/blur.json b/src/main/resources/assets/gtceu/shaders/core/blur.json deleted file mode 100644 index 0db3a422274..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/blur.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:image", - "fragment": "gtceu:blur", - "attributes": [ - "Position" - ], - "samplers": [ - { "name": "DiffuseSampler" } - ], - "uniforms": [ - { "name": "u_resolution", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "blurDir", "type": "float", "count": 2, "values": [ 1.0, 0.0 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/core/composite.fsh b/src/main/resources/assets/gtceu/shaders/core/composite.fsh deleted file mode 100644 index ece2dc8954b..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/composite.fsh +++ /dev/null @@ -1,28 +0,0 @@ -#version 150 - -out vec2 texCoord0; - -uniform sampler2D blurTexture1; -uniform sampler2D blurTexture2; -uniform sampler2D blurTexture3; -uniform sampler2D blurTexture4; -uniform sampler2D blurTexture5; -uniform float bloomStrength; -uniform float bloomRadius; -//uniform float bloomFactors[NUM_MIPS]; -//uniform vec3 bloomTintColors[NUM_MIPS]; - -float lerpBloomFactor(const in float factor) { - float mirrorFactor = 1.2 - factor; - return mix(factor, mirrorFactor, bloomRadius); -} - -out vec4 fragColor; - -void main() { - fragColor = bloomStrength * ( lerpBloomFactor(1.) * texture2D(blurTexture1, texCoord0) + - lerpBloomFactor(0.8) * texture2D(blurTexture2, texCoord0) + - lerpBloomFactor(0.6) * texture2D(blurTexture3, texCoord0) + - lerpBloomFactor(0.4) * texture2D(blurTexture4, texCoord0) + - lerpBloomFactor(0.2) * texture2D(blurTexture5, texCoord0) ); -} diff --git a/src/main/resources/assets/gtceu/shaders/core/composite.json b/src/main/resources/assets/gtceu/shaders/core/composite.json deleted file mode 100644 index c08547ec01f..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/composite.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:image", - "fragment": "gtceu:composite", - "attributes": [ - "Position" - ], - "samplers": [ - { "name": "blurTexture1" }, - { "name": "blurTexture2" }, - { "name": "blurTexture3" }, - { "name": "blurTexture4" }, - { "name": "blurTexture5" } - ], - "uniforms": [ - { "name": "bloomStrength", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "bloomRadius", "type": "float", "count": 1, "values": [ 1.0 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh deleted file mode 100644 index 0eb801ef1a7..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/down_sampling.fsh +++ /dev/null @@ -1,48 +0,0 @@ -#version 150 - -out vec2 texCoord0; - -uniform sampler2D DiffuseSampler; -uniform vec2 u_resolution; -uniform vec2 u_resolution2; - -vec4 four_k(vec3 textel, vec2 uv) { - return (texture2D(DiffuseSampler, uv + textel.xx) //1 1 - + texture2D(DiffuseSampler, uv + textel.xy) // 1 -1 - + texture2D(DiffuseSampler, uv + textel.yx) // -1 1 - + texture2D(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 -} - -out vec4 fragColor; - -void main() { - vec3 textel1 = vec3(1., -1., 0.) / u_resolution2.xyx; - vec3 textel2 = vec3(1., -1., 0.) / u_resolution.xyx; - - vec4 out_colour = (four_k(textel1, texCoord0 + textel2.yy) - + four_k(textel1, texCoord0 + textel2.zy) - + four_k(textel1, texCoord0 + textel2.yz) - + four_k(textel1, texCoord0)) * 0.25 * 0.125; - - out_colour += (four_k(textel1, texCoord0 + textel2.xy) - + four_k(textel1, texCoord0 + textel2.zy) - + four_k(textel1, texCoord0 + textel2.xz) - + four_k(textel1, texCoord0)) * 0.25 * 0.125; - - out_colour += (four_k(textel1, texCoord0 + textel2.yx) - + four_k(textel1, texCoord0 + textel2.yz) - + four_k(textel1, texCoord0 + textel2.zx) - + four_k(textel1, texCoord0)) * 0.25 * 0.125; - - out_colour += (four_k(textel1, texCoord0 + textel2.xx) - + four_k(textel1, texCoord0 + textel2.xz) - + four_k(textel1, texCoord0 + textel2.zx) - + four_k(textel1, texCoord0)) * 0.25 * 0.125; - - out_colour += (four_k(textel1, texCoord0 + textel1.xx) - + four_k(textel1, texCoord0 + textel1.xy) - + four_k(textel1, texCoord0 + textel1.yx) - + four_k(textel1, texCoord0 + textel1.yy)) * 0.25 * 0.5; - - fragColor = vec4(out_colour.rgb, 1.); -} diff --git a/src/main/resources/assets/gtceu/shaders/core/down_sampling.json b/src/main/resources/assets/gtceu/shaders/core/down_sampling.json deleted file mode 100644 index f1f37554be1..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/down_sampling.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:image", - "fragment": "gtceu:blur", - "attributes": [ - ], - "samplers": [ - { "name": "DiffuseSampler" } - ], - "uniforms": [ - { "name": "u_resolution", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/core/image.fsh b/src/main/resources/assets/gtceu/shaders/core/image.fsh deleted file mode 100644 index 7414d2026f2..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/image.fsh +++ /dev/null @@ -1,11 +0,0 @@ -#version 150 - -out vec2 texCoord0; - -uniform sampler2D Sampler0; - -out vec4 fragColor; - -void main() { - fragColor = texture2D(Sampler0, texCoord0).rgba; -} diff --git a/src/main/resources/assets/gtceu/shaders/core/image.json b/src/main/resources/assets/gtceu/shaders/core/image.json deleted file mode 100644 index 653aecd81fe..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/image.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:image", - "fragment": "gtceu:image", - "attributes": [ - "Position" - ], - "samplers": [ - { "name": "Sampler0" } - ], - "uniforms": [ - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh new file mode 100644 index 00000000000..0155fe518a1 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh @@ -0,0 +1,18 @@ +#version 150 + +uniform sampler2D Sampler0; + +uniform vec4 ColorModulator; + +in vec4 vertexColor; +in vec2 texCoord0; + +out vec4 fragColor; + +void main() { + vec4 color = texture(Sampler0, texCoord0); + if (color.a == 0.0) { + discard; + } + fragColor = vec4(ColorModulator.rgb * vertexColor.rgb, ColorModulator.a); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json new file mode 100644 index 00000000000..3890029b630 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json @@ -0,0 +1,22 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:rendertype_bloom", + "fragment": "gtceu:rendertype_bloom", + "attributes": [ + "Position", + "Color", + "UV0" + ], + "samplers": [ + { "name": "Sampler0" } + ], + "uniforms": [ + { "name": "ModelViewMat", "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": "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": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh new file mode 100644 index 00000000000..44e105d4c2c --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh @@ -0,0 +1,18 @@ +#version 150 + +in vec3 Position; +in vec4 Color; +in vec2 UV0; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +out vec4 vertexColor; +out vec2 texCoord0; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + + vertexColor = Color; + texCoord0 = UV0; +} diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh deleted file mode 100644 index 3eb53dbecc3..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.fsh +++ /dev/null @@ -1,32 +0,0 @@ -#version 150 - -out vec2 texCoord0; - -uniform sampler2D DiffuseSampler; -uniform vec2 u_resolution; -uniform vec2 texSize; -uniform vec2 blurDir; -uniform int kernel_radius; - -out vec4 fragColor; - -float gaussianPdf(in float x, in float sigma) { - return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma; -} - -void main(void){ - vec2 invSize = 1.0 / texSize; - float fSigma = float(kernel_radius); - float weightSum = gaussianPdf(0.0, fSigma); - vec3 diffuseSum = texture2D(DiffuseSampler, texCoord0).rgb * weightSum; - for( int i = 1; i < kernel_radius; i ++ ) { - float x = float(i); - float w = gaussianPdf(x, fSigma); - vec2 uvOffset = blurDir * invSize * x; - vec3 sample1 = texture2D(DiffuseSampler, texCoord0 + uvOffset).rgb; - vec3 sample2 = texture2D(DiffuseSampler, texCoord0 - uvOffset).rgb; - diffuseSum += (sample1 + sample2) * w; - weightSum += 2.0 * w; - } - fragColor = vec4(diffuseSum/weightSum, 1.0); -} diff --git a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json b/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json deleted file mode 100644 index ffb0280afa3..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/seperable_blur.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:image", - "fragment": "gtceu:seperable_blur", - "attributes": [ - "Position" - ], - "samplers": [ - { "name": "DiffuseSampler" } - ], - "uniforms": [ - { "name": "u_texture", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "texSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "blurDir", "type": "float", "count": 2, "values": [ 1.0, 0.0 ] }, - { "name": "kernel_radius", "type": "int", "count": 1, "values": [ 1 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh deleted file mode 100644 index 5cf1e9c7500..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/up_sampling.fsh +++ /dev/null @@ -1,38 +0,0 @@ -#version 150 - -out vec2 texCoord0; - -uniform sampler2D upTexture; -uniform sampler2D downTexture; -uniform vec2 u_resolution; -uniform vec2 u_resolution2; - -vec4 four_k(vec3 textel, vec2 uv) { - return (texture2D(upTexture, uv + textel.xx) //1 1 - + texture2D(upTexture, uv + textel.xy) // 1 -1 - + texture2D(upTexture, uv + textel.yx) // -1 1 - + texture2D(upTexture, uv + textel.yy)) * 0.25; // -1 -1 -} - -vec4 up_sampling(vec3 textel, vec2 uv) { - return vec4(four_k(textel, uv).rgb + texture2D(downTexture, uv).rgb, 1.); -} - -out vec4 fragColor; - -void main() { - vec3 textel = vec3(1., -1., 0.) / u_resolution.xyx; -// out_colour = up_sampling(textel, texCoord0); - - vec4 out_colour = texture2D(upTexture, texCoord0 + textel.xx); - out_colour += texture2D(upTexture, texCoord0 + textel.xz) * 2.0; - out_colour += texture2D(upTexture, texCoord0 + textel.xy); - out_colour += texture2D(upTexture, texCoord0 + textel.yz) * 2.0; - out_colour += texture2D(upTexture, texCoord0) * 4.0; - out_colour += texture2D(upTexture, texCoord0 + textel.zx) * 2.0; - out_colour += texture2D(upTexture, texCoord0 + textel.yy); - out_colour += texture2D(upTexture, texCoord0 + textel.zy) * 2.0; - out_colour += texture2D(upTexture, texCoord0 + textel.yx); - - fragColor = vec4(out_colour.rgb * 0.8 / 16. + texture2D(downTexture, texCoord0).rgb * 0.8, 1.); -} diff --git a/src/main/resources/assets/gtceu/shaders/core/up_sampling.json b/src/main/resources/assets/gtceu/shaders/core/up_sampling.json deleted file mode 100644 index 9a82edd2788..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/up_sampling.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:image", - "fragment": "gtceu:blur", - "attributes": [ - "Position" - ], - "samplers": [ - { "name": "upTexture" }, - { "name": "downTexture" } - ], - "uniforms": [ - { "name": "u_resolution", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "u_resolution2", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json new file mode 100644 index 00000000000..3fb7eec9a36 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -0,0 +1,116 @@ +{ + "targets": [ + { + "name": "swap2a", + "bilinear": true, + "scaleSize": { + "width": 0.5, + "height": 0.5 + } + }, + { + "name": "swap4a", + "bilinear": true, + "scaleSize": { + "width": 0.25, + "height": 0.25 + } + }, + { + "name": "swap8a", + "bilinear": true, + "scaleSize": { + "width": 0.125, + "height": 0.125 + } + }, + { + "name": "swap16a", + "bilinear": true, + "scaleSize": { + "width": 0.0625, + "height": 0.0625 + } + }, + { + "name": "swap2b", + "bilinear": true, + "scaleSize": { + "width": 0.5, + "height": 0.5 + } + }, + { + "name": "swap4b", + "bilinear": true, + "scaleSize": { + "width": 0.25, + "height": 0.25 + } + }, + { + "name": "swap8b", + "bilinear": true, + "scaleSize": { + "width": 0.125, + "height": 0.125 + } + }, + "final" + ], + "passes": [ + { + "name": "gtceu:down_sampling", + "intarget": "minecraft:main", + "outtarget": "swap2a" + }, + { + "name": "gtceu:down_sampling", + "intarget": "swap2a", + "outtarget": "swap4a" + }, + { + "name": "gtceu:down_sampling", + "intarget": "swap4a", + "outtarget": "swap8a" + }, + { + "name": "gtceu:down_sampling", + "intarget": "swap8a", + "outtarget": "swap16a" + }, + { + "name": "gtceu:blit", + "intarget": "swap16a", + "outtarget": "swap8b", + "auxtargets": [ + {"id":"swap8a", "name":"DownTexture"} + ] + }, + { + "name": "gtceu:up_sampling", + "intarget": "swap8b", + "outtarget": "swap4b", + "auxtargets": [ + {"id":"swap4a", "name":"DownTexture"} + ] + }, + { + "name": "gtceu:up_sampling", + "intarget": "swap4b", + "outtarget": "swap2b", + "auxtargets": [ + {"id":"swap2a", "name":"DownTexture"} + ] + }, + { + "name": "gtceu:unity_composite", + "intarget": "swap2b", + "outtarget": "final", + "auxtargets": [ + {"id":"minecraft:main", "name":"DownTexture"}, + {"id":"minecraft:main", "name":"Background"} + ] + } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json new file mode 100644 index 00000000000..d195576e947 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -0,0 +1,225 @@ +{ + "targets": [ + { + "name": "gtceu:filter_temp", + "blit": true, + "scaleSize": { + "width": 1, + "height": 1 + } + }, + { + "name": "swap2a", + "bilinear": true, + "scaleSize": { + "width": 0.5, + "height": 0.5 + } + }, + { + "name": "swap4a", + "bilinear": true, + "scaleSize": { + "width": 0.25, + "height": 0.25 + } + }, + { + "name": "swap8a", + "bilinear": true, + "scaleSize": { + "width": 0.125, + "height": 0.125 + } + }, + { + "name": "swap16a", + "bilinear": true, + "scaleSize": { + "width": 0.0625, + "height": 0.0625 + } + }, + { + "name": "swap2b", + "bilinear": true, + "scaleSize": { + "width": 0.5, + "height": 0.5 + } + }, + { + "name": "swap4b", + "bilinear": true, + "scaleSize": { + "width": 0.25, + "height": 0.25 + } + }, + { + "name": "swap8b", + "bilinear": true, + "scaleSize": { + "width": 0.125, + "height": 0.125 + } + }, + { + "name": "swap16b", + "bilinear": true, + "scaleSize": { + "width": 0.0625, + "height": 0.0625 + } + }, + "final" + ], + "passes": [ + { + "name": "gtceu:filter_bloom_color", + "intarget": "minecraft:main", + "outtarget": "gtceu:filter_temp", + "auxtargets": [ + {"id": "minecraft:main", "name": "MainSampler"} + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "gtceu:filter_temp", + "outtarget": "swap2a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [3] + } + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "swap2a", + "outtarget": "swap2b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [3] + } + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "swap2b", + "outtarget": "swap4a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [5] + } + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "swap4a", + "outtarget": "swap4b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [5] + } + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "swap4b", + "outtarget": "swap8a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [7] + } + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "swap8a", + "outtarget": "swap8b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [7] + } + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "swap8b", + "outtarget": "swap16a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [9] + } + ] + }, + { + "name": "gtceu:seperable_blur", + "intarget": "swap16a", + "outtarget": "swap16b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [9] + } + ] + }, + { + "name": "gtceu:unreal_composite", + "intarget": "minecraft:main", + "outtarget": "final", + "auxtargets": [ + {"id":"gtceu:filter_temp", "name":"HighLight"}, + {"id":"swap2b", "name":"BlurTexture1"}, + {"id":"swap4b", "name":"BlurTexture2"}, + {"id":"swap8b", "name":"BlurTexture3"}, + {"id":"swap16b", "name":"BlurTexture4"} + ], + "uniforms": [ + { + "name": "BloomRadius", + "values": [1.0] + } + ] + } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.fsh b/src/main/resources/assets/gtceu/shaders/program/blit.fsh new file mode 100644 index 00000000000..282a9d7deb4 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/blit.fsh @@ -0,0 +1,11 @@ +#version 150 + +uniform sampler2D DiffuseSampler; + +in vec2 texCoord; + +out vec4 fragColor; + +void main(){ + fragColor = texture(DiffuseSampler, texCoord); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.json b/src/main/resources/assets/gtceu/shaders/program/blit.json new file mode 100644 index 00000000000..dce11ef4dc4 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/blit.json @@ -0,0 +1,16 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:blit", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + { "name": "OutSize", "type": "float","count": 2, "values": [ 1.0, 1.0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/image.vsh b/src/main/resources/assets/gtceu/shaders/program/blit.vsh similarity index 64% rename from src/main/resources/assets/gtceu/shaders/core/image.vsh rename to src/main/resources/assets/gtceu/shaders/program/blit.vsh index a524695142e..f5ee1128912 100644 --- a/src/main/resources/assets/gtceu/shaders/core/image.vsh +++ b/src/main/resources/assets/gtceu/shaders/program/blit.vsh @@ -1,10 +1,12 @@ #version 150 -in vec3 Position; +in vec4 Position; -out vec2 texCoord0; +uniform vec2 OutSize; -void main(void){ +out vec2 texCoord; + +void main(){ float x = -1.0; float y = -1.0; if (Position.x > 0.001){ @@ -14,5 +16,5 @@ void main(void){ y = 1.0; } gl_Position = vec4(x, y, 0.2, 1.0); - texCoord0 = Position.xy; + texCoord = Position.xy / OutSize; } diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh new file mode 100644 index 00000000000..ba28dae9bc5 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh @@ -0,0 +1,47 @@ +#version 150 + +uniform sampler2D DiffuseSampler; +uniform vec2 OutSize; +uniform vec2 InSize; + +in vec2 texCoord; +out vec4 fragColor; + +vec4 four_k(vec3 textel, vec2 uv) { + return (texture(DiffuseSampler, uv + textel.xx) //1 1 + + texture(DiffuseSampler, uv + textel.xy) // 1 -1 + + texture(DiffuseSampler, uv + textel.yx) // -1 1 + + texture(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 +} + +void main(){ + vec3 textel1 = vec3(1., -1., 0.) / InSize.xyx; + vec3 textel2 = vec3(1., -1., 0.) / OutSize.xyx; + + vec4 out_colour = (four_k(textel1, texCoord + textel2.yy) // -1 -1 + + four_k(textel1, texCoord + textel2.zy) // 0 -1 + + four_k(textel1, texCoord + textel2.yz) // -1 0 + + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 + + out_colour += (four_k(textel1, texCoord + textel2.xy) // 1 -1 + + four_k(textel1, texCoord + textel2.zy) // 0 -1 + + four_k(textel1, texCoord + textel2.xz) // 1 0 + + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 + + out_colour += (four_k(textel1, texCoord + textel2.yx) // -1 1 + + four_k(textel1, texCoord + textel2.yz) // -1 0 + + four_k(textel1, texCoord + textel2.zx) // 0 1 + + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 + + out_colour += (four_k(textel1, texCoord + textel2.xx) // 1 1 + + four_k(textel1, texCoord + textel2.xz) // 1 0 + + four_k(textel1, texCoord + textel2.zx) // 0 1 + + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 + + out_colour += (four_k(textel1, texCoord + textel1.xx) // 1 1 + + four_k(textel1, texCoord + textel1.xy) // 1 -1 + + four_k(textel1, texCoord + textel1.yx) // -1 1 + + four_k(textel1, texCoord + textel1.yy)) * 0.25 * 0.5; // -1 -1 + + fragColor = vec4(out_colour.rgb, 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json new file mode 100644 index 00000000000..76f5eb3a64f --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json @@ -0,0 +1,17 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:down_sampling", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "InSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] } + ] +} 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 new file mode 100644 index 00000000000..5b562a48081 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.fsh @@ -0,0 +1,16 @@ +#version 150 + +uniform sampler2D DiffuseSampler; +uniform sampler2D MainSampler; + +in vec2 texCoord; + +out vec4 fragColor; + +void main(){ + fragColor = texture(DiffuseSampler, texCoord); + vec4 mainColor = texture(MainSampler, texCoord); + if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.01){ + fragColor = vec4(0.0); + } +} diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json new file mode 100644 index 00000000000..7feeceef892 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -0,0 +1,17 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:filter_bloom_color", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler"}, + { "name": "MainSampler"} + ], + "uniforms": [ + {"name": "OutSize", "type": "float", "count": 2, "values": [1.0, 1.0]} + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh new file mode 100644 index 00000000000..c70659dd855 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh @@ -0,0 +1,30 @@ +#version 150 + +uniform sampler2D DiffuseSampler; +uniform vec2 OutSize; +uniform vec2 BlurDir; +uniform float Radius; + +in vec2 texCoord; +out vec4 fragColor; + +float gaussianPdf(in float x, in float sigma) { + return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma; +} + +void main(){ + vec2 invSize = 1.0 / OutSize; + float fSigma = Radius; + float weightSum = gaussianPdf(0.0, fSigma); + vec3 diffuseSum = texture(DiffuseSampler, texCoord).rgb * weightSum; + for( int i = 1; i < int(Radius); i ++) { + float x = float(i); + float w = gaussianPdf(x, fSigma); + vec2 uvOffset = BlurDir * invSize * x; + vec3 sample1 = texture(DiffuseSampler, texCoord + uvOffset).rgb; + vec3 sample2 = texture(DiffuseSampler, texCoord - uvOffset).rgb; + diffuseSum += (sample1 + sample2) * w; + weightSum += 2.0 * w; + } + fragColor = vec4(diffuseSum/weightSum, 1.0); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json new file mode 100644 index 00000000000..11e24caac94 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json @@ -0,0 +1,20 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:seperable_blur", + "attributes": [ + "Position" + ], + "samplers": [ + {"name": "DiffuseSampler"} + ], + "uniforms": [ + {"name": "OutSize", "type": "float", "count": 2, "values": [1.0, 1.0]}, + {"name": "BlurDir", "type": "float", "count": 2, "values": [0.0, 0.0]}, + {"name": "Radius", "type": "float", "count": 1, "values": [5]} + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh new file mode 100644 index 00000000000..fdf48500ef4 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh @@ -0,0 +1,48 @@ +#version 150 + +uniform sampler2D DiffuseSampler; +uniform sampler2D DownTexture; +uniform sampler2D Background; +uniform vec2 OutSize; +uniform float BloomIntensive; +uniform float BloomBase; +uniform float BloomThresholdUp; +uniform float BloomThresholdDown; + +in vec2 texCoord; +out vec4 fragColor; + +vec4 four_k(vec3 textel, vec2 uv) { + return (texture(DiffuseSampler, uv + textel.xx) //1 1 + + texture(DiffuseSampler, uv + textel.xy) // 1 -1 + + texture(DiffuseSampler, uv + textel.yx) // -1 1 + + texture(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 +} + +vec4 up_sampling(vec3 textel, vec2 uv) { + return vec4(four_k(textel, uv).rgb + texture(DownTexture, uv).rgb, 1.); +} + +void main(){ + vec3 textel = vec3(1., -1., 0.) / OutSize.xyx; + // out_colour = up_sampling(textel, texCoord); + + vec4 out_colour = texture(DiffuseSampler, texCoord + textel.xx); + out_colour += texture(DiffuseSampler, texCoord + textel.xz) * 2.0; + out_colour += texture(DiffuseSampler, texCoord + textel.xy); + out_colour += texture(DiffuseSampler, texCoord + textel.yz) * 2.0; + out_colour += texture(DiffuseSampler, texCoord) * 4.0; + out_colour += texture(DiffuseSampler, texCoord + textel.zx) * 2.0; + out_colour += texture(DiffuseSampler, texCoord + textel.yy); + out_colour += texture(DiffuseSampler, texCoord + textel.zy) * 2.0; + out_colour += texture(DiffuseSampler, texCoord + textel.yx); + + vec4 highLight = texture(DownTexture, texCoord); + vec4 bloom = BloomIntensive * vec4(out_colour.rgb * 0.8 / 16. + highLight.rgb * 0.8, 1.); + + vec4 background = texture(Background, texCoord); + background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; + float max = max(background.b, max(background.r, background.g)); + float min = min(background.b, min(background.r, background.g)); + fragColor = vec4(background.rgb + bloom.rgb * ((1. - (max + min) / 2.) * (BloomThresholdUp - BloomThresholdDown) + BloomThresholdDown + BloomBase), 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json new file mode 100644 index 00000000000..b5ea58a6d24 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -0,0 +1,22 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:unity_composite", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" }, + { "name": "DownTexture" }, + { "name": "Background" } + ], + "uniforms": [ + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, + { "name": "BloomBase","type": "float","count": 1, "values": [ 0.0 ] }, + { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 1.3 ] }, + { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.3 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh new file mode 100644 index 00000000000..275d18e3a37 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -0,0 +1,66 @@ +#version 150 + +uniform sampler2D DiffuseSampler; +uniform sampler2D HighLight; +uniform sampler2D BlurTexture1; +uniform sampler2D BlurTexture2; +uniform sampler2D BlurTexture3; +uniform sampler2D BlurTexture4; +uniform float BloomRadius; +uniform float BloomIntensive; +//uniform float BloomBase; +//uniform float BloomThresholdUp; +//uniform float BloomThresholdDown; + +in vec2 texCoord; +out vec4 fragColor; + +float lerpBloomFactor(const in float factor) { + float mirrorFactor = 1.2 - factor; + return mix(factor, mirrorFactor, BloomRadius); +} + +vec3 aces(vec3 x) { + const float a = 2.51; + const float b = 0.03; + const float c = 2.43; + const float d = 0.59; + const float e = 0.14; + return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0); +} + +vec3 aces_tonemap(vec3 color){ + mat3 m1 = mat3( + 0.59719, 0.07600, 0.02840, + 0.35458, 0.90834, 0.13383, + 0.04823, 0.01566, 0.83777 + ); + mat3 m2 = mat3( + 1.60475, -0.10208, -0.00327, + -0.53108, 1.10813, -0.07276, + -0.07367, -0.00605, 1.07602 + ); + vec3 v = m1 * color; + vec3 a = v * (v + 0.0245786) - 0.000090537; + vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081; + return pow(clamp(m2 * (a / b), 0.0, 1.0), vec3(1.0 / 2.2)); +} + +vec3 jodieReinhardTonemap(vec3 c){ + float l = dot(c, vec3(0.2126, 0.7152, 0.0722)); + vec3 tc = c / (c + 1.0); + + return mix(c / (l + 1.0), tc, tc); +} + +void main() { + vec4 bloom = BloomIntensive * (lerpBloomFactor(1.) * texture(BlurTexture1, texCoord) + + lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + + lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + + lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); + + vec4 background = texture(DiffuseSampler, texCoord); + vec4 highLight = texture(HighLight, texCoord); + background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; + fragColor = vec4(background.rgb + jodieReinhardTonemap(bloom.rgb), 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json new file mode 100644 index 00000000000..ffebf1270cf --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -0,0 +1,23 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:unreal_composite", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" }, + { "name": "HighLight" }, + { "name": "BlurTexture1" }, + { "name": "BlurTexture2" }, + { "name": "BlurTexture3" }, + { "name": "BlurTexture4" } + ], + "uniforms": [ + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomRadius","type": "float","count": 1, "values": [ 1.0 ] }, + { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh new file mode 100644 index 00000000000..7500b29e3e3 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh @@ -0,0 +1,36 @@ +#version 150 + +uniform sampler2D DiffuseSampler; +uniform sampler2D DownTexture; +uniform vec2 OutSize; + +in vec2 texCoord; +out vec4 fragColor; + +vec4 four_k(vec3 textel, vec2 uv) { + return (texture(DiffuseSampler, uv + textel.xx) //1 1 + + texture(DiffuseSampler, uv + textel.xy) // 1 -1 + + texture(DiffuseSampler, uv + textel.yx) // -1 1 + + texture(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 +} + +vec4 up_sampling(vec3 textel, vec2 uv) { + return vec4(four_k(textel, uv).rgb + texture(DownTexture, uv).rgb, 1.); +} + +void main(){ + vec3 textel = vec3(1., -1., 0.) / OutSize.xyx; + // out_colour = up_sampling(textel, texCoord); + + vec4 out_colour = texture(DiffuseSampler, texCoord + textel.xx); // 1 1 + out_colour += texture(DiffuseSampler, texCoord + textel.xz) * 2.0; // 1 0 + out_colour += texture(DiffuseSampler, texCoord + textel.xy); // 1 -1 + out_colour += texture(DiffuseSampler, texCoord + textel.yz) * 2.0; // -1 0 + out_colour += texture(DiffuseSampler, texCoord) * 4.0; // 0 0 + out_colour += texture(DiffuseSampler, texCoord + textel.zx) * 2.0; // 0 1 + out_colour += texture(DiffuseSampler, texCoord + textel.yy); // -1 -1 + out_colour += texture(DiffuseSampler, texCoord + textel.zy) * 2.0; // 0 -1 + out_colour += texture(DiffuseSampler, texCoord + textel.yx); // -1 1 + + fragColor = vec4(out_colour.rgb * 0.8 / 16. + texture(DownTexture, texCoord).rgb * 0.8, 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json new file mode 100644 index 00000000000..95ca43d7c10 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -0,0 +1,17 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:up_sampling", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" }, + { "name": "DownTexture" } + ], + "uniforms": [ + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh new file mode 100644 index 00000000000..6758ebd8f25 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh @@ -0,0 +1,22 @@ +#version 150 + +uniform sampler2D DiffuseSampler; +uniform sampler2D HighLight; +uniform sampler2D BlurTexture; +uniform float BloomIntensive; +uniform float BloomBase; +uniform float BloomThresholdUp; +uniform float BloomThresholdDown; + +in vec2 texCoord; +out vec4 fragColor; + +void main() { + vec3 bloom = texture(BlurTexture, texCoord).rgb * BloomIntensive; + vec4 background = texture(DiffuseSampler, texCoord); + vec4 highLight = texture(HighLight, texCoord); + background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; + float max = max(background.b, max(background.r, background.g)); + float min = min(background.b, min(background.r, background.g)); + fragColor = vec4(background.rgb + bloom.rgb * ((1. - (max + min) / 2.) * (BloomThresholdUp - BloomThresholdDown) + BloomThresholdDown + BloomBase), 1.); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json new file mode 100644 index 00000000000..be846baf58c --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json @@ -0,0 +1,22 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:vanilla_composite", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" }, + { "name": "HighLight" }, + { "name": "BlurTexture" } + ], + "uniforms": [ + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, + { "name": "BloomBase","type": "float","count": 1, "values": [ 0.1 ] }, + { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 0.7 ] }, + { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.2 ] } + ] +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 0f20eb008be..a46a1f1d657 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -1,74 +1,76 @@ { - "required": true, - "minVersion": "0.8", - "refmap": "gtceu.refmap.json", - "package": "com.gregtechceu.gtceu.core.mixins", - "compatibilityLevel": "JAVA_17", - "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", - "client": [ - "BlockColorsMixin", - "BlockModelMixin", - "ClientLevelAccessor", - "CompassManagerMixin", - "GuiGraphicsAccessor", - "GuiGraphicsMixin", - "GuiHeartTypeMixin", - "LevelRendererMixin", - "ModelManagerMixin", - "MultiPlayerGameModeMixin", - "RenderTypeAccessor", - "rei.FluidEntryRendererMixin" - ], - "mixins": [ - "AbstractRegistrateAccessor", - "BlockBehaviourAccessor", - "BlockMixin", - "BlockPropertiesAccessor", - "ChunkGeneratorMixin", - "ChunkMixin", - "CreeperMixin", - "EntityMixin", - "IFoliagePlacerTypeAccessor", - "IHolderReferenceAccessor", - "IngredientAccessor", - "IntersectionIngredientAccessor", - "InventoryMixin", - "ItemValueAccessor", - "ITrunkPlacerTypeAccessor", - "LevelMixin", - "LivingEntityMixin", - "LootDataManagerMixin", - "LootPoolAccessor", - "OreConfigurationMixin", - "OreVeinifierMixin", - "PartialNBTIngredientAccessor", - "PrimedTntAccessor", - "RecipeManagerAccessor", - "RecipeManagerInvoker", - "RecipeManagerMixin", - "RepairItemRecipeMixin", - "ServerChunkProviderMixin", - "ServerGamePacketListenerImplAccessor", - "ShapedRecipeAccessor", - "SidedRedstoneConnectivityMixin", - "StrictNBTIngredientAccessor", - "TagLoaderMixin", - "TagManagerMixin", - "TagValueAccessor", - "ae2.GenericStackInvAccessor", - "create.RotationPropagatorMixin", - "embeddium.BiomeColorCacheMixin", - "embeddium.DefaultMaterialsMixin", - "embeddium.DefaultTerrainRenderPassesAccessor", - "embeddium.VanillaColorAdapterMixin", - "emi.FluidEmiStackMixin", - "jei.FluidHelperMixin", - "rei.InputSlotCrafterMixin", - "rei.RecipeFinderMixin", - "top.ConfigMixin" - ], - "injectors": { - "defaultRequire": 1, - "maxShiftBy": 5 - } + "required": true, + "minVersion": "0.8", + "refmap": "gtceu.refmap.json", + "package": "com.gregtechceu.gtceu.core.mixins", + "compatibilityLevel": "JAVA_17", + "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", + "client": [ + "BlockColorsMixin", + "BlockModelMixin", + "ClientLevelAccessor", + "CompassManagerMixin", + "GuiGraphicsAccessor", + "GuiGraphicsMixin", + "GuiHeartTypeMixin", + "LevelRendererMixin", + "ModelManagerMixin", + "MultiPlayerGameModeMixin", + "PostChainAccessor", + "PostPassMixin", + "RenderTypeAccessor", + "rei.FluidEntryRendererMixin" + ], + "mixins": [ + "AbstractRegistrateAccessor", + "BlockBehaviourAccessor", + "BlockMixin", + "BlockPropertiesAccessor", + "ChunkGeneratorMixin", + "ChunkMixin", + "CreeperMixin", + "EntityMixin", + "IFoliagePlacerTypeAccessor", + "IHolderReferenceAccessor", + "IngredientAccessor", + "IntersectionIngredientAccessor", + "InventoryMixin", + "ItemValueAccessor", + "ITrunkPlacerTypeAccessor", + "LevelMixin", + "LivingEntityMixin", + "LootDataManagerMixin", + "LootPoolAccessor", + "OreConfigurationMixin", + "OreVeinifierMixin", + "PartialNBTIngredientAccessor", + "PrimedTntAccessor", + "RecipeManagerAccessor", + "RecipeManagerInvoker", + "RecipeManagerMixin", + "RepairItemRecipeMixin", + "ServerChunkProviderMixin", + "ServerGamePacketListenerImplAccessor", + "ShapedRecipeAccessor", + "SidedRedstoneConnectivityMixin", + "StrictNBTIngredientAccessor", + "TagLoaderMixin", + "TagManagerMixin", + "TagValueAccessor", + "ae2.GenericStackInvAccessor", + "create.RotationPropagatorMixin", + "embeddium.BiomeColorCacheMixin", + "embeddium.DefaultMaterialsMixin", + "embeddium.DefaultTerrainRenderPassesAccessor", + "embeddium.VanillaColorAdapterMixin", + "emi.FluidEmiStackMixin", + "jei.FluidHelperMixin", + "rei.InputSlotCrafterMixin", + "rei.RecipeFinderMixin", + "top.ConfigMixin" + ], + "injectors": { + "defaultRequire": 1, + "maxShiftBy": 5 + } } From 9bc562a4e25707f0a93e1816ed489600d8f0904c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:26:29 +0300 Subject: [PATCH 005/269] ok time to remake completely cuz it don't wanna work --- .../gregtechceu/gtceu/client/ClientProxy.java | 2 +- .../gtceu/client/renderer/GTRenderTypes.java | 18 ++- .../gtceu/client/shader/GTShaders.java | 14 --- .../gtceu/client/util/BloomEffectUtil.java | 117 ++++++++++-------- .../gtceu/config/ConfigHolder.java | 4 +- .../gtceu/core/mixins/LevelRendererMixin.java | 33 +++-- .../gtceu/core/mixins/PostPassMixin.java | 31 ----- .../gtceu/shaders/core/rendertype_bloom.fsh | 14 ++- .../gtceu/shaders/core/rendertype_bloom.json | 11 +- .../gtceu/shaders/core/rendertype_bloom.vsh | 11 +- .../gtceu/shaders/post/bloom_unity.json | 7 +- .../gtceu/shaders/post/bloom_unreal.json | 7 +- .../shaders/program/filter_bloom_color.fsh | 9 +- .../shaders/program/filter_bloom_color.json | 3 +- src/main/resources/gtceu.mixins.json | 1 - 15 files changed, 155 insertions(+), 127 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/PostPassMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index c05c1100981..d5c7650baa0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -102,7 +102,7 @@ public void onRegisterParticleProviders(RegisterParticleProvidersEvent event) { @SubscribeEvent public void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { - event.register("bloom", BloomEffectUtil.getBloomLayer(), Sheets.cutoutBlockSheet()); + event.register("bloom", BloomEffectUtil.getEffectiveBloomLayer(), Sheets.cutoutBlockSheet()); } @SubscribeEvent 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 f3b9024d9ac..da49c1f05bb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.client.renderer; import com.gregtechceu.gtceu.client.shader.GTShaders; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraftforge.api.distmarker.Dist; @@ -13,9 +14,17 @@ public class GTRenderTypes extends RenderType { public static final RenderStateShard.ShaderStateShard BLOOM_SHADER = new RenderStateShard.ShaderStateShard(GTShaders::getBloomShader); - protected static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard("bloom_target", - () -> GTShaders.BLOOM_TARGET.bindWrite(false), - () -> GTShaders.BLOOM_TARGET.bindWrite(false)); + public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard("bloom_target", + () -> { + if (GTShaders.allowedShader()) { + GTShaders.BLOOM_TARGET.bindWrite(false); + } + }, + () -> { + if (GTShaders.allowedShader()) { + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + } + }); private static final RenderType LIGHT_RING = RenderType.create("light_ring", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 256, false, false, @@ -27,9 +36,10 @@ public class GTRenderTypes extends RenderType { private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, false, false, RenderType.CompositeState.builder() - .setShaderState(BLOOM_SHADER) + .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) .setOutputState(BLOOM_TARGET) .setCullState(RenderStateShard.NO_CULL) + .setDepthTestState(RenderStateShard.NO_DEPTH_TEST) .setTransparencyState(RenderStateShard.ADDITIVE_TRANSPARENCY) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 3f9545fff64..630c58b255d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -14,14 +14,10 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterShadersEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; import java.io.IOException; @OnlyIn(Dist.CLIENT) -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, modid = GTCEu.MOD_ID, value = Dist.CLIENT) public class GTShaders { public static final Minecraft mc = Minecraft.getInstance(); @@ -36,16 +32,6 @@ public static ShaderInstance getBloomShader() { return BLOOM_SHADER; } - @SubscribeEvent - public static void onRenderTickStart(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START) { - return; - } - if (BLOOM_CHAIN != null) { - BLOOM_CHAIN.process(event.renderTickTime); - } - } - public static void onRegisterShaders(RegisterShadersEvent event) { if (!allowedShader()) { return; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 6e5dfb11aad..d5617cd4d6c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -36,9 +36,9 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.lwjgl.opengl.GL11; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; import java.util.function.Supplier; @@ -52,6 +52,7 @@ public class BloomEffectUtil { private static final ReentrantLock BLOOM_RENDER_LOCK = new ReentrantLock(); private static RenderType bloom; + /** * @return {@link RenderType} instance for the bloom render layer. */ @@ -66,7 +67,7 @@ public static RenderType getBloomLayer() { * disabled, {@link RenderType#cutout()} is returned instead. * * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#cutout()} if bloom - * layer is disabled + * layer is disabled * @see #getEffectiveBloomLayer(RenderType) */ @NotNull @@ -81,7 +82,7 @@ public static RenderType getEffectiveBloomLayer() { * * @param fallback Block render layer to be returned when bloom layer is disabled * @return {@link RenderType} instance for the bloom render layer, or {@code fallback} if bloom layer is - * disabled + * disabled * @see #getEffectiveBloomLayer(boolean, RenderType) */ @Contract("null -> _; !null -> !null") @@ -97,7 +98,7 @@ public static RenderType getEffectiveBloomLayer(RenderType fallback) { * @param isBloomActive Whether bloom layer should be active. If this value is {@code false}, {@code fallback} layer * will be returned. Has no effect if Iris/Oculus is present. * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#cutout()} if bloom - * layer is disabled + * layer is disabled * @see #getEffectiveBloomLayer(boolean, RenderType) */ @NotNull @@ -114,7 +115,7 @@ public static RenderType getEffectiveBloomLayer(boolean isBloomActive) { * will be returned. Has no effect if Iris/Oculus is present. * @param fallback Block render layer to be returned when bloom layer is disabled * @return {@link RenderType} instance for the bloom render layer, or {@code fallback} if bloom layer is - * disabled + * disabled */ @Contract("_, null -> _; _, !null -> !null") public static RenderType getEffectiveBloomLayer(boolean isBloomActive, RenderType fallback) { @@ -132,9 +133,9 @@ public static RenderType getEffectiveBloomLayer(boolean isBloomActive, RenderTyp * returned instead. *

* - * @param setup Render setup, if exists - * @param bloomType Type of the bloom - * @param render Rendering callback + * @param setup Render setup, if exists + * @param bloomType Type of the bloom + * @param render Rendering callback * @param blockEntity Meta tile entity instance * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null || blockEntity == null} @@ -290,7 +291,7 @@ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { public static void init() { bloom = GTRenderTypes.getBloom(); - ((RenderTypeAccessor)bloom).setChunkLayerId(RenderType.chunkBufferLayers().size()); + ((RenderTypeAccessor) bloom).setChunkLayerId(RenderType.chunkBufferLayers().size()); RenderType.CHUNK_BUFFER_LAYERS = ImmutableList.builder() .addAll(RenderType.CHUNK_BUFFER_LAYERS) .add(bloom) @@ -319,61 +320,69 @@ public static void init() { } } + public static final AtomicBoolean isDrawingBlockBloom = new AtomicBoolean(false); + public static void renderBloom(double camX, double camY, double camZ, PoseStack poseStack, Frustum frustum, - double partialTicks, + float partialTicks, @NotNull Entity entity) { - Minecraft.getInstance().getProfiler().popPush("BTLayer"); + Minecraft.getInstance().getProfiler().popPush("gtceu_block_bloom"); - preDraw(); + BLOOM_RENDER_LOCK.lock(); + try { + preDraw(); - EffectRenderContext context = EffectRenderContext.getInstance() - .update(entity, camX, camY, camZ, frustum, (float) partialTicks); + EffectRenderContext context = EffectRenderContext.getInstance() + .update(entity, camX, camY, camZ, frustum, partialTicks); - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { - RenderSystem.depthMask(true); + GTRenderTypes.BLOOM_TARGET.setupRenderState(); - if (!BLOOM_RENDERS.isEmpty()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - for (List list : BLOOM_RENDERS.values()) { - draw(poseStack, buffer, context, list); + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { + RenderSystem.depthMask(true); + + if (!BLOOM_RENDERS.isEmpty()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + for (List list : BLOOM_RENDERS.values()) { + draw(poseStack, buffer, context, list); + } } - } - postDraw(); - RenderSystem.depthMask(false); + postDraw(); + RenderSystem.depthMask(false); - render(); - return; - } + render(partialTicks); + return; + } - BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; - BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; - BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; - BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; + BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; + BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; + BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; + BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; - // ********** render custom bloom ************ + // ********** render custom bloom ************ - if (!BLOOM_RENDERS.isEmpty()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - for (var e : BLOOM_RENDERS.entrySet()) { - BloomRenderKey key = e.getKey(); - List list = e.getValue(); + RenderSystem.depthMask(true); + if (!BLOOM_RENDERS.isEmpty()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + for (var e : BLOOM_RENDERS.entrySet()) { + List list = e.getValue(); - RenderSystem.depthMask(true); - draw(poseStack, buffer, context, list); - RenderSystem.depthMask(false); + draw(poseStack, buffer, context, list); + } + Tesselator.getInstance().end(); } - } + RenderSystem.depthMask(false); - RenderSystem.blendFunc(GL11.GL_DST_ALPHA, GL11.GL_ZERO); - RenderSystem.enableBlend(); - render(); - RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderSystem.disableBlend(); + isDrawingBlockBloom.set(true); + render(partialTicks); + isDrawingBlockBloom.set(false); - postDraw(); + postDraw(); + GTRenderTypes.BLOOM_TARGET.clearRenderState(); + } finally { + BLOOM_RENDER_LOCK.unlock(); + } } private static void preDraw() { @@ -409,7 +418,7 @@ private static void draw(@NotNull PoseStack poseStack, } private static void postDraw() { - for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext();) { + for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext(); ) { List list = it.next(); if (!list.isEmpty()) { @@ -432,7 +441,7 @@ private static void postDraw() { private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void render() { + private static void render(float partialTicks) { if (GTShaders.allowedShader()) { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate( @@ -442,9 +451,12 @@ private static void render() { List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { EffectInstance shader = pass.getEffect(); - int index = passes.indexOf(pass); + shader.safeGetUniform("iTime").set(GTShaders.getITime(partialTicks)); + shader.safeGetUniform("EnableFilter").set(BloomEffectUtil.isDrawingBlockBloom.get() ? 1 : 0); + if (GTShaders.BLOOM_TYPE == BloomType.UNREAL) { if (shader.getName().equals(SEPERABLE_BLUR_SHADER_NAME)) { + int index = passes.indexOf(pass); switch (index) { case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); case 2, 4, 6, 8 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); @@ -460,7 +472,7 @@ private static void render() { } } - GTShaders.BLOOM_TARGET.blitToScreen(GTShaders.mc.getWindow().getWidth(), GTShaders.mc.getWindow().getHeight(), false); + GTShaders.BLOOM_CHAIN.process(partialTicks); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } @@ -484,7 +496,8 @@ public static final class BloomRenderTicket { private boolean invalidated; BloomRenderTicket() { - this(null, BloomType.DISABLED, (p, b, c) -> {}, null, null); + this(null, BloomType.DISABLED, (p, b, c) -> { + }, null, null); this.invalidated = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index b780d97378c..5d27b0623c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -735,7 +735,7 @@ public static class FusionBloom { public double strength = 1.5; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast)", "1 - Unity Bloom", + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) @Configurable.Range(min = 0, max = 2) public int bloomStyle = 1; @@ -781,7 +781,7 @@ public static class HeatEffectBloom { public double strength = 1.1; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast)", "1 - Unity Bloom", + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) @Configurable.Range(min = 0, max = 2) public int bloomStyle = 2; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 1ecd9fc9354..fd0fcb18f31 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -3,9 +3,9 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -109,19 +109,34 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo throw new AssertionError(); } - @Inject(method = "renderLevel", at = @At("RETURN")) - private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { + @Shadow public abstract Frustum getFrustum(); + + @Shadow public abstract void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix); + + @Inject(method = "renderLevel", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/DimensionSpecialEffects;constantAmbientLight()Z")) + private void gtceu$injectRenderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, + boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, + LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + this.renderChunkLayer(GTRenderTypes.getBloom(), poseStack, + camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, projectionMatrix); BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, poseStack, getFrustum(), partialTick, camera.getEntity()); } - @Shadow public abstract Frustum getFrustum(); + @Inject(method = "resize", at = @At("TAIL")) + private void gtceu$resize(int width, int height, CallbackInfo ci) { + if (GTShaders.BLOOM_CHAIN != null) { + GTShaders.BLOOM_CHAIN.resize(width, height); + } + } @Inject(method = "renderHitOutline", at = @At("HEAD")) - private void renderHitOutline(PoseStack poseStack, VertexConsumer consumer, Entity entity, double camX, double camY, - double camZ, BlockPos pos, BlockState state, CallbackInfo ci) { + private void gtceu$renderAOEHitOutline(PoseStack poseStack, VertexConsumer consumer, Entity entity, double camX, double camY, + double camZ, BlockPos pos, BlockState state, CallbackInfo ci) { if (minecraft.player == null || minecraft.level == null) return; ItemStack mainHandItem = minecraft.player.getMainHandItem(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/PostPassMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/PostPassMixin.java deleted file mode 100644 index 1ed1637a334..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/PostPassMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import com.gregtechceu.gtceu.client.shader.GTShaders; -import net.minecraft.client.renderer.EffectInstance; -import net.minecraft.client.renderer.PostPass; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -/** - * @author KilaBash - * @date 2022/05/03 - * @implNote PostChainMixin, add more features for vanilla PostChain stuff - */ -@Mixin(PostPass.class) -public abstract class PostPassMixin { - @Shadow - @Final - private EffectInstance effect; - - @Inject(method = "process", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/EffectInstance;safeGetUniform(Ljava/lang/String;)Lcom/mojang/blaze3d/shaders/AbstractUniform;", ordinal = 1)) - private void injectParseTargetNode(float pPartialTicks, CallbackInfo ci) { - this.effect.safeGetUniform("iTime").set(GTShaders.getITime(pPartialTicks)); - } -} 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 0155fe518a1..efd23f929c0 100644 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh @@ -1,18 +1,26 @@ #version 150 +#moj_import + uniform sampler2D Sampler0; uniform vec4 ColorModulator; +uniform float FogStart; +uniform float FogEnd; +uniform vec4 FogColor; +in float vertexDistance; in vec4 vertexColor; in vec2 texCoord0; +in vec4 normal; out vec4 fragColor; void main() { - vec4 color = texture(Sampler0, texCoord0); - if (color.a == 0.0) { + vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; + if (color.a < 0.1) { discard; } - fragColor = vec4(ColorModulator.rgb * vertexColor.rgb, ColorModulator.a); + fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); } + diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json index 3890029b630..952d98dd2fa 100644 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json @@ -9,7 +9,9 @@ "attributes": [ "Position", "Color", - "UV0" + "UV0", + "UV2", + "Normal" ], "samplers": [ { "name": "Sampler0" } @@ -17,6 +19,11 @@ "uniforms": [ { "name": "ModelViewMat", "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": "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": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] } + { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, + { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, + { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh index 44e105d4c2c..3ebea95789a 100644 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh @@ -1,18 +1,25 @@ #version 150 +#moj_import + in vec3 Position; -in vec4 Color; in vec2 UV0; +in vec4 Color; uniform mat4 ModelViewMat; uniform mat4 ProjMat; +uniform vec3 ChunkOffset; +uniform int FogShape; +out float vertexDistance; out vec4 vertexColor; out vec2 texCoord0; void main() { - gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + vec3 pos = Position + ChunkOffset; + gl_Position = ProjMat * ModelViewMat * vec4(pos, 1.0); + vertexDistance = fog_distance(ModelViewMat, pos, FogShape); vertexColor = Color; texCoord0 = UV0; } 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 3fb7eec9a36..8f62f9d191a 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -61,7 +61,7 @@ "passes": [ { "name": "gtceu:down_sampling", - "intarget": "minecraft:main", + "intarget": "final", "outtarget": "swap2a" }, { @@ -111,6 +111,11 @@ {"id":"minecraft:main", "name":"DownTexture"}, {"id":"minecraft:main", "name":"Background"} ] + }, + { + "name": "blit", + "intarget": "final", + "outtarget": "minecraft:main" } ] } 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 d195576e947..111405b9026 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -77,7 +77,7 @@ "passes": [ { "name": "gtceu:filter_bloom_color", - "intarget": "minecraft:main", + "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ {"id": "minecraft:main", "name": "MainSampler"} @@ -220,6 +220,11 @@ "values": [1.0] } ] + }, + { + "name": "blit", + "intarget": "final", + "outtarget": "minecraft:main" } ] } 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 5b562a48081..3ce28090828 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 @@ -2,6 +2,7 @@ uniform sampler2D DiffuseSampler; uniform sampler2D MainSampler; +uniform bool EnableFilter; in vec2 texCoord; @@ -9,8 +10,10 @@ out vec4 fragColor; void main(){ fragColor = texture(DiffuseSampler, texCoord); - vec4 mainColor = texture(MainSampler, texCoord); - if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.01){ - fragColor = vec4(0.0); + if (EnableFilter){ + vec4 mainColor = texture(MainSampler, texCoord); + if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.01){ + fragColor = vec4(0.0); + } } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 7feeceef892..736f5f855b1 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -12,6 +12,7 @@ { "name": "MainSampler"} ], "uniforms": [ - {"name": "OutSize", "type": "float", "count": 2, "values": [1.0, 1.0]} + {"name": "OutSize", "type": "float", "count": 2, "values": [1.0, 1.0]}, + {"name": "EnableFilter", "type": "int", "count": 1, "values": [1.0]} ] } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index a46a1f1d657..4c37c6b92b3 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -17,7 +17,6 @@ "ModelManagerMixin", "MultiPlayerGameModeMixin", "PostChainAccessor", - "PostPassMixin", "RenderTypeAccessor", "rei.FluidEntryRendererMixin" ], From 903f9e64b13c077fef662986fc7ed95dbdd1dc1d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 6 Oct 2024 22:36:04 +0300 Subject: [PATCH 006/269] y u no work :wuh: (It doesn't render the buffer contents for whatever reason, I know there's verts in there) --- dependencies.gradle | 2 +- .../gregtechceu/gtceu/client/ClientProxy.java | 4 +- .../gtceu/client/model/GTMetadataSection.java | 77 ++++++++++ .../gtceu/client/renderer/GTRenderTypes.java | 9 +- .../machine/FusionReactorRenderer.java | 2 +- .../gtceu/client/shader/GTShaders.java | 24 +-- .../gtceu/client/util/BloomEffectUtil.java | 125 +-------------- .../gtceu/client/util/RenderUtil.java | 43 ------ .../gtceu/common/data/GTModels.java | 6 +- .../gtceu/core/mixins/LevelRendererMixin.java | 9 +- .../core/mixins/ModelBlockRendererMixin.java | 34 +++++ .../gtceu/core/mixins/QuadLighterMixin.java | 35 +++++ .../embeddium/DefaultMaterialsMixin.java | 25 --- .../DefaultTerrainRenderPassesAccessor.java | 17 --- .../resources/META-INF/accesstransformer.cfg | 5 - .../gtceu/shaders/core/rendertype_bloom.fsh | 26 ---- .../gtceu/shaders/core/rendertype_bloom.json | 29 ---- .../gtceu/shaders/core/rendertype_bloom.vsh | 25 --- .../machine_coil_cupronickel_bloom.png.mcmeta | 4 +- ...hine_coil_cupronickel_bloom_ctm.png.mcmeta | 4 +- .../coils/machine_coil_hssg_bloom.png.mcmeta | 4 +- .../machine_coil_hssg_bloom_ctm.png.mcmeta | 4 +- .../machine_coil_kanthal_bloom.png.mcmeta | 4 +- .../machine_coil_kanthal_bloom_ctm.png.mcmeta | 4 +- ...oil_molybdenum_disilicide_bloom.png.mcmeta | 4 +- ...molybdenum_disilicide_bloom_ctm.png.mcmeta | 4 +- .../machine_coil_naquadah_bloom.png.mcmeta | 4 +- ...machine_coil_naquadah_bloom_ctm.png.mcmeta | 4 +- .../machine_coil_nichrome_bloom.png.mcmeta | 4 +- ...machine_coil_nichrome_bloom_ctm.png.mcmeta | 4 +- .../machine_coil_rtm_alloy_bloom.png.mcmeta | 4 +- ...achine_coil_rtm_alloy_bloom_ctm.png.mcmeta | 4 +- ...chine_coil_superconductor_bloom.png.mcmeta | 4 +- ...e_coil_superconductor_bloom_ctm.png.mcmeta | 4 +- .../machine_coil_trinium_bloom.png.mcmeta | 4 +- .../machine_coil_trinium_bloom_ctm.png.mcmeta | 4 +- .../machine_coil_tritanium_bloom.png.mcmeta | 4 +- ...achine_coil_tritanium_bloom_ctm.png.mcmeta | 4 +- ...achine_coil_tungstensteel_bloom.png.mcmeta | 4 +- ...ne_coil_tungstensteel_bloom_ctm.png.mcmeta | 4 +- .../fusion/fusion_casing_bloom.png.mcmeta | 2 +- .../superconducting_coil_bloom.png.mcmeta | 4 +- .../superconducting_coil_bloom_ctm.png.mcmeta | 4 +- ...hine_casing_assembly_line_bloom.png.mcmeta | 2 +- .../casings/unique/heat_vent_bloom.png.mcmeta | 2 +- .../black_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/black_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/black_emissive.png.mcmeta | 2 +- .../lamps/blue_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/blue_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/blue_emissive.png.mcmeta | 2 +- .../brown_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/brown_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/brown_emissive.png.mcmeta | 2 +- .../lamps/cyan_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/cyan_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/cyan_emissive.png.mcmeta | 2 +- .../lamps/gray_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/gray_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/gray_emissive.png.mcmeta | 2 +- .../green_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/green_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/green_emissive.png.mcmeta | 2 +- .../light_blue_borderless_emissive.png.mcmeta | 2 +- .../lamps/light_blue_ctm_emissive.png.mcmeta | 2 +- .../lamps/light_blue_emissive.png.mcmeta | 2 +- .../light_gray_borderless_emissive.png.mcmeta | 2 +- .../lamps/light_gray_ctm_emissive.png.mcmeta | 2 +- .../lamps/light_gray_emissive.png.mcmeta | 2 +- .../lamps/lime_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/lime_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/lime_emissive.png.mcmeta | 2 +- .../magenta_borderless_emissive.png.mcmeta | 2 +- .../lamps/magenta_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/magenta_emissive.png.mcmeta | 2 +- .../orange_borderless_emissive.png.mcmeta | 2 +- .../lamps/orange_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/orange_emissive.png.mcmeta | 2 +- .../lamps/pink_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/pink_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/pink_emissive.png.mcmeta | 2 +- .../purple_borderless_emissive.png.mcmeta | 2 +- .../lamps/purple_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/purple_emissive.png.mcmeta | 2 +- .../lamps/red_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/red_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/red_emissive.png.mcmeta | 2 +- .../white_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/white_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/white_emissive.png.mcmeta | 2 +- .../yellow_borderless_emissive.png.mcmeta | 2 +- .../lamps/yellow_ctm_emissive.png.mcmeta | 2 +- .../block/lamps/yellow_emissive.png.mcmeta | 2 +- .../ld_fluid_pipe/overlay_bottom.png.mcmeta | 4 +- .../ld_fluid_pipe/overlay_left.png.mcmeta | 4 +- .../ld_fluid_pipe/overlay_right.png.mcmeta | 4 +- .../pipe/ld_fluid_pipe/overlay_top.png.mcmeta | 4 +- .../ld_item_pipe/overlay_bottom.png.mcmeta | 4 +- .../pipe/ld_item_pipe/overlay_left.png.mcmeta | 4 +- .../ld_item_pipe/overlay_right.png.mcmeta | 4 +- .../pipe/ld_item_pipe/overlay_top.png.mcmeta | 4 +- src/main/resources/gtceu.mixins.json | 144 +++++++++--------- 102 files changed, 356 insertions(+), 515 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java delete mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json delete mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh diff --git a/dependencies.gradle b/dependencies.gradle index 8b5417a8810..5946f47e34c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -58,7 +58,7 @@ dependencies { // Shimmer modCompileOnly(forge.shimmer.forge) { transitive = false } - modImplementation("maven.modrinth:embeddium:0.3.31+mc1.20.1") + modCompileOnly("maven.modrinth:embeddium:0.3.31+mc1.20.1") modCompileOnly("maven.modrinth:oculus:1.20.1-1.7.0") // JAVD diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index d5c7650baa0..8b1d262a831 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -99,12 +99,12 @@ public void onRegisterGuiOverlays(RegisterGuiOverlaysEvent event) { public void onRegisterParticleProviders(RegisterParticleProvidersEvent event) { event.registerSpriteSet(GTParticleTypes.HAZARD_PARTICLE.get(), HazardParticle.Provider::new); } - +/* @SubscribeEvent public void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { event.register("bloom", BloomEffectUtil.getEffectiveBloomLayer(), Sheets.cutoutBlockSheet()); } - +*/ @SubscribeEvent public void onRegisterShaders(RegisterShadersEvent event) { GTShaders.onRegisterShaders(event); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java new file mode 100644 index 00000000000..79a71f2e09b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java @@ -0,0 +1,77 @@ +package com.gregtechceu.gtceu.client.model; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.gregtechceu.gtceu.GTCEu; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.metadata.MetadataSectionSerializer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +public record GTMetadataSection(boolean bloom) { + public static final String SECTION_NAME = GTCEu.MOD_ID; + public static final GTMetadataSection MISSING = new GTMetadataSection(false); + + @Nullable + public static GTMetadataSection getMetadata(ResourceLocation res) { + GTMetadataSection ret = MISSING; + try { + var resource = Minecraft.getInstance().getResourceManager().getResource(res); + if (resource.isPresent()) { + ret = resource.get().metadata().getSection(GTMetadataSection.Serializer.INSTANCE).orElse(MISSING); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + return ret; + } + + public static boolean hasBloom(TextureAtlasSprite sprite) { + if (sprite == null) return false; + //noinspection resource + GTMetadataSection ret = getMetadata(spriteToAbsolute(sprite.contents().name())); + return ret != null && ret.bloom; + } + + public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { + if (!sprite.getPath().startsWith("textures/")) { + sprite = sprite.withPrefix("textures/"); + } + if (!sprite.getPath().endsWith(".png")) { + sprite = sprite.withSuffix(".png"); + } + return sprite; + } + + public static class Serializer + implements MetadataSectionSerializer { + static GTMetadataSection.Serializer INSTANCE = new GTMetadataSection.Serializer(); + + @NotNull + @Override + public String getMetadataSectionName() { + return SECTION_NAME; + } + + @Override + public GTMetadataSection fromJson(JsonObject json) { + boolean bloom = false; + if (json.isJsonObject()) { + JsonObject obj = json.getAsJsonObject(); + if (obj.has("bloom")) { + JsonElement element = obj.get("bloom"); + if (element.isJsonPrimitive() && + element.getAsJsonPrimitive().isBoolean()) { + bloom = element.getAsBoolean(); + } + } + } + return new GTMetadataSection(bloom); + } + } +} + 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 da49c1f05bb..d2cbf065446 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -13,7 +13,6 @@ @OnlyIn(Dist.CLIENT) public class GTRenderTypes extends RenderType { - public static final RenderStateShard.ShaderStateShard BLOOM_SHADER = new RenderStateShard.ShaderStateShard(GTShaders::getBloomShader); public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard("bloom_target", () -> { if (GTShaders.allowedShader()) { @@ -30,17 +29,17 @@ public class GTRenderTypes extends RenderType { DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 256, false, false, RenderType.CompositeState.builder() .setCullState(RenderStateShard.NO_CULL) + .setOutputState(BLOOM_TARGET) .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) .createCompositeState(false)); private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, - 256, false, false, + 131072, false, false, RenderType.CompositeState.builder() + .setLightmapState(RenderStateShard.NO_LIGHTMAP) .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) + .setTextureState(RenderStateShard.BLOCK_SHEET) .setOutputState(BLOOM_TARGET) - .setCullState(RenderStateShard.NO_CULL) - .setDepthTestState(RenderStateShard.NO_DEPTH_TEST) - .setTransparencyState(RenderStateShard.ADDITIVE_TRANSPARENCY) .createCompositeState(false)); private GTRenderTypes(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java index cb4f4dcaf33..d9407ac8d69 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java @@ -53,7 +53,7 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P float r = ColorUtils.red(ringColor); float g = ColorUtils.green(ringColor); float b = ColorUtils.blue(ringColor); - RenderBufferHelper.renderRing(stack, buffer.getBuffer(BloomEffectUtil.getEffectiveBloomLayer()), + RenderBufferHelper.renderRing(stack, buffer.getBuffer(GTRenderTypes.getLightRing()), relativeBack.getStepX() * 7 + 0.5F, relativeBack.getStepY() * 7 + 0.5F, relativeBack.getStepZ() * 7 + 0.5F, diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 630c58b255d..497928db6bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -2,15 +2,14 @@ import com.google.gson.JsonSyntaxException; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.config.ConfigHolder; import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.BufferBuilder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.PostChain; -import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceProvider; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterShadersEvent; @@ -22,36 +21,21 @@ public class GTShaders { public static final Minecraft mc = Minecraft.getInstance(); - public static ShaderInstance BLOOM_SHADER; - public static PostChain BLOOM_CHAIN; public static BloomType BLOOM_TYPE; public static RenderTarget BLOOM_TARGET; - public static ShaderInstance getBloomShader() { - return BLOOM_SHADER; - } + public static BufferBuilder BLOOM_BUFFER = new BufferBuilder(GTRenderTypes.getBloom().bufferSize()); public static void onRegisterShaders(RegisterShadersEvent event) { if (!allowedShader()) { return; } - ResourceProvider resourceProvider = event.getResourceProvider(); - - try { - event.registerShader( - new ShaderInstance(resourceProvider, GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), - shader -> BLOOM_SHADER = shader); - } catch (IOException ioException) { - GTCEu.LOGGER.error("Failed to load shader: gtceu:rendertype_bloom", ioException); - BLOOM_SHADER = null; - } - initPostShaders(); } - public static void initPostShaders() { + private static void initPostShaders() { if (BLOOM_CHAIN != null) { BLOOM_CHAIN.close(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index d5617cd4d6c..b48d1a964b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.client.util; -import com.google.common.collect.ImmutableList; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; @@ -11,20 +10,13 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.PostChainAccessor; -import com.gregtechceu.gtceu.core.mixins.RenderTypeAccessor; -import com.gregtechceu.gtceu.core.mixins.embeddium.DefaultTerrainRenderPassesAccessor; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; import net.minecraft.client.renderer.PostPass; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -32,8 +24,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import org.apache.commons.lang3.ArrayUtils; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -51,77 +41,6 @@ public class BloomEffectUtil { private static final ReentrantLock BLOOM_RENDER_LOCK = new ReentrantLock(); - private static RenderType bloom; - - /** - * @return {@link RenderType} instance for the bloom render layer. - */ - @NotNull - public static RenderType getBloomLayer() { - return Objects.requireNonNull(bloom, "Bloom effect is not initialized yet"); - } - - /** - * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is - * disabled, {@link RenderType#cutout()} is returned instead. - * - * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#cutout()} if bloom - * layer is disabled - * @see #getEffectiveBloomLayer(RenderType) - */ - @NotNull - public static RenderType getEffectiveBloomLayer() { - return getEffectiveBloomLayer(RenderType.cutout()); - } - - /** - * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is - * disabled, the fallback layer specified is returned instead. - * - * @param fallback Block render layer to be returned when bloom layer is disabled - * @return {@link RenderType} instance for the bloom render layer, or {@code fallback} if bloom layer is - * disabled - * @see #getEffectiveBloomLayer(boolean, RenderType) - */ - @Contract("null -> _; !null -> !null") - public static RenderType getEffectiveBloomLayer(RenderType fallback) { - return GTCEu.isIrisOculusLoaded() ? fallback : bloom; - } - - /** - * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is - * disabled, {@link RenderType#cutout()} is returned instead. - * - * @param isBloomActive Whether bloom layer should be active. If this value is {@code false}, {@code fallback} layer - * will be returned. Has no effect if Iris/Oculus is present. - * @return {@link RenderType} instance for the bloom render layer, or {@link RenderType#cutout()} if bloom - * layer is disabled - * @see #getEffectiveBloomLayer(boolean, RenderType) - */ - @NotNull - public static RenderType getEffectiveBloomLayer(boolean isBloomActive) { - return getEffectiveBloomLayer(isBloomActive, RenderType.cutout()); - } - - /** - * Get "effective bloom layer", i.e. the actual render layer that emissive textures get rendered. Effective bloom - * layers can be changed depending on external factors, such as presence of Iris/Oculus. If the actual bloom layer is - * disabled, the fallback layer specified is returned instead. - * - * @param isBloomActive Whether bloom layer should be active. If this value is {@code false}, {@code fallback} layer - * will be returned. Has no effect if Iris/Oculus is present. - * @param fallback Block render layer to be returned when bloom layer is disabled - * @return {@link RenderType} instance for the bloom render layer, or {@code fallback} if bloom layer is - * disabled - */ - @Contract("_, null -> _; _, !null -> !null") - public static RenderType getEffectiveBloomLayer(boolean isBloomActive, RenderType fallback) { - return GTCEu.isIrisOculusLoaded() || !isBloomActive ? fallback : bloom; - } - /** *

* Register a custom bloom render callback for subsequent world render. The render call persists until the @@ -287,38 +206,7 @@ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { } } - public static Supplier> EMBEDDIUM_MATERIAL_BLOOM; - - public static void init() { - bloom = GTRenderTypes.getBloom(); - ((RenderTypeAccessor) bloom).setChunkLayerId(RenderType.chunkBufferLayers().size()); - RenderType.CHUNK_BUFFER_LAYERS = ImmutableList.builder() - .addAll(RenderType.CHUNK_BUFFER_LAYERS) - .add(bloom) - .build(); - - if (GTCEu.isSodiumRubidiumEmbeddiumLoaded()) { - // Add our render type to embeddium's render passes by force (until an API is added) - - /* FOR UNRELEASED EMBEDDIUM!!! - - TerrainRenderPass bloomPass = TerrainRenderPass.builder() - .layer(bloom) - .fragmentDiscard(true) - .useReverseOrder(false) - .useTranslucencySorting(true) - .build(); - var map = new HashMap<>(DefaultTerrainRenderPassesAccessor.getRenderPassMappings()); - map.put(bloom, List.of(bloomPass)); - DefaultTerrainRenderPassesAccessor.setRenderPassMappings(map); - */ - TerrainRenderPass bloomPass = new TerrainRenderPass(bloom, false, true); - DefaultTerrainRenderPassesAccessor.setAll(ArrayUtils.add(DefaultTerrainRenderPasses.ALL, bloomPass)); - - Material bloomMaterial = new Material(bloomPass, AlphaCutoffParameter.ZERO, true); - EMBEDDIUM_MATERIAL_BLOOM = () -> () -> bloomMaterial; - } - } + public static void init() {} public static final AtomicBoolean isDrawingBlockBloom = new AtomicBoolean(false); @@ -342,9 +230,8 @@ public static void renderBloom(double camX, double camY, double camZ, RenderSystem.depthMask(true); if (!BLOOM_RENDERS.isEmpty()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); for (List list : BLOOM_RENDERS.values()) { - draw(poseStack, buffer, context, list); + draw(poseStack, GTShaders.BLOOM_BUFFER, context, list); } } postDraw(); @@ -364,11 +251,10 @@ public static void renderBloom(double camX, double camY, double camZ, RenderSystem.depthMask(true); if (!BLOOM_RENDERS.isEmpty()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); for (var e : BLOOM_RENDERS.entrySet()) { List list = e.getValue(); - draw(poseStack, buffer, context, list); + draw(poseStack, GTShaders.BLOOM_BUFFER, context, list); } Tesselator.getInstance().end(); } @@ -472,9 +358,14 @@ private static void render(float partialTicks) { } } + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + GTShaders.BLOOM_TARGET.bindWrite(false); + BufferUploader.draw(GTShaders.BLOOM_BUFFER.end()); + GTShaders.BLOOM_CHAIN.process(partialTicks); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java deleted file mode 100644 index 617416705a6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.client.util; - -import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.platform.GlStateManager; -import net.minecraft.client.Minecraft; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.lwjgl.opengl.*; - -@OnlyIn(Dist.CLIENT) -public class RenderUtil { - - public static boolean updateFBOSize(RenderTarget fbo, int width, int height) { - if (fbo.width != width || fbo.height != height) { - fbo.createBuffers(width, height, Minecraft.ON_OSX); - return true; - } - return false; - } - - public static void hookDepthBuffer(RenderTarget fbo, int depthBuffer) { - // Hook DepthBuffer - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo.frameBufferId); - GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, - depthBuffer, 0); - if (fbo.isStencilEnabled()) { - GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_STENCIL_ATTACHMENT, GL11.GL_TEXTURE_2D, - depthBuffer, 0); - } - } - - public static void hookDepthTexture(RenderTarget fbo, int depthTexture) { - // Hook DepthTexture - GlStateManager._glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo.frameBufferId); - if (fbo.isStencilEnabled()) { - GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, - GL11.GL_TEXTURE_2D, depthTexture, 0); - } else { - GlStateManager._glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, - GL11.GL_TEXTURE_2D, depthTexture, 0); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java index daf0588582d..c500a9dc93d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java @@ -136,16 +136,14 @@ public static NonNullBiConsumer, RegistrateBloc if (border) { model.texture("active", "block/lamps/" + color.getName()); if (state.getValue(LampBlock.BLOOM)) { - model.texture("active_overlay", "block/lamps/" + color.getName() + "_emissive") - .renderType(GTCEu.id("bloom")); + model.texture("active_overlay", "block/lamps/" + color.getName() + "_emissive"); } else { model.texture("active_overlay", "block/lamps/" + color.getName()); } } else { if (state.getValue(LampBlock.BLOOM)) { model.texture("active", - "block/lamps/" + color.getName() + "_borderless_emissive") - .renderType(GTCEu.id("bloom")); + "block/lamps/" + color.getName() + "_borderless_emissive"); } else { model.texture("active", "block/lamps/" + color.getName() + "_borderless"); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index fd0fcb18f31..9b786eb5a08 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -23,9 +24,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; -import com.mojang.blaze3d.vertex.VertexConsumer; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; @@ -111,8 +109,6 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo @Shadow public abstract Frustum getFrustum(); - @Shadow public abstract void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix); - @Inject(method = "renderLevel", at = @At( value = "INVOKE", @@ -120,9 +116,6 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo private void gtceu$injectRenderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { - GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); - this.renderChunkLayer(GTRenderTypes.getBloom(), poseStack, - camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, projectionMatrix); BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, poseStack, getFrustum(), partialTick, camera.getEntity()); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java new file mode 100644 index 00000000000..da4715aff5c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java @@ -0,0 +1,34 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.model.GTMetadataSection; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.model.BakedQuad; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ModelBlockRenderer.class) +public class ModelBlockRendererMixin { + + @WrapOperation(method = "putQuadData", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") + ) + private void gtceu$swapEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + // Check if quad is full brightness OR we have bloom enabled for the quad + if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + original.call(GTShaders.BLOOM_BUFFER, poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } + original.call(instance, poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java new file mode 100644 index 00000000000..fd9210aa1f9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java @@ -0,0 +1,35 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.model.GTMetadataSection; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraftforge.client.model.lighting.QuadLighter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = QuadLighter.class, remap = false) +public class QuadLighterMixin { + + @WrapOperation(method = "process", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", + remap = true) + ) + private void gtceu$swapEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + // Check if quad is full brightness OR we have bloom enabled for the quad + if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + original.call(GTShaders.BLOOM_BUFFER, poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } + original.call(instance, poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java deleted file mode 100644 index 2e4575c9b72..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import net.minecraft.client.renderer.RenderType; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(value = DefaultMaterials.class, remap = false) -public class DefaultMaterialsMixin { - - @Inject(method = "forRenderLayer", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/RenderType;translucent()Lnet/minecraft/client/renderer/RenderType;", - remap = true), - cancellable = true) - private static void gtceu$allowBloomMaterial(RenderType layer, CallbackInfoReturnable cir) { - if (layer == BloomEffectUtil.getBloomLayer()) { - cir.setReturnValue(BloomEffectUtil.EMBEDDIUM_MATERIAL_BLOOM.get().get()); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java deleted file mode 100644 index 5685005d50e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(value = DefaultTerrainRenderPasses.class, remap = false) -public interface DefaultTerrainRenderPassesAccessor { - - @Mutable - @Accessor(value = "ALL") - static void setAll(TerrainRenderPass[] value) { - throw new AssertionError(); - } -} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index e8175fc5653..e416b85be76 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -22,11 +22,6 @@ public net.minecraft.world.entity.Entity m_20115_(IZ)V # setSharedFlag public net.minecraft.world.entity.vehicle.Boat f_38285_ # DATA_ID_TYPE -# for bloom -public-f net.minecraft.client.renderer.RenderType f_234324_ # CHUNK_BUFFER_LAYERS -public net.minecraft.client.renderer.LevelRenderer m_172993_(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V # renderChunkLayer -public com.mojang.blaze3d.shaders.Program$Type m_85571_()I # getGlType - # for AE2 to be able to load (idk why but it needs these?) public net.minecraft.world.level.block.Blocks m_50774_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # always public net.minecraft.world.level.block.Blocks m_50805_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # never diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh deleted file mode 100644 index efd23f929c0..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh +++ /dev/null @@ -1,26 +0,0 @@ -#version 150 - -#moj_import - -uniform sampler2D Sampler0; - -uniform vec4 ColorModulator; -uniform float FogStart; -uniform float FogEnd; -uniform vec4 FogColor; - -in float vertexDistance; -in vec4 vertexColor; -in vec2 texCoord0; -in vec4 normal; - -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_bloom.json b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json deleted file mode 100644 index 952d98dd2fa..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "gtceu:rendertype_bloom", - "fragment": "gtceu:rendertype_bloom", - "attributes": [ - "Position", - "Color", - "UV0", - "UV2", - "Normal" - ], - "samplers": [ - { "name": "Sampler0" } - ], - "uniforms": [ - { "name": "ModelViewMat", "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": "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": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, - { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh deleted file mode 100644 index 3ebea95789a..00000000000 --- a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh +++ /dev/null @@ -1,25 +0,0 @@ -#version 150 - -#moj_import - -in vec3 Position; -in vec2 UV0; -in vec4 Color; - -uniform mat4 ModelViewMat; -uniform mat4 ProjMat; -uniform vec3 ChunkOffset; -uniform int FogShape; - -out float vertexDistance; -out vec4 vertexColor; -out vec2 texCoord0; - -void main() { - vec3 pos = Position + ChunkOffset; - gl_Position = ProjMat * ModelViewMat * vec4(pos, 1.0); - - vertexDistance = fog_distance(ModelViewMat, pos, FogShape); - vertexColor = Color; - texCoord0 = UV0; -} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta index b1e5096ccb5..02157f9f43e 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_cupronickel_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta index a3d39d70b26..da9290e6421 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_hssg_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta index 5f77e5af023..3f9d88f772c 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_kanthal_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta index e5d9efbf204..cf4caf3b4da 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta index 89be208adcf..3e0849ec22a 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_naquadah_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta index d454af3ff67..c5efe785f2b 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_nichrome_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta index 11a9a3bcd34..a7f12703ae8 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_tungstensteel_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta index 2f5edd2ed74..d638cf36c9b 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_superconductor_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta index 0d93c95e458..087ca64b05a 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_trinium_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta index 1aa566dca58..7c33128e5d3 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_tritanium_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta index 11a9a3bcd34..a7f12703ae8 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_tungstensteel_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta index d63d26a280c..b51a44ee011 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/fusion/fusion_casing_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta index 2f5edd2ed74..d638cf36c9b 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta @@ -3,7 +3,7 @@ "connection": "gtceu:block/casings/coils/machine_coil_superconductor_bloom_ctm", "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta index e333118814e..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta index f2e939b3527..6e406d5d2d7 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta @@ -5,7 +5,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta index 89d89e9d079..8d624c1275a 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta @@ -2,7 +2,7 @@ "animation": { "frametime": 1 }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta index 986fc3c4b9b..2763840d580 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/black_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta index 6c7c62e8adb..783b141a400 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/blue_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta index 5716c714030..8981d39ab37 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/brown_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta index b1725e83fa5..3f93eaa1800 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/cyan_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta index c55ae8fc192..a629cbf0622 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/gray_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta index 61c740ca6c9..2abb9617ad2 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/green_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta index 3c37363340e..1fa92ce9e62 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/light_blue_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta index f198565e7c6..7cbb68ea9ca 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/light_gray_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta index 2eddeede772..776b6cbdc9d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/lime_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta index bbcbde7bc8b..ce269789abd 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/magenta_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta index 6bd561037cd..5940052a644 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/orange_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta index 8ca9c17de14..dadd9f4dd10 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/pink_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta index 8c82cc421b1..d4af3f5e7d2 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/purple_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta index 71f134efd0c..7f8d7341094 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/red_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta index 5b460863ca0..0f4400d7948 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/white_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta index 4e0110c9e7c..51e78ffa301 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "connection": "gtceu:block/lamps/yellow_ctm_emissive" }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_bottom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_bottom.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_bottom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_bottom.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_left.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_left.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_left.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_left.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_right.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_right.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_right.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_right.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_top.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_top.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_top.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_top.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_bottom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_bottom.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_bottom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_bottom.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_left.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_left.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_left.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_left.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_right.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_right.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_right.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_right.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_top.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_top.png.mcmeta index 53a9815890b..b5c2362fa2e 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_top.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_top.png.mcmeta @@ -2,7 +2,7 @@ "ldlib": { "emissive": true }, - "shimmer": { + "gtceu": { "bloom": true } -} \ No newline at end of file +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 4c37c6b92b3..cd76a8f7313 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -1,75 +1,75 @@ { - "required": true, - "minVersion": "0.8", - "refmap": "gtceu.refmap.json", - "package": "com.gregtechceu.gtceu.core.mixins", - "compatibilityLevel": "JAVA_17", - "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", - "client": [ - "BlockColorsMixin", - "BlockModelMixin", - "ClientLevelAccessor", - "CompassManagerMixin", - "GuiGraphicsAccessor", - "GuiGraphicsMixin", - "GuiHeartTypeMixin", - "LevelRendererMixin", - "ModelManagerMixin", - "MultiPlayerGameModeMixin", - "PostChainAccessor", - "RenderTypeAccessor", - "rei.FluidEntryRendererMixin" - ], - "mixins": [ - "AbstractRegistrateAccessor", - "BlockBehaviourAccessor", - "BlockMixin", - "BlockPropertiesAccessor", - "ChunkGeneratorMixin", - "ChunkMixin", - "CreeperMixin", - "EntityMixin", - "IFoliagePlacerTypeAccessor", - "IHolderReferenceAccessor", - "IngredientAccessor", - "IntersectionIngredientAccessor", - "InventoryMixin", - "ItemValueAccessor", - "ITrunkPlacerTypeAccessor", - "LevelMixin", - "LivingEntityMixin", - "LootDataManagerMixin", - "LootPoolAccessor", - "OreConfigurationMixin", - "OreVeinifierMixin", - "PartialNBTIngredientAccessor", - "PrimedTntAccessor", - "RecipeManagerAccessor", - "RecipeManagerInvoker", - "RecipeManagerMixin", - "RepairItemRecipeMixin", - "ServerChunkProviderMixin", - "ServerGamePacketListenerImplAccessor", - "ShapedRecipeAccessor", - "SidedRedstoneConnectivityMixin", - "StrictNBTIngredientAccessor", - "TagLoaderMixin", - "TagManagerMixin", - "TagValueAccessor", - "ae2.GenericStackInvAccessor", - "create.RotationPropagatorMixin", - "embeddium.BiomeColorCacheMixin", - "embeddium.DefaultMaterialsMixin", - "embeddium.DefaultTerrainRenderPassesAccessor", - "embeddium.VanillaColorAdapterMixin", - "emi.FluidEmiStackMixin", - "jei.FluidHelperMixin", - "rei.InputSlotCrafterMixin", - "rei.RecipeFinderMixin", - "top.ConfigMixin" - ], - "injectors": { - "defaultRequire": 1, - "maxShiftBy": 5 + "required": true, + "minVersion": "0.8", + "refmap": "gtceu.refmap.json", + "package": "com.gregtechceu.gtceu.core.mixins", + "compatibilityLevel": "JAVA_17", + "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", + "client": [ + "BlockColorsMixin", + "BlockModelMixin", + "ClientLevelAccessor", + "CompassManagerMixin", + "GuiGraphicsAccessor", + "GuiGraphicsMixin", + "GuiHeartTypeMixin", + "LevelRendererMixin", + "ModelBlockRendererMixin", + "ModelManagerMixin", + "MultiPlayerGameModeMixin", + "PostChainAccessor", + "RenderTypeAccessor", + "rei.FluidEntryRendererMixin" + ], + "mixins": [ + "AbstractRegistrateAccessor", + "BlockBehaviourAccessor", + "BlockMixin", + "BlockPropertiesAccessor", + "ChunkGeneratorMixin", + "ChunkMixin", + "CreeperMixin", + "EntityMixin", + "IFoliagePlacerTypeAccessor", + "IHolderReferenceAccessor", + "IngredientAccessor", + "IntersectionIngredientAccessor", + "InventoryMixin", + "ItemValueAccessor", + "ITrunkPlacerTypeAccessor", + "LevelMixin", + "LivingEntityMixin", + "LootDataManagerMixin", + "LootPoolAccessor", + "OreConfigurationMixin", + "OreVeinifierMixin", + "PartialNBTIngredientAccessor", + "PrimedTntAccessor", + "QuadLighterMixin", + "RecipeManagerAccessor", + "RecipeManagerInvoker", + "RecipeManagerMixin", + "RepairItemRecipeMixin", + "ServerChunkProviderMixin", + "ServerGamePacketListenerImplAccessor", + "ShapedRecipeAccessor", + "SidedRedstoneConnectivityMixin", + "StrictNBTIngredientAccessor", + "TagLoaderMixin", + "TagManagerMixin", + "TagValueAccessor", + "ae2.GenericStackInvAccessor", + "create.RotationPropagatorMixin", + "embeddium.BiomeColorCacheMixin", + "embeddium.VanillaColorAdapterMixin", + "emi.FluidEmiStackMixin", + "jei.FluidHelperMixin", + "rei.InputSlotCrafterMixin", + "rei.RecipeFinderMixin", + "top.ConfigMixin" + ], + "injectors": { + "defaultRequire": 1, + "maxShiftBy": 5 } } From 6f0804da8d9bbe39c8918327b8550d8a3c6af27c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:17:34 +0300 Subject: [PATCH 007/269] y u no work man,,, --- .../gtceu/client/util/BloomEffectUtil.java | 13 +++++++------ .../gtceu/core/mixins/LevelRendererMixin.java | 8 ++++++++ .../gtceu/core/mixins/ModelBlockRendererMixin.java | 8 ++++---- .../gtceu/core/mixins/QuadLighterMixin.java | 2 +- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index b48d1a964b5..7709e328c50 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -224,6 +224,7 @@ public static void renderBloom(double camX, double camY, double camZ, EffectRenderContext context = EffectRenderContext.getInstance() .update(entity, camX, camY, camZ, frustum, partialTicks); + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); GTRenderTypes.BLOOM_TARGET.setupRenderState(); if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { @@ -330,9 +331,7 @@ private static void postDraw() { private static void render(float partialTicks) { if (GTShaders.allowedShader()) { RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate( - GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, - GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { @@ -358,9 +357,11 @@ private static void render(float partialTicks) { } } - GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); - GTShaders.BLOOM_TARGET.bindWrite(false); - BufferUploader.draw(GTShaders.BLOOM_BUFFER.end()); + //GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + //GTShaders.BLOOM_TARGET.bindWrite(false); + RenderSystem.setShaderColor(1, 0, 1, 1); + BufferUploader.drawWithShader(GTShaders.BLOOM_BUFFER.end()); + RenderSystem.setShaderColor(1, 1, 1, 1); GTShaders.BLOOM_CHAIN.process(partialTicks); RenderSystem.disableBlend(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 9b786eb5a08..f47b934eac5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -109,6 +109,14 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo @Shadow public abstract Frustum getFrustum(); + @Inject(method = "renderLevel", at = @At("HEAD")) + private void gtceu$startBloomBuffer(PoseStack poseStack, float partialTick, long finishNanoTime, + boolean renderBlockOutline, Camera camera, + GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, + CallbackInfo ci) { + GTShaders.BLOOM_BUFFER.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); + } + @Inject(method = "renderLevel", at = @At( value = "INVOKE", diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java index da4715aff5c..288a6d787d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java @@ -17,10 +17,10 @@ public class ModelBlockRendererMixin { at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") ) - private void gtceu$swapEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { + private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { // Check if quad is full brightness OR we have bloom enabled for the quad if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { original.call(GTShaders.BLOOM_BUFFER, poseEntry, quad, diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java index fd9210aa1f9..54cceb67691 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java @@ -18,7 +18,7 @@ public class QuadLighterMixin { target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", remap = true) ) - private void gtceu$swapEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { From a0d3d0caecfe5109193021b57859b7d10bf0a243 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:58:52 +0300 Subject: [PATCH 008/269] need 2 find quads with bloom better or keep track of them somehow --- .../client/particle/GTOverheatParticle.java | 11 +- .../gtceu/client/particle/GTParticle.java | 7 +- .../client/particle/GTParticleManager.java | 5 +- .../gtceu/client/renderer/GTRenderTypes.java | 1 + .../gtceu/client/renderer/IRenderSetup.java | 6 +- .../machine/FusionReactorRenderer.java | 71 +++++++-- .../gtceu/client/shader/GTShaders.java | 12 +- .../gtceu/client/util/BloomEffectUtil.java | 43 ++++-- .../gtceu/client/util/IBloomEffect.java | 6 +- .../electric/FusionReactorMachine.java | 4 + .../gtceu/core/mixins/LevelRendererMixin.java | 6 +- .../core/mixins/ModelBlockRendererMixin.java | 2 +- .../gtceu/core/mixins/QuadLighterMixin.java | 2 +- src/main/resources/gtceu.mixins.json | 144 +++++++++--------- 14 files changed, 202 insertions(+), 118 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 9882547ff76..fbbac706910 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -13,6 +13,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.shimmer.client.shader.RenderUtils; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.phys.AABB; @@ -273,7 +274,7 @@ protected BloomType getBloomType() { return BloomType.fromValue(heatEffectBloom.useShader ? heatEffectBloom.bloomStyle : -1); } - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context) { float red = ((color >> 16) & 0xFF) / 255f; float green = ((color >> 8) & 0xFF) / 255f; @@ -282,7 +283,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild poseStack.pushPose(); poseStack.translate(posX - context.cameraX(), posY - context.cameraY(), posZ - context.cameraZ()); for (AABB cuboid : pipeBoxes.toAabbs()) { - RenderBufferHelper.renderCubeFace(poseStack, buffer, cuboid, red, green, blue, alpha, true); + RenderBufferHelper.renderCubeFace(poseStack, buffer.getBuffer(GTRenderTypes.getBloom()), cuboid, red, green, blue, alpha, true); } poseStack.popPose(); } @@ -291,16 +292,14 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild @Override @OnlyIn(Dist.CLIENT) - public void preDraw(@NotNull BufferBuilder buffer) { + public void preDraw(@NotNull MultiBufferSource buffer) { RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.enableBlend(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); } @Override @OnlyIn(Dist.CLIENT) - public void postDraw(@NotNull BufferBuilder buffer) { - Tesselator.getInstance().end(); + public void postDraw(@NotNull MultiBufferSource buffer) { RenderSystem.disableBlend(); } }; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index ece35c29e85..f9f3ee6acc1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.client.renderer.IRenderSetup; import com.gregtechceu.gtceu.client.util.EffectRenderContext; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -97,15 +98,15 @@ protected void onExpired() {} /** * Render the particle. If this particle has non-null {@link #getRenderSetup()} associated, this method will be - * called between a {@link IRenderSetup#preDraw(BufferBuilder)} call and a - * {@link IRenderSetup#postDraw(BufferBuilder)} call. + * called between a {@link IRenderSetup#preDraw(MultiBufferSource)} call and a + * {@link IRenderSetup#postDraw(MultiBufferSource)} call. * * @param poseStack * @param buffer buffer builder * @param context render context */ @OnlyIn(Dist.CLIENT) - public void renderParticle(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + public void renderParticle(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context) {} /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 16cd73ba9c5..f499282abca 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -8,6 +8,7 @@ import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -20,9 +21,7 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -153,7 +152,7 @@ private static void renderGlParticlesInLayer(@NotNull PoseStack poseStack, if (particles.isEmpty()) continue; boolean initialized = false; - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + MultiBufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); for (GTParticle particle : particles) { if (particle.shouldRender(context)) { try { 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 d2cbf065446..a3ff0785f3a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.client.renderer; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java index 96ca4083bbb..c2b04ee50c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java @@ -1,6 +1,8 @@ package com.gregtechceu.gtceu.client.renderer; import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; import org.jetbrains.annotations.NotNull; public interface IRenderSetup { @@ -10,12 +12,12 @@ public interface IRenderSetup { * * @param buffer Buffer builder */ - void preDraw(@NotNull BufferBuilder buffer); + void preDraw(@NotNull MultiBufferSource buffer); /** * Run any post render gl code here. * * @param buffer Buffer builder */ - void postDraw(@NotNull BufferBuilder buffer); + void postDraw(@NotNull MultiBufferSource buffer); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java index d9407ac8d69..1dcadd175c9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java @@ -1,25 +1,31 @@ package com.gregtechceu.gtceu.client.renderer.machine; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.IRenderSetup; +import com.gregtechceu.gtceu.client.shader.post.BloomEffect; +import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.util.EffectRenderContext; +import com.gregtechceu.gtceu.client.util.IBloomEffect; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; - +import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.lowdraglib.utils.ColorUtils; import com.lowdragmc.lowdraglib.utils.interpolate.Eases; -import com.lowdragmc.shimmer.client.shader.RenderUtils; - +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import lombok.RequiredArgsConstructor; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.AABB; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.vertex.PoseStack; +import org.jetbrains.annotations.NotNull; public class FusionReactorRenderer extends WorkableCasingMachineRenderer { @@ -32,14 +38,22 @@ public FusionReactorRenderer(ResourceLocation baseCasing, ResourceLocation worka public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, int combinedLight, int combinedOverlay) { if (blockEntity instanceof IMachineBlockEntity machineBlockEntity && - machineBlockEntity.getMetaMachine() instanceof FusionReactorMachine machine) { - renderLightRing(machine, partialTicks, stack, buffer); + machineBlockEntity.getMetaMachine() instanceof FusionReactorMachine machine && + !machine.isRegisteredBloomTicket()) { + machine.setRegisteredBloomTicket(true); + BloomEffectUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), + new FusionBloomEffect(machine), blockEntity); } } + private static BloomType getBloomType() { + ConfigHolder.ClientConfigs.ShaderOptions.FusionBloom fusionBloom = ConfigHolder.INSTANCE.client.shader.fusionBloom; + return BloomType.fromValue(fusionBloom.useShader ? fusionBloom.bloomStyle : -1); + } + @OnlyIn(Dist.CLIENT) private void renderLightRing(FusionReactorMachine machine, float partialTicks, PoseStack stack, - MultiBufferSource buffer) { + VertexConsumer buffer) { var color = machine.getColor(); if (color == -1) return; int ringColor = ColorUtils.blendColor(color, -1, Eases.EaseQuadIn.getInterpolation( @@ -53,7 +67,7 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P float r = ColorUtils.red(ringColor); float g = ColorUtils.green(ringColor); float b = ColorUtils.blue(ringColor); - RenderBufferHelper.renderRing(stack, buffer.getBuffer(GTRenderTypes.getLightRing()), + RenderBufferHelper.renderRing(stack, buffer, relativeBack.getStepX() * 7 + 0.5F, relativeBack.getStepY() * 7 + 0.5F, relativeBack.getStepZ() * 7 + 0.5F, @@ -78,4 +92,41 @@ public boolean isGlobalRenderer(BlockEntity blockEntity) { public int getViewDistance() { return 32; } + + @RequiredArgsConstructor + private final class FusionBloomEffect implements IBloomEffect { + + private final FusionReactorMachine machine; + + @Override + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context) { + FusionReactorRenderer.this.renderLightRing(machine, context.partialTicks(), poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); + } + + @Override + public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { + return machine.getColor() != null && context.frustum() + .isVisible(new AABB(machine.getPos()).inflate(FusionReactorRenderer.this.getViewDistance())); + } + } + + private static final class FusionBloomSetup implements IRenderSetup { + + private static final FusionBloomSetup INSTANCE = new FusionBloomSetup(); + + @Override + public void preDraw(@NotNull MultiBufferSource buffer) { + BloomEffect.strength = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.strength; + BloomEffect.baseBrightness = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.baseBrightness; + BloomEffect.highBrightnessThreshold = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.highBrightnessThreshold; + BloomEffect.lowBrightnessThreshold = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.lowBrightnessThreshold; + BloomEffect.step = 1; + + RenderSystem.setShaderColor(1, 1, 1, 1); + } + + @Override + public void postDraw(@NotNull MultiBufferSource buffer) { + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 497928db6bc..2fd0b3f5fe4 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.client.shader; +import com.google.common.collect.ImmutableMap; import com.google.gson.JsonSyntaxException; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; @@ -7,7 +8,9 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.PostChain; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -25,7 +28,14 @@ public class GTShaders { public static BloomType BLOOM_TYPE; public static RenderTarget BLOOM_TARGET; - public static BufferBuilder BLOOM_BUFFER = new BufferBuilder(GTRenderTypes.getBloom().bufferSize()); + public static MultiBufferSource.BufferSource BLOOM_BUFFER = MultiBufferSource.immediateWithBuffers(ImmutableMap.of( + GTRenderTypes.getLightRing(), new BufferBuilder(GTRenderTypes.getLightRing().bufferSize()), + GTRenderTypes.getBloom(), new BufferBuilder(GTRenderTypes.getBloom().bufferSize()) + ), new BufferBuilder(2097152)); + + public static VertexConsumer getBloomBuffer() { + return BLOOM_BUFFER.getBuffer(GTRenderTypes.getBloom()); + } public static void onRegisterShaders(RegisterShadersEvent event) { if (!allowedShader()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 7709e328c50..dd6e8f69f97 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -16,7 +16,9 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.PostPass; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -26,6 +28,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -69,7 +72,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup new IBloomEffect() { @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context) { render.renderBloomEffect(poseStack, buffer, context); } @@ -211,7 +214,7 @@ public static void init() {} public static final AtomicBoolean isDrawingBlockBloom = new AtomicBoolean(false); public static void renderBloom(double camX, double camY, double camZ, - PoseStack poseStack, + PoseStack poseStack, Matrix4f projectionMatrix, Frustum frustum, float partialTicks, @NotNull Entity entity) { @@ -224,7 +227,6 @@ public static void renderBloom(double camX, double camY, double camZ, EffectRenderContext context = EffectRenderContext.getInstance() .update(entity, camX, camY, camZ, frustum, partialTicks); - GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); GTRenderTypes.BLOOM_TARGET.setupRenderState(); if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { @@ -238,7 +240,7 @@ public static void renderBloom(double camX, double camY, double camZ, postDraw(); RenderSystem.depthMask(false); - render(partialTicks); + render(partialTicks, poseStack, projectionMatrix); return; } @@ -254,7 +256,6 @@ public static void renderBloom(double camX, double camY, double camZ, if (!BLOOM_RENDERS.isEmpty()) { for (var e : BLOOM_RENDERS.entrySet()) { List list = e.getValue(); - draw(poseStack, GTShaders.BLOOM_BUFFER, context, list); } Tesselator.getInstance().end(); @@ -262,7 +263,7 @@ public static void renderBloom(double camX, double camY, double camZ, RenderSystem.depthMask(false); isDrawingBlockBloom.set(true); - render(partialTicks); + render(partialTicks, poseStack, projectionMatrix); isDrawingBlockBloom.set(false); postDraw(); @@ -282,7 +283,7 @@ private static void preDraw() { } private static void draw(@NotNull PoseStack poseStack, - @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context, + @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context, @NotNull List tickets) { boolean initialized = false; @Nullable @@ -328,7 +329,7 @@ private static void postDraw() { private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void render(float partialTicks) { + private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix) { if (GTShaders.allowedShader()) { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); @@ -357,16 +358,30 @@ private static void render(float partialTicks) { } } - //GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); - //GTShaders.BLOOM_TARGET.bindWrite(false); - RenderSystem.setShaderColor(1, 0, 1, 1); - BufferUploader.drawWithShader(GTShaders.BLOOM_BUFFER.end()); - RenderSystem.setShaderColor(1, 1, 1, 1); + GTShaders.BLOOM_TARGET.setClearColor(1, 0, 0 ,1); + GTShaders.BLOOM_TARGET.bindWrite(false); + + ShaderInstance currentShader = RenderSystem.getShader(); + if (currentShader == null) { + GTShaders.BLOOM_CHAIN.process(partialTicks); + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + return; + } + + if (currentShader.MODEL_VIEW_MATRIX != null) { + currentShader.MODEL_VIEW_MATRIX.set(poseStack.last().pose().invert()); + } + if (currentShader.PROJECTION_MATRIX != null) { + currentShader.PROJECTION_MATRIX.set(projectionMatrix); + } + + GTShaders.BLOOM_BUFFER.endBatch(); + GTShaders.BLOOM_TARGET.blitToScreen(GTShaders.BLOOM_TARGET.width, GTShaders.BLOOM_TARGET.height); GTShaders.BLOOM_CHAIN.process(partialTicks); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java index 9fc75b8e4e3..93c2d468058 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java @@ -5,6 +5,8 @@ import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -24,12 +26,12 @@ public interface IBloomEffect { * @param context render context */ @OnlyIn(Dist.CLIENT) - void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context); + void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context); /** * @param context render context * @return if this effect should be rendered; returning {@code false} skips - * {@link #renderBloomEffect(PoseStack, BufferBuilder, EffectRenderContext)} call. + * {@link #renderBloomEffect(PoseStack, MultiBufferSource, EffectRenderContext)} call. */ @OnlyIn(Dist.CLIENT) default boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java index 6826b5d5a36..488e3ad36fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java @@ -27,6 +27,7 @@ import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import lombok.Setter; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.Block; @@ -69,6 +70,9 @@ public class FusionReactorMachine extends WorkableElectricMultiblockMachine impl @Nullable protected TickableSubscription preHeatSubs; + @Getter @Setter + protected boolean registeredBloomTicket; + public FusionReactorMachine(IMachineBlockEntity holder, int tier) { super(holder); this.tier = tier; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index f47b934eac5..011c51dca54 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.mojang.blaze3d.vertex.*; @@ -114,7 +113,8 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { - GTShaders.BLOOM_BUFFER.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + minecraft.getMainRenderTarget().bindWrite(false); } @Inject(method = "renderLevel", @@ -125,7 +125,7 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, - poseStack, getFrustum(), partialTick, camera.getEntity()); + poseStack, projectionMatrix, getFrustum(), partialTick, camera.getEntity()); } @Inject(method = "resize", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java index 288a6d787d3..bfc2ef8cca3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java @@ -23,7 +23,7 @@ public class ModelBlockRendererMixin { Operation original) { // Check if quad is full brightness OR we have bloom enabled for the quad if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(GTShaders.BLOOM_BUFFER, poseEntry, quad, + original.call(GTShaders.getBloomBuffer(), poseEntry, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java index 54cceb67691..b6a4b3652b3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java @@ -24,7 +24,7 @@ public class QuadLighterMixin { Operation original) { // Check if quad is full brightness OR we have bloom enabled for the quad if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(GTShaders.BLOOM_BUFFER, poseEntry, quad, + original.call(GTShaders.getBloomBuffer(), poseEntry, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index cd76a8f7313..24a2c389a30 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -1,75 +1,75 @@ { - "required": true, - "minVersion": "0.8", - "refmap": "gtceu.refmap.json", - "package": "com.gregtechceu.gtceu.core.mixins", - "compatibilityLevel": "JAVA_17", - "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", - "client": [ - "BlockColorsMixin", - "BlockModelMixin", - "ClientLevelAccessor", - "CompassManagerMixin", - "GuiGraphicsAccessor", - "GuiGraphicsMixin", - "GuiHeartTypeMixin", - "LevelRendererMixin", - "ModelBlockRendererMixin", - "ModelManagerMixin", - "MultiPlayerGameModeMixin", - "PostChainAccessor", - "RenderTypeAccessor", - "rei.FluidEntryRendererMixin" - ], - "mixins": [ - "AbstractRegistrateAccessor", - "BlockBehaviourAccessor", - "BlockMixin", - "BlockPropertiesAccessor", - "ChunkGeneratorMixin", - "ChunkMixin", - "CreeperMixin", - "EntityMixin", - "IFoliagePlacerTypeAccessor", - "IHolderReferenceAccessor", - "IngredientAccessor", - "IntersectionIngredientAccessor", - "InventoryMixin", - "ItemValueAccessor", - "ITrunkPlacerTypeAccessor", - "LevelMixin", - "LivingEntityMixin", - "LootDataManagerMixin", - "LootPoolAccessor", - "OreConfigurationMixin", - "OreVeinifierMixin", - "PartialNBTIngredientAccessor", - "PrimedTntAccessor", - "QuadLighterMixin", - "RecipeManagerAccessor", - "RecipeManagerInvoker", - "RecipeManagerMixin", - "RepairItemRecipeMixin", - "ServerChunkProviderMixin", - "ServerGamePacketListenerImplAccessor", - "ShapedRecipeAccessor", - "SidedRedstoneConnectivityMixin", - "StrictNBTIngredientAccessor", - "TagLoaderMixin", - "TagManagerMixin", - "TagValueAccessor", - "ae2.GenericStackInvAccessor", - "create.RotationPropagatorMixin", - "embeddium.BiomeColorCacheMixin", - "embeddium.VanillaColorAdapterMixin", - "emi.FluidEmiStackMixin", - "jei.FluidHelperMixin", - "rei.InputSlotCrafterMixin", - "rei.RecipeFinderMixin", - "top.ConfigMixin" - ], - "injectors": { - "defaultRequire": 1, - "maxShiftBy": 5 + "required": true, + "minVersion": "0.8", + "refmap": "gtceu.refmap.json", + "package": "com.gregtechceu.gtceu.core.mixins", + "compatibilityLevel": "JAVA_17", + "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", + "client": [ + "BlockColorsMixin", + "BlockModelMixin", + "ClientLevelAccessor", + "CompassManagerMixin", + "GuiGraphicsAccessor", + "GuiGraphicsMixin", + "GuiHeartTypeMixin", + "LevelRendererMixin", + "ModelBlockRendererMixin", + "ModelManagerMixin", + "MultiPlayerGameModeMixin", + "PostChainAccessor", + "RenderTypeAccessor", + "rei.FluidEntryRendererMixin" + ], + "mixins": [ + "AbstractRegistrateAccessor", + "BlockBehaviourAccessor", + "BlockMixin", + "BlockPropertiesAccessor", + "ChunkGeneratorMixin", + "ChunkMixin", + "CreeperMixin", + "EntityMixin", + "IFoliagePlacerTypeAccessor", + "IHolderReferenceAccessor", + "IngredientAccessor", + "IntersectionIngredientAccessor", + "InventoryMixin", + "ItemValueAccessor", + "ITrunkPlacerTypeAccessor", + "LevelMixin", + "LivingEntityMixin", + "LootDataManagerMixin", + "LootPoolAccessor", + "OreConfigurationMixin", + "OreVeinifierMixin", + "PartialNBTIngredientAccessor", + "PrimedTntAccessor", + "QuadLighterMixin", + "RecipeManagerAccessor", + "RecipeManagerInvoker", + "RecipeManagerMixin", + "RepairItemRecipeMixin", + "ServerChunkProviderMixin", + "ServerGamePacketListenerImplAccessor", + "ShapedRecipeAccessor", + "SidedRedstoneConnectivityMixin", + "StrictNBTIngredientAccessor", + "TagLoaderMixin", + "TagManagerMixin", + "TagValueAccessor", + "ae2.GenericStackInvAccessor", + "create.RotationPropagatorMixin", + "embeddium.BiomeColorCacheMixin", + "embeddium.VanillaColorAdapterMixin", + "emi.FluidEmiStackMixin", + "jei.FluidHelperMixin", + "rei.InputSlotCrafterMixin", + "rei.RecipeFinderMixin", + "top.ConfigMixin" + ], + "injectors": { + "defaultRequire": 1, + "maxShiftBy": 5 } } From 76d9275eca347e6064a293333d76b1e5efa90c73 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 7 Oct 2024 23:14:13 +0300 Subject: [PATCH 009/269] IT'S ALIVE (but without color...) --- .../client/particle/GTOverheatParticle.java | 11 +- .../gtceu/client/particle/GTParticle.java | 6 +- .../client/particle/GTParticleManager.java | 4 +- .../gtceu/client/renderer/GTRenderTypes.java | 4 +- .../gtceu/client/renderer/IRenderSetup.java | 4 +- .../machine/FusionReactorRenderer.java | 26 ++-- .../gtceu/client/shader/GTShaders.java | 15 +- .../gtceu/client/util/BloomEffectUtil.java | 61 ++++---- .../gtceu/client/util/IBloomEffect.java | 4 +- .../mixins/ForgeModelBlockRendererMixin.java | 36 +++++ .../gtceu/core/mixins/LevelRendererMixin.java | 26 ++++ .../core/mixins/ModelBlockRendererMixin.java | 70 +++++++-- .../gtceu/core/mixins/QuadLighterMixin.java | 35 ----- src/main/resources/gtceu.mixins.json | 144 +++++++++--------- 14 files changed, 261 insertions(+), 185 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index fbbac706910..4191c4ca99d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -27,6 +27,7 @@ import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.lwjgl.opengl.GL11; import java.util.List; @@ -274,7 +275,7 @@ protected BloomType getBloomType() { return BloomType.fromValue(heatEffectBloom.useShader ? heatEffectBloom.bloomStyle : -1); } - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { float red = ((color >> 16) & 0xFF) / 255f; float green = ((color >> 8) & 0xFF) / 255f; @@ -283,7 +284,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBuffer poseStack.pushPose(); poseStack.translate(posX - context.cameraX(), posY - context.cameraY(), posZ - context.cameraZ()); for (AABB cuboid : pipeBoxes.toAabbs()) { - RenderBufferHelper.renderCubeFace(poseStack, buffer.getBuffer(GTRenderTypes.getBloom()), cuboid, red, green, blue, alpha, true); + RenderBufferHelper.renderCubeFace(poseStack, buffer, cuboid, red, green, blue, alpha, true); } poseStack.popPose(); } @@ -292,14 +293,16 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBuffer @Override @OnlyIn(Dist.CLIENT) - public void preDraw(@NotNull MultiBufferSource buffer) { + public void preDraw(@NotNull BufferBuilder buffer) { RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.enableBlend(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); } @Override @OnlyIn(Dist.CLIENT) - public void postDraw(@NotNull MultiBufferSource buffer) { + public void postDraw(@NotNull BufferBuilder buffer) { + Tesselator.getInstance().end(); RenderSystem.disableBlend(); } }; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index f9f3ee6acc1..09279d23935 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -98,15 +98,15 @@ protected void onExpired() {} /** * Render the particle. If this particle has non-null {@link #getRenderSetup()} associated, this method will be - * called between a {@link IRenderSetup#preDraw(MultiBufferSource)} call and a - * {@link IRenderSetup#postDraw(MultiBufferSource)} call. + * called between a {@link IRenderSetup#preDraw(BufferBuilder)} call and a + * {@link IRenderSetup#postDraw(BufferBuilder)} call. * * @param poseStack * @param buffer buffer builder * @param context render context */ @OnlyIn(Dist.CLIENT) - public void renderParticle(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, + public void renderParticle(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) {} /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index f499282abca..5f03013638b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -4,6 +4,8 @@ import com.gregtechceu.gtceu.client.renderer.IRenderSetup; import com.gregtechceu.gtceu.client.util.EffectRenderContext; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.Tesselator; import net.minecraft.ChatFormatting; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -152,7 +154,7 @@ private static void renderGlParticlesInLayer(@NotNull PoseStack poseStack, if (particles.isEmpty()) continue; boolean initialized = false; - MultiBufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); for (GTParticle particle : particles) { if (particle.shouldRender(context)) { try { 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 a3ff0785f3a..2ee7d9593db 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -27,7 +27,7 @@ public class GTRenderTypes extends RenderType { }); private static final RenderType LIGHT_RING = RenderType.create("light_ring", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 256, false, false, + DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 131072, false, false, RenderType.CompositeState.builder() .setCullState(RenderStateShard.NO_CULL) .setOutputState(BLOOM_TARGET) @@ -37,7 +37,7 @@ public class GTRenderTypes extends RenderType { private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 131072, false, false, RenderType.CompositeState.builder() - .setLightmapState(RenderStateShard.NO_LIGHTMAP) + .setLightmapState(RenderStateShard.LIGHTMAP) .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) .setTextureState(RenderStateShard.BLOCK_SHEET) .setOutputState(BLOOM_TARGET) diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java index c2b04ee50c6..e2ce64b5e36 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java @@ -12,12 +12,12 @@ public interface IRenderSetup { * * @param buffer Buffer builder */ - void preDraw(@NotNull MultiBufferSource buffer); + void preDraw(@NotNull BufferBuilder buffer); /** * Run any post render gl code here. * * @param buffer Buffer builder */ - void postDraw(@NotNull MultiBufferSource buffer); + void postDraw(@NotNull BufferBuilder buffer); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java index 1dcadd175c9..82cd7e775cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java @@ -15,10 +15,10 @@ import com.lowdragmc.lowdraglib.utils.ColorUtils; import com.lowdragmc.lowdraglib.utils.interpolate.Eases; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.*; import lombok.RequiredArgsConstructor; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.entity.BlockEntity; @@ -53,7 +53,7 @@ private static BloomType getBloomType() { @OnlyIn(Dist.CLIENT) private void renderLightRing(FusionReactorMachine machine, float partialTicks, PoseStack stack, - VertexConsumer buffer) { + VertexConsumer buffer, @NotNull EffectRenderContext context) { var color = machine.getColor(); if (color == -1) return; int ringColor = ColorUtils.blendColor(color, -1, Eases.EaseQuadIn.getInterpolation( @@ -61,6 +61,7 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P var front = machine.getFrontFacing(); var upwards = machine.getUpwardsFacing(); var flipped = machine.isFlipped(); + BlockPos pos = machine.getPos(); Direction relativeBack = RelativeDirection.BACK.getRelativeFacing(front, upwards, flipped); Direction.Axis axis = RelativeDirection.UP.getRelativeFacing(front, upwards, flipped).getAxis(); float a = ColorUtils.alpha(ringColor); @@ -68,9 +69,9 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P float g = ColorUtils.green(ringColor); float b = ColorUtils.blue(ringColor); RenderBufferHelper.renderRing(stack, buffer, - relativeBack.getStepX() * 7 + 0.5F, - relativeBack.getStepY() * 7 + 0.5F, - relativeBack.getStepZ() * 7 + 0.5F, + pos.getX() /*- (float) context.cameraX()*/ + relativeBack.getStepX() * 7 + 0.5F, + pos.getY() /*- (float) context.cameraY()*/ + relativeBack.getStepY() * 7 + 0.5F, + pos.getZ() /*- (float) context.cameraZ()*/ + relativeBack.getStepZ() * 7 + 0.5F, 6, 0.2F, 10, 20, r, g, b, a, axis); } @@ -98,9 +99,13 @@ private final class FusionBloomEffect implements IBloomEffect { private final FusionReactorMachine machine; + private static final BufferBuilder lightRingBuffer = new BufferBuilder(GTRenderTypes.getLightRing().bufferSize()); + @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context) { - FusionReactorRenderer.this.renderLightRing(machine, context.partialTicks(), poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { + lightRingBuffer.begin(GTRenderTypes.getLightRing().mode(), GTRenderTypes.getLightRing().format()); + FusionReactorRenderer.this.renderLightRing(machine, context.partialTicks(), poseStack, lightRingBuffer, context); + BufferUploader.drawWithShader(lightRingBuffer.end()); } @Override @@ -115,7 +120,7 @@ private static final class FusionBloomSetup implements IRenderSetup { private static final FusionBloomSetup INSTANCE = new FusionBloomSetup(); @Override - public void preDraw(@NotNull MultiBufferSource buffer) { + public void preDraw(@NotNull BufferBuilder buffer) { BloomEffect.strength = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.strength; BloomEffect.baseBrightness = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.baseBrightness; BloomEffect.highBrightnessThreshold = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.highBrightnessThreshold; @@ -126,7 +131,8 @@ public void preDraw(@NotNull MultiBufferSource buffer) { } @Override - public void postDraw(@NotNull MultiBufferSource buffer) { + public void postDraw(@NotNull BufferBuilder buffer) { + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 2fd0b3f5fe4..2fb102d04b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.client.shader; -import com.google.common.collect.ImmutableMap; import com.google.gson.JsonSyntaxException; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; @@ -8,9 +7,8 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexBuffer; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.PostChain; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -28,14 +26,9 @@ public class GTShaders { public static BloomType BLOOM_TYPE; public static RenderTarget BLOOM_TARGET; - public static MultiBufferSource.BufferSource BLOOM_BUFFER = MultiBufferSource.immediateWithBuffers(ImmutableMap.of( - GTRenderTypes.getLightRing(), new BufferBuilder(GTRenderTypes.getLightRing().bufferSize()), - GTRenderTypes.getBloom(), new BufferBuilder(GTRenderTypes.getBloom().bufferSize()) - ), new BufferBuilder(2097152)); - - public static VertexConsumer getBloomBuffer() { - return BLOOM_BUFFER.getBuffer(GTRenderTypes.getBloom()); - } + public static VertexBuffer BLOOM_BUFFER = new VertexBuffer(VertexBuffer.Usage.STATIC); + public static BufferBuilder BLOOM_BUFFER_BUILDER = new BufferBuilder(GTRenderTypes.getBloom().bufferSize()); + public static BufferBuilder.RenderedBuffer RENDERED_BLOOM_BUFFER = null; public static void onRegisterShaders(RegisterShadersEvent event) { if (!allowedShader()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index dd6e8f69f97..7d8066abc0c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -16,7 +16,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.PostPass; import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.culling.Frustum; @@ -72,7 +72,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup new IBloomEffect() { @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context) { + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { render.renderBloomEffect(poseStack, buffer, context); } @@ -224,6 +224,9 @@ public static void renderBloom(double camX, double camY, double camZ, try { preDraw(); + //GTShaders.BLOOM_TARGET.setClearColor(1, 0, 0 ,1); + GTShaders.BLOOM_TARGET.bindWrite(false); + EffectRenderContext context = EffectRenderContext.getInstance() .update(entity, camX, camY, camZ, frustum, partialTicks); @@ -234,13 +237,14 @@ public static void renderBloom(double camX, double camY, double camZ, if (!BLOOM_RENDERS.isEmpty()) { for (List list : BLOOM_RENDERS.values()) { - draw(poseStack, GTShaders.BLOOM_BUFFER, context, list); + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + draw(poseStack, buffer, context, list); } } postDraw(); RenderSystem.depthMask(false); - render(partialTicks, poseStack, projectionMatrix); + render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); return; } @@ -256,14 +260,14 @@ public static void renderBloom(double camX, double camY, double camZ, if (!BLOOM_RENDERS.isEmpty()) { for (var e : BLOOM_RENDERS.entrySet()) { List list = e.getValue(); - draw(poseStack, GTShaders.BLOOM_BUFFER, context, list); + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + draw(poseStack, buffer, context, list); } - Tesselator.getInstance().end(); } RenderSystem.depthMask(false); isDrawingBlockBloom.set(true); - render(partialTicks, poseStack, projectionMatrix); + render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); isDrawingBlockBloom.set(false); postDraw(); @@ -283,7 +287,7 @@ private static void preDraw() { } private static void draw(@NotNull PoseStack poseStack, - @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context, + @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context, @NotNull List tickets) { boolean initialized = false; @Nullable @@ -320,6 +324,14 @@ private static void postDraw() { } } + public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, VertexBuffer buffer) { + if (!buffer.isInvalid()) { + buffer.bind(); + buffer.upload(builder); + VertexBuffer.unbind(); + } + } + private static final String UNREAL_COMPOSITE_SHADER_NAME = "gtceu:unreal_composite"; private static final String UNITY_COMPOSITE_SHADER_NAME = "gtceu:unity_composite"; private static final String SEPERABLE_BLUR_SHADER_NAME = "gtceu:seperable_blur"; @@ -329,10 +341,11 @@ private static void postDraw() { private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix) { + private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, + double camX, double camY, double camZ) { if (GTShaders.allowedShader()) { RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + //RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { @@ -358,30 +371,20 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro } } - GTShaders.BLOOM_TARGET.setClearColor(1, 0, 0 ,1); - GTShaders.BLOOM_TARGET.bindWrite(false); - - ShaderInstance currentShader = RenderSystem.getShader(); - if (currentShader == null) { - GTShaders.BLOOM_CHAIN.process(partialTicks); - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - return; - } - - if (currentShader.MODEL_VIEW_MATRIX != null) { - currentShader.MODEL_VIEW_MATRIX.set(poseStack.last().pose().invert()); - } - if (currentShader.PROJECTION_MATRIX != null) { - currentShader.PROJECTION_MATRIX.set(projectionMatrix); + if (GTShaders.RENDERED_BLOOM_BUFFER != null && !GTShaders.BLOOM_BUFFER.isInvalid()) { + GTShaders.BLOOM_BUFFER.bind(); + poseStack.pushPose(); + poseStack.translate(-camX, -camY, -camZ); + GTShaders.BLOOM_BUFFER.drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); + poseStack.popPose(); } - - GTShaders.BLOOM_BUFFER.endBatch(); - GTShaders.BLOOM_TARGET.blitToScreen(GTShaders.BLOOM_TARGET.width, GTShaders.BLOOM_TARGET.height); + GTShaders.BLOOM_TARGET.blitToScreen(GTShaders.BLOOM_TARGET.width, GTShaders.BLOOM_TARGET.height, false); GTShaders.BLOOM_CHAIN.process(partialTicks); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); + VertexBuffer.unbind(); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java index 93c2d468058..3a3a021754d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java @@ -26,12 +26,12 @@ public interface IBloomEffect { * @param context render context */ @OnlyIn(Dist.CLIENT) - void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, @NotNull EffectRenderContext context); + void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context); /** * @param context render context * @return if this effect should be rendered; returning {@code false} skips - * {@link #renderBloomEffect(PoseStack, MultiBufferSource, EffectRenderContext)} call. + * {@link #renderBloomEffect(PoseStack, BufferBuilder, EffectRenderContext)} call. */ @OnlyIn(Dist.CLIENT) default boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java new file mode 100644 index 00000000000..afa3258d509 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java @@ -0,0 +1,36 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.model.GTMetadataSection; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.lighting.ForgeModelBlockRenderer; +import net.minecraftforge.client.model.lighting.QuadLighter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = ForgeModelBlockRenderer.class, remap = false) +public class ForgeModelBlockRendererMixin { + + @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;process(Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;I)V")) + private static void gtceu$renderToEmissiveBuffer(QuadLighter instance, + VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, int overlay, + Operation original, + VertexConsumer _consumer, QuadLighter lighter, BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, PoseStack poseStack) { + if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + poseStack.scale(2f, 2f, 2f); + original.call(instance, GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, overlay); + poseStack.popPose(); + } + original.call(instance, consumer, pose, quad, overlay); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 011c51dca54..1cf97681e24 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -3,13 +3,16 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; @@ -29,6 +32,7 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -54,6 +58,9 @@ public abstract class LevelRendererMixin { @Shadow private @Nullable ClientLevel level; + @Unique + private boolean gtceu$needBloomRecompile; + @Inject( method = { "renderLevel" }, at = { @At("HEAD") }) @@ -115,6 +122,9 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo CallbackInfo ci) { GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); minecraft.getMainRenderTarget().bindWrite(false); + if (!GTShaders.BLOOM_BUFFER_BUILDER.building()) { + GTShaders.BLOOM_BUFFER_BUILDER.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); + } } @Inject(method = "renderLevel", @@ -124,10 +134,26 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo private void gtceu$injectRenderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { + if (gtceu$needBloomRecompile) { + gtceu$needBloomRecompile = false; + BufferBuilder.RenderedBuffer buffer = GTShaders.BLOOM_BUFFER_BUILDER.endOrDiscardIfEmpty(); + if (buffer != null) { + GTShaders.RENDERED_BLOOM_BUFFER = buffer; + BloomEffectUtil.uploadBloomBuffer(buffer, GTShaders.BLOOM_BUFFER); + } + } BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, poseStack, projectionMatrix, getFrustum(), partialTick, camera.getEntity()); } + @Inject(method = "compileChunks", at = @At("TAIL")) + private void gtceu$compileBloomData(Camera camera, CallbackInfo ci, + @Local List list) { + if (!list.isEmpty()) { + gtceu$needBloomRecompile = true; + } + } + @Inject(method = "resize", at = @At("TAIL")) private void gtceu$resize(int width, int height, CallbackInfo ci) { if (GTShaders.BLOOM_CHAIN != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java index bfc2ef8cca3..da0cd6cc92e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java @@ -7,28 +7,70 @@ import com.mojang.blaze3d.vertex.*; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(ModelBlockRenderer.class) public class ModelBlockRendererMixin { - @WrapOperation(method = "putQuadData", + @WrapOperation(method = "renderModelFaceAO", at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") - ) - private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - // Check if quad is full brightness OR we have bloom enabled for the quad + target = "Lnet/minecraft/client/renderer/block/ModelBlockRenderer;putQuadData(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;FFFFIIIII)V")) + private void gtceu$renderToEmissiveBuffer(ModelBlockRenderer instance, + BlockAndTintGetter level, BlockState state, BlockPos pos, + VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float brightness0, float brightness1, float brightness2, float brightness3, + int lightmap0, int lightmap1, int lightmap2, int lightmap3, + int packedOverlay, + Operation original, + BlockAndTintGetter _level, BlockState _state, BlockPos _pos, PoseStack poseStack) { if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(GTShaders.getBloomBuffer(), poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + poseStack.scale(2f, 2f, 2f); + original.call(instance, level, state, pos, + GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, + brightness0, brightness1, brightness2, brightness3, + lightmap0, lightmap1, lightmap2, lightmap3, + packedOverlay); + poseStack.popPose(); } - original.call(instance, poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); + original.call(instance, level, state, pos, + consumer, pose, quad, + brightness0, brightness1, brightness2, brightness3, + lightmap0, lightmap1, lightmap2, lightmap3, + packedOverlay); + } + + @WrapOperation(method = "renderModelFaceFlat", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/block/ModelBlockRenderer;putQuadData(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;FFFFIIIII)V")) + private void gtceu$renderToEmissiveBuffer(ModelBlockRenderer instance, + BlockAndTintGetter level, BlockState state, BlockPos pos, + VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float brightness0, float brightness1, float brightness2, float brightness3, + int lightmap0, int lightmap1, int lightmap2, int lightmap3, + int packedOverlay, + Operation original, + BlockAndTintGetter _level, BlockState _state, BlockPos _pos, int packedLight, int _packedOverlay, boolean repackLight, PoseStack poseStack) { + if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + poseStack.scale(2f, 2f, 2f); + original.call(instance, level, state, pos, + GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, + brightness0, brightness1, brightness2, brightness3, + lightmap0, lightmap1, lightmap2, lightmap3, + packedOverlay); + poseStack.popPose(); + } + original.call(instance, level, state, pos, + consumer, pose, quad, + brightness0, brightness1, brightness2, brightness3, + lightmap0, lightmap1, lightmap2, lightmap3, + packedOverlay); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java deleted file mode 100644 index b6a4b3652b3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import com.gregtechceu.gtceu.client.model.GTMetadataSection; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraftforge.client.model.lighting.QuadLighter; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(value = QuadLighter.class, remap = false) -public class QuadLighterMixin { - - @WrapOperation(method = "process", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", - remap = true) - ) - private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - // Check if quad is full brightness OR we have bloom enabled for the quad - if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(GTShaders.getBloomBuffer(), poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); - } - original.call(instance, poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); - } -} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 24a2c389a30..f2ebfe925f8 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -1,75 +1,75 @@ { - "required": true, - "minVersion": "0.8", - "refmap": "gtceu.refmap.json", - "package": "com.gregtechceu.gtceu.core.mixins", - "compatibilityLevel": "JAVA_17", - "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", - "client": [ - "BlockColorsMixin", - "BlockModelMixin", - "ClientLevelAccessor", - "CompassManagerMixin", - "GuiGraphicsAccessor", - "GuiGraphicsMixin", - "GuiHeartTypeMixin", - "LevelRendererMixin", - "ModelBlockRendererMixin", - "ModelManagerMixin", - "MultiPlayerGameModeMixin", - "PostChainAccessor", - "RenderTypeAccessor", - "rei.FluidEntryRendererMixin" - ], - "mixins": [ - "AbstractRegistrateAccessor", - "BlockBehaviourAccessor", - "BlockMixin", - "BlockPropertiesAccessor", - "ChunkGeneratorMixin", - "ChunkMixin", - "CreeperMixin", - "EntityMixin", - "IFoliagePlacerTypeAccessor", - "IHolderReferenceAccessor", - "IngredientAccessor", - "IntersectionIngredientAccessor", - "InventoryMixin", - "ItemValueAccessor", - "ITrunkPlacerTypeAccessor", - "LevelMixin", - "LivingEntityMixin", - "LootDataManagerMixin", - "LootPoolAccessor", - "OreConfigurationMixin", - "OreVeinifierMixin", - "PartialNBTIngredientAccessor", - "PrimedTntAccessor", - "QuadLighterMixin", - "RecipeManagerAccessor", - "RecipeManagerInvoker", - "RecipeManagerMixin", - "RepairItemRecipeMixin", - "ServerChunkProviderMixin", - "ServerGamePacketListenerImplAccessor", - "ShapedRecipeAccessor", - "SidedRedstoneConnectivityMixin", - "StrictNBTIngredientAccessor", - "TagLoaderMixin", - "TagManagerMixin", - "TagValueAccessor", - "ae2.GenericStackInvAccessor", - "create.RotationPropagatorMixin", - "embeddium.BiomeColorCacheMixin", - "embeddium.VanillaColorAdapterMixin", - "emi.FluidEmiStackMixin", - "jei.FluidHelperMixin", - "rei.InputSlotCrafterMixin", - "rei.RecipeFinderMixin", - "top.ConfigMixin" - ], - "injectors": { - "defaultRequire": 1, - "maxShiftBy": 5 + "required": true, + "minVersion": "0.8", + "refmap": "gtceu.refmap.json", + "package": "com.gregtechceu.gtceu.core.mixins", + "compatibilityLevel": "JAVA_17", + "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", + "client": [ + "BlockColorsMixin", + "BlockModelMixin", + "ClientLevelAccessor", + "CompassManagerMixin", + "ForgeModelBlockRendererMixin", + "GuiGraphicsAccessor", + "GuiGraphicsMixin", + "GuiHeartTypeMixin", + "LevelRendererMixin", + "ModelBlockRendererMixin", + "ModelManagerMixin", + "MultiPlayerGameModeMixin", + "PostChainAccessor", + "RenderTypeAccessor", + "rei.FluidEntryRendererMixin" + ], + "mixins": [ + "AbstractRegistrateAccessor", + "BlockBehaviourAccessor", + "BlockMixin", + "BlockPropertiesAccessor", + "ChunkGeneratorMixin", + "ChunkMixin", + "CreeperMixin", + "EntityMixin", + "IFoliagePlacerTypeAccessor", + "IHolderReferenceAccessor", + "IngredientAccessor", + "IntersectionIngredientAccessor", + "InventoryMixin", + "ItemValueAccessor", + "ITrunkPlacerTypeAccessor", + "LevelMixin", + "LivingEntityMixin", + "LootDataManagerMixin", + "LootPoolAccessor", + "OreConfigurationMixin", + "OreVeinifierMixin", + "PartialNBTIngredientAccessor", + "PrimedTntAccessor", + "RecipeManagerAccessor", + "RecipeManagerInvoker", + "RecipeManagerMixin", + "RepairItemRecipeMixin", + "ServerChunkProviderMixin", + "ServerGamePacketListenerImplAccessor", + "ShapedRecipeAccessor", + "SidedRedstoneConnectivityMixin", + "StrictNBTIngredientAccessor", + "TagLoaderMixin", + "TagManagerMixin", + "TagValueAccessor", + "ae2.GenericStackInvAccessor", + "create.RotationPropagatorMixin", + "embeddium.BiomeColorCacheMixin", + "embeddium.VanillaColorAdapterMixin", + "emi.FluidEmiStackMixin", + "jei.FluidHelperMixin", + "rei.InputSlotCrafterMixin", + "rei.RecipeFinderMixin", + "top.ConfigMixin" + ], + "injectors": { + "defaultRequire": 1, + "maxShiftBy": 5 } } From 25ea527bec327d3e6401a1b60fb4844c5bab715c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:03:01 +0300 Subject: [PATCH 010/269] IT WORKS now to figure out some quirks like translucency sorting being broken --- .../gtceu/client/renderer/GTRenderTypes.java | 7 ++++--- .../gtceu/client/util/BloomEffectUtil.java | 8 +++++--- .../core/mixins/ForgeModelBlockRendererMixin.java | 4 ++-- .../gtceu/core/mixins/LevelRendererMixin.java | 6 +++++- .../gtceu/core/mixins/ModelBlockRendererMixin.java | 8 ++++---- .../gtceu/core/mixins/RenderTypeAccessor.java | 12 ------------ src/main/resources/gtceu.mixins.json | 1 - 7 files changed, 20 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java 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 2ee7d9593db..d7b247e57d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -35,11 +35,12 @@ public class GTRenderTypes extends RenderType { .createCompositeState(false)); private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, - 131072, false, false, + 2097152, false, false, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) - .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) - .setTextureState(RenderStateShard.BLOCK_SHEET) + .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_SHADER) + .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) + .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) .setOutputState(BLOOM_TARGET) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 7d8066abc0c..66f0ad1e986 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -21,6 +21,7 @@ import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; +import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; @@ -29,6 +30,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; +import org.joml.Quaternionf; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -230,7 +232,7 @@ public static void renderBloom(double camX, double camY, double camZ, EffectRenderContext context = EffectRenderContext.getInstance() .update(entity, camX, camY, camZ, frustum, partialTicks); - GTRenderTypes.BLOOM_TARGET.setupRenderState(); + GTRenderTypes.getBloom().setupRenderState(); if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { RenderSystem.depthMask(true); @@ -271,7 +273,7 @@ public static void renderBloom(double camX, double camY, double camZ, isDrawingBlockBloom.set(false); postDraw(); - GTRenderTypes.BLOOM_TARGET.clearRenderState(); + GTRenderTypes.getBloom().clearRenderState(); } finally { BLOOM_RENDER_LOCK.unlock(); } @@ -345,7 +347,7 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro double camX, double camY, double camZ) { if (GTShaders.allowedShader()) { RenderSystem.enableBlend(); - //RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java index afa3258d509..92b231228d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java @@ -26,8 +26,8 @@ public class ForgeModelBlockRendererMixin { VertexConsumer _consumer, QuadLighter lighter, BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, PoseStack poseStack) { if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - poseStack.scale(2f, 2f, 2f); + poseStack.translate(pos.getX() - (pos.getX() & 15), pos.getY() - (pos.getY() & 15), pos.getZ() - (pos.getZ() & 15)); + //poseStack.scale(2f, 2f, 2f); original.call(instance, GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, overlay); poseStack.popPose(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 1cf97681e24..ad3c0ed5763 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -60,6 +60,8 @@ public abstract class LevelRendererMixin { @Unique private boolean gtceu$needBloomRecompile; + @Unique + private boolean gtceu$hasBeenRecompiledThisFrame; @Inject( method = { "renderLevel" }, @@ -134,7 +136,8 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo private void gtceu$injectRenderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { - if (gtceu$needBloomRecompile) { + if (gtceu$needBloomRecompile && !gtceu$hasBeenRecompiledThisFrame) { + gtceu$hasBeenRecompiledThisFrame = true; gtceu$needBloomRecompile = false; BufferBuilder.RenderedBuffer buffer = GTShaders.BLOOM_BUFFER_BUILDER.endOrDiscardIfEmpty(); if (buffer != null) { @@ -144,6 +147,7 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo } BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, poseStack, projectionMatrix, getFrustum(), partialTick, camera.getEntity()); + gtceu$hasBeenRecompiledThisFrame = false; } @Inject(method = "compileChunks", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java index da0cd6cc92e..2e3d4bc894a 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java @@ -29,8 +29,8 @@ public class ModelBlockRendererMixin { BlockAndTintGetter _level, BlockState _state, BlockPos _pos, PoseStack poseStack) { if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - poseStack.scale(2f, 2f, 2f); + poseStack.translate(pos.getX() - (pos.getX() & 15), pos.getY() - (pos.getY() & 15), pos.getZ() - (pos.getZ() & 15)); + //poseStack.scale(2f, 2f, 2f); original.call(instance, level, state, pos, GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, brightness0, brightness1, brightness2, brightness3, @@ -58,8 +58,8 @@ public class ModelBlockRendererMixin { BlockAndTintGetter _level, BlockState _state, BlockPos _pos, int packedLight, int _packedOverlay, boolean repackLight, PoseStack poseStack) { if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - poseStack.scale(2f, 2f, 2f); + poseStack.translate(pos.getX() - (pos.getX() & 15), pos.getY() - (pos.getY() & 15), pos.getZ() - (pos.getZ() & 15)); + //poseStack.scale(2f, 2f, 2f); original.call(instance, level, state, pos, GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, brightness0, brightness1, brightness2, brightness3, diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java deleted file mode 100644 index 4f2d322586d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderTypeAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import net.minecraft.client.renderer.RenderType; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(RenderType.class) -public interface RenderTypeAccessor { - - @Accessor(remap = false) - void setChunkLayerId(int id); -} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index f2ebfe925f8..4dde7612110 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -19,7 +19,6 @@ "ModelManagerMixin", "MultiPlayerGameModeMixin", "PostChainAccessor", - "RenderTypeAccessor", "rei.FluidEntryRendererMixin" ], "mixins": [ From 86dd3b093b98283995bf30fe53d64e689f924b74 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:19:28 +0300 Subject: [PATCH 011/269] fix translucency sorting by NOT drawing the thing to screen an extra time --- .../gtceu/client/util/BloomEffectUtil.java | 1 - .../gtceu/core/mixins/LevelRendererMixin.java | 21 +++++-------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 66f0ad1e986..ccc1125ff46 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -380,7 +380,6 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro GTShaders.BLOOM_BUFFER.drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); poseStack.popPose(); } - GTShaders.BLOOM_TARGET.blitToScreen(GTShaders.BLOOM_TARGET.width, GTShaders.BLOOM_TARGET.height, false); GTShaders.BLOOM_CHAIN.process(partialTicks); RenderSystem.disableBlend(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index ad3c0ed5763..55210217622 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -58,11 +58,6 @@ public abstract class LevelRendererMixin { @Shadow private @Nullable ClientLevel level; - @Unique - private boolean gtceu$needBloomRecompile; - @Unique - private boolean gtceu$hasBeenRecompiledThisFrame; - @Inject( method = { "renderLevel" }, at = { @At("HEAD") }) @@ -136,25 +131,19 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo private void gtceu$injectRenderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { - if (gtceu$needBloomRecompile && !gtceu$hasBeenRecompiledThisFrame) { - gtceu$hasBeenRecompiledThisFrame = true; - gtceu$needBloomRecompile = false; - BufferBuilder.RenderedBuffer buffer = GTShaders.BLOOM_BUFFER_BUILDER.endOrDiscardIfEmpty(); - if (buffer != null) { - GTShaders.RENDERED_BLOOM_BUFFER = buffer; - BloomEffectUtil.uploadBloomBuffer(buffer, GTShaders.BLOOM_BUFFER); - } - } BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, poseStack, projectionMatrix, getFrustum(), partialTick, camera.getEntity()); - gtceu$hasBeenRecompiledThisFrame = false; } @Inject(method = "compileChunks", at = @At("TAIL")) private void gtceu$compileBloomData(Camera camera, CallbackInfo ci, @Local List list) { if (!list.isEmpty()) { - gtceu$needBloomRecompile = true; + BufferBuilder.RenderedBuffer buffer = GTShaders.BLOOM_BUFFER_BUILDER.endOrDiscardIfEmpty(); + if (buffer != null) { + GTShaders.RENDERED_BLOOM_BUFFER = buffer; + BloomEffectUtil.uploadBloomBuffer(buffer, GTShaders.BLOOM_BUFFER); + } } } From 9fe11e89815fc2e18b4c6095025a67e8f39a5aad Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:15:03 +0300 Subject: [PATCH 012/269] now blocks only realise they need to shine when a block updates in the chunk... --- .../gtceu/api/recipe/GTRecipeType.java | 4 +- .../gtceu/client/shader/GTShaders.java | 11 ++- .../gtceu/client/util/BloomEffectUtil.java | 83 +++++++++++++++---- .../gtceu/common/data/GTPlacerTypes.java | 2 +- .../mixins/ForgeModelBlockRendererMixin.java | 36 -------- .../gtceu/core/mixins/LevelRendererMixin.java | 21 ++--- .../core/mixins/ModelBlockRendererMixin.java | 73 ++++------------ .../gtceu/core/mixins/QuadLighterMixin.java | 38 +++++++++ .../gtceu/core/mixins/RebuildTaskMixin.java | 33 ++++++++ .../core/mixins/RecipeManagerAccessor.java | 5 ++ .../core/mixins/RecipeManagerInvoker.java | 19 ----- .../gtceu/core/mixins/RenderChunkMixin.java | 23 +++++ .../core/mixins/VertexBufferAccessor.java | 13 +++ src/main/resources/gtceu.mixins.json | 6 +- 14 files changed, 218 insertions(+), 149 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerInvoker.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/VertexBufferAccessor.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java index d986c87c852..7cff33734bd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeType.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.recipe.lookup.GTRecipeLookup; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; import com.gregtechceu.gtceu.api.sound.SoundEntry; -import com.gregtechceu.gtceu.core.mixins.RecipeManagerInvoker; +import com.gregtechceu.gtceu.core.mixins.RecipeManagerAccessor; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -201,7 +201,7 @@ public String toString() { @Nullable public GTRecipe getRecipe(RecipeManager recipeManager, ResourceLocation id) { - var recipes = ((RecipeManagerInvoker) recipeManager).getRecipeFromType(this); + var recipes = ((RecipeManagerAccessor) recipeManager).getRecipeFromType(this); if (recipes.get(id) instanceof GTRecipe recipe) { return recipe; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 2fb102d04b0..bb014700f4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -2,7 +2,6 @@ import com.google.gson.JsonSyntaxException; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.config.ConfigHolder; import com.mojang.blaze3d.pipeline.RenderTarget; @@ -10,12 +9,16 @@ import com.mojang.blaze3d.vertex.VertexBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.PostChain; +import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ChunkPos; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterShadersEvent; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; @OnlyIn(Dist.CLIENT) public class GTShaders { @@ -26,9 +29,9 @@ public class GTShaders { public static BloomType BLOOM_TYPE; public static RenderTarget BLOOM_TARGET; - public static VertexBuffer BLOOM_BUFFER = new VertexBuffer(VertexBuffer.Usage.STATIC); - public static BufferBuilder BLOOM_BUFFER_BUILDER = new BufferBuilder(GTRenderTypes.getBloom().bufferSize()); - public static BufferBuilder.RenderedBuffer RENDERED_BLOOM_BUFFER = null; + public static Map BLOOM_BUFFERS = new HashMap<>(); + public static Map BLOOM_BUFFER_BUILDERS = new HashMap<>(); + public static Map RENDERED_BLOOM_BUFFERS = new HashMap<>(); public static void onRegisterShaders(RegisterShadersEvent event) { if (!allowedShader()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index ccc1125ff46..a88647255d8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -10,18 +10,20 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.PostChainAccessor; +import com.gregtechceu.gtceu.core.mixins.VertexBufferAccessor; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.CrashReport; +import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.PostPass; -import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; -import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; @@ -30,9 +32,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; -import org.joml.Quaternionf; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; @@ -334,6 +336,53 @@ public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, Verte } } + public static void removeBloomChunk(BlockPos origin) { + GTShaders.BLOOM_BUFFER_BUILDERS.remove(origin); + VertexBuffer buffer = GTShaders.BLOOM_BUFFERS.remove(origin); + if (buffer != null) { + if (!RenderSystem.isOnRenderThread()) { + RenderSystem.recordRenderCall(buffer::close); + } else { + buffer.close(); + } + } + GTShaders.RENDERED_BLOOM_BUFFERS.remove(origin); + } + + public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { + BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); + if (builder == null) { + builder = new BufferBuilder(GTRenderTypes.getBloom().bufferSize()); + GTShaders.BLOOM_BUFFER_BUILDERS.put(pos, builder); + builder.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); + } else if (!builder.building()) { + builder.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); + } + return builder; + } + + public static void bakeBloomChunkBuffers(List list) { + if (list.isEmpty()) { + return; + } + + for (var chunk : list) { + BlockPos pos = chunk.getOrigin(); + BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); + if (builder == null || !builder.building()) { + continue; + } + BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); + if (buffer != null) { + GTShaders.RENDERED_BLOOM_BUFFERS.put(pos, buffer); + BloomEffectUtil.uploadBloomBuffer(buffer, + GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, c -> new VertexBuffer(VertexBuffer.Usage.STATIC))); + } + } + } + + public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); + private static final String UNREAL_COMPOSITE_SHADER_NAME = "gtceu:unreal_composite"; private static final String UNITY_COMPOSITE_SHADER_NAME = "gtceu:unity_composite"; private static final String SEPERABLE_BLUR_SHADER_NAME = "gtceu:seperable_blur"; @@ -343,8 +392,7 @@ public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, Verte private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, - double camX, double camY, double camZ) { + private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, double camX, double camY, double camZ) { if (GTShaders.allowedShader()) { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); @@ -364,8 +412,7 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro } } } - if (shader.getName().equals(UNITY_COMPOSITE_SHADER_NAME) || - shader.getName().equals(UNREAL_COMPOSITE_SHADER_NAME)) { + if (shader.getName().equals(UNITY_COMPOSITE_SHADER_NAME) || shader.getName().equals(UNREAL_COMPOSITE_SHADER_NAME)) { shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(BloomEffect.strength); shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(BloomEffect.baseBrightness); shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(BloomEffect.highBrightnessThreshold); @@ -373,11 +420,17 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro } } - if (GTShaders.RENDERED_BLOOM_BUFFER != null && !GTShaders.BLOOM_BUFFER.isInvalid()) { - GTShaders.BLOOM_BUFFER.bind(); + for (var entry : GTShaders.BLOOM_BUFFERS.entrySet()) { + // return early if buffer is invalid or has no vertex data bound + // VertexBuffer#mode's nullness is the easiest way to check this. + if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { + continue; + } + entry.getValue().bind(); poseStack.pushPose(); + poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); poseStack.translate(-camX, -camY, -camZ); - GTShaders.BLOOM_BUFFER.drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); + entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); poseStack.popPose(); } @@ -389,7 +442,9 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro } } - private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) {} + private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) { + + } public static final class BloomRenderTicket { @@ -412,9 +467,7 @@ public static final class BloomRenderTicket { this.invalidated = true; } - BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType, - @NotNull IBloomEffect render, @Nullable Predicate validityChecker, - @Nullable Supplier worldContext) { + BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType, @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { this.renderSetup = renderSetup; this.bloomType = Objects.requireNonNull(bloomType, "bloomType == null"); this.render = Objects.requireNonNull(render, "render == null"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java index c367185a952..fafb721d9a3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.common.worldgen.RubberFoliagePlacer; import com.gregtechceu.gtceu.common.worldgen.RubberTrunkPlacer; import com.gregtechceu.gtceu.core.mixins.IFoliagePlacerTypeAccessor; -import com.gregtechceu.gtceu.core.mixins.ITrunkPlacerTypeAccessor; +import com.gregtechceu.gtceu.core.mixins.ITrunkPlacerTypeAccessor; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacerType; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java deleted file mode 100644 index 92b231228d0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeModelBlockRendererMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import com.gregtechceu.gtceu.client.model.GTMetadataSection; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.model.lighting.ForgeModelBlockRenderer; -import net.minecraftforge.client.model.lighting.QuadLighter; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(value = ForgeModelBlockRenderer.class, remap = false) -public class ForgeModelBlockRendererMixin { - - @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;process(Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;I)V")) - private static void gtceu$renderToEmissiveBuffer(QuadLighter instance, - VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, int overlay, - Operation original, - VertexConsumer _consumer, QuadLighter lighter, BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, PoseStack poseStack) { - if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - poseStack.pushPose(); - poseStack.translate(pos.getX() - (pos.getX() & 15), pos.getY() - (pos.getY() & 15), pos.getZ() - (pos.getZ() & 15)); - //poseStack.scale(2f, 2f, 2f); - original.call(instance, GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, overlay); - poseStack.popPose(); - } - original.call(instance, consumer, pose, quad, overlay); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index 55210217622..dac297c7dc1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -1,13 +1,14 @@ package com.gregtechceu.gtceu.core.mixins; +import com.google.common.collect.Lists; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.*; +import net.minecraft.Util; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -19,6 +20,7 @@ import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; @@ -32,12 +34,12 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.*; +import java.util.concurrent.CompletableFuture; @Mixin(LevelRenderer.class) @OnlyIn(Dist.CLIENT) @@ -119,9 +121,6 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo CallbackInfo ci) { GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); minecraft.getMainRenderTarget().bindWrite(false); - if (!GTShaders.BLOOM_BUFFER_BUILDER.building()) { - GTShaders.BLOOM_BUFFER_BUILDER.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); - } } @Inject(method = "renderLevel", @@ -136,15 +135,9 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo } @Inject(method = "compileChunks", at = @At("TAIL")) - private void gtceu$compileBloomData(Camera camera, CallbackInfo ci, - @Local List list) { - if (!list.isEmpty()) { - BufferBuilder.RenderedBuffer buffer = GTShaders.BLOOM_BUFFER_BUILDER.endOrDiscardIfEmpty(); - if (buffer != null) { - GTShaders.RENDERED_BLOOM_BUFFER = buffer; - BloomEffectUtil.uploadBloomBuffer(buffer, GTShaders.BLOOM_BUFFER); - } - } + private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, + @Local List list) { + BloomEffectUtil.bakeBloomChunkBuffers(list); } @Inject(method = "resize", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java index 2e3d4bc894a..407f17b02e3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java @@ -2,75 +2,36 @@ import com.gregtechceu.gtceu.client.model.GTMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.vertex.*; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(ModelBlockRenderer.class) public class ModelBlockRendererMixin { - @WrapOperation(method = "renderModelFaceAO", + @WrapOperation(method = "putQuadData", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/block/ModelBlockRenderer;putQuadData(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;FFFFIIIII)V")) - private void gtceu$renderToEmissiveBuffer(ModelBlockRenderer instance, - BlockAndTintGetter level, BlockState state, BlockPos pos, - VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, - float brightness0, float brightness1, float brightness2, float brightness3, - int lightmap0, int lightmap1, int lightmap2, int lightmap3, - int packedOverlay, - Operation original, - BlockAndTintGetter _level, BlockState _state, BlockPos _pos, PoseStack poseStack) { - if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - poseStack.pushPose(); - poseStack.translate(pos.getX() - (pos.getX() & 15), pos.getY() - (pos.getY() & 15), pos.getZ() - (pos.getZ() & 15)); - //poseStack.scale(2f, 2f, 2f); - original.call(instance, level, state, pos, - GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, - brightness0, brightness1, brightness2, brightness3, - lightmap0, lightmap1, lightmap2, lightmap3, - packedOverlay); - poseStack.popPose(); + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") + ) + private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BlockPos chunkPos = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); + // Check if quad is full brightness OR we have bloom enabled for the quad + if (GTShaders.allowedShader() && chunkPos != null && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkPos), poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); } - original.call(instance, level, state, pos, - consumer, pose, quad, - brightness0, brightness1, brightness2, brightness3, - lightmap0, lightmap1, lightmap2, lightmap3, - packedOverlay); - } - - @WrapOperation(method = "renderModelFaceFlat", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/block/ModelBlockRenderer;putQuadData(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;FFFFIIIII)V")) - private void gtceu$renderToEmissiveBuffer(ModelBlockRenderer instance, - BlockAndTintGetter level, BlockState state, BlockPos pos, - VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, - float brightness0, float brightness1, float brightness2, float brightness3, - int lightmap0, int lightmap1, int lightmap2, int lightmap3, - int packedOverlay, - Operation original, - BlockAndTintGetter _level, BlockState _state, BlockPos _pos, int packedLight, int _packedOverlay, boolean repackLight, PoseStack poseStack) { - if (GTShaders.allowedShader() && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - poseStack.pushPose(); - poseStack.translate(pos.getX() - (pos.getX() & 15), pos.getY() - (pos.getY() & 15), pos.getZ() - (pos.getZ() & 15)); - //poseStack.scale(2f, 2f, 2f); - original.call(instance, level, state, pos, - GTShaders.BLOOM_BUFFER_BUILDER, poseStack.last(), quad, - brightness0, brightness1, brightness2, brightness3, - lightmap0, lightmap1, lightmap2, lightmap3, - packedOverlay); - poseStack.popPose(); - } - original.call(instance, level, state, pos, - consumer, pose, quad, - brightness0, brightness1, brightness2, brightness3, - lightmap0, lightmap1, lightmap2, lightmap3, - packedOverlay); + original.call(instance, poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java new file mode 100644 index 00000000000..3304d69b608 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java @@ -0,0 +1,38 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.model.GTMetadataSection; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.BlockPos; +import net.minecraftforge.client.model.lighting.QuadLighter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = QuadLighter.class, remap = false) +public class QuadLighterMixin { + + @WrapOperation(method = "process", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", + remap = true) + ) + private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BlockPos chunkPos = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); + // Check if quad is full brightness OR we have bloom enabled for the quad + if (GTShaders.allowedShader() && chunkPos != null && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkPos), poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } + original.call(instance, poseEntry, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java new file mode 100644 index 00000000000..272892b71d0 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java @@ -0,0 +1,33 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import net.minecraft.client.renderer.ChunkBufferBuilderPack; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.core.BlockPos; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") +public class RebuildTaskMixin { + + @Shadow @Final + ChunkRenderDispatcher.RenderChunk this$1; + + @Inject(method = "compile", at = @At(value = "HEAD")) + private void gtceu$startBloomBufferForChunk(float x, float y, float z, ChunkBufferBuilderPack chunkBufferBuilderPack, CallbackInfoReturnable cir) { + BlockPos pos = this.this$1.getOrigin(); + BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(pos); + } + + @Inject(method = "doTask", + at = @At(value = "INVOKE", + target = "Ljava/util/concurrent/CompletableFuture;completedFuture(Ljava/lang/Object;)Ljava/util/concurrent/CompletableFuture;", + remap = false)) + private void gtceu$cancelBloomBake(ChunkBufferBuilderPack buffers, CallbackInfoReturnable cir) { + BloomEffectUtil.removeBloomChunk(this.this$1.getOrigin()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerAccessor.java index 29d13c1a762..626ffa9ce23 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerAccessor.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.core.mixins; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; @@ -8,6 +9,7 @@ import org.jetbrains.annotations.VisibleForTesting; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; import java.util.Map; @@ -25,4 +27,7 @@ public interface RecipeManagerAccessor { @Accessor("recipes") @VisibleForTesting void setRawRecipes(Map, Map>> recipes); + + @Invoker("byType") + > Map> getRecipeFromType(RecipeType type); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerInvoker.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerInvoker.java deleted file mode 100644 index 74dcee4fae6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RecipeManagerInvoker.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.Container; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.item.crafting.RecipeType; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.Map; - -@Mixin(RecipeManager.class) -public interface RecipeManagerInvoker { - - @Invoker("byType") - > Map> getRecipeFromType(RecipeType type); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java new file mode 100644 index 00000000000..bcd933c6f78 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java @@ -0,0 +1,23 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.core.BlockPos; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ChunkRenderDispatcher.RenderChunk.class) +public class RenderChunkMixin { + + @Shadow @Final + BlockPos.MutableBlockPos origin; + + @Inject(method = "releaseBuffers", at = @At("HEAD")) + private void gtceu$releaseBloomBuffers(CallbackInfo ci) { + BloomEffectUtil.removeBloomChunk(this.origin); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/VertexBufferAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/VertexBufferAccessor.java new file mode 100644 index 00000000000..0b72f018a74 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/VertexBufferAccessor.java @@ -0,0 +1,13 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.mojang.blaze3d.vertex.VertexBuffer; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(VertexBuffer.class) +public interface VertexBufferAccessor { + + @Accessor + VertexFormat.Mode getMode(); +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 4dde7612110..56420dc1b3c 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -10,7 +10,6 @@ "BlockModelMixin", "ClientLevelAccessor", "CompassManagerMixin", - "ForgeModelBlockRendererMixin", "GuiGraphicsAccessor", "GuiGraphicsMixin", "GuiHeartTypeMixin", @@ -19,6 +18,9 @@ "ModelManagerMixin", "MultiPlayerGameModeMixin", "PostChainAccessor", + "RebuildTaskMixin", + "RenderChunkMixin", + "VertexBufferAccessor", "rei.FluidEntryRendererMixin" ], "mixins": [ @@ -45,8 +47,8 @@ "OreVeinifierMixin", "PartialNBTIngredientAccessor", "PrimedTntAccessor", + "QuadLighterMixin", "RecipeManagerAccessor", - "RecipeManagerInvoker", "RecipeManagerMixin", "RepairItemRecipeMixin", "ServerChunkProviderMixin", From 8b773b0a1de671638d5b0e9e59c05d48bdbb5778 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:28:11 +0300 Subject: [PATCH 013/269] now that it actually works I can do the damned embeddium compat --- .../gregtechceu/gtceu/client/ClientProxy.java | 10 +- .../gtceu/client/model/GTMetadataSection.java | 13 +- .../client/particle/GTBloomParticle.java | 1 + .../client/particle/GTOverheatParticle.java | 7 - .../gtceu/client/particle/GTParticle.java | 3 +- .../client/particle/GTParticleManager.java | 5 +- .../gtceu/client/renderer/GTRenderTypes.java | 8 +- .../gtceu/client/renderer/IRenderSetup.java | 2 - .../machine/FusionReactorRenderer.java | 28 ++-- .../gtceu/client/shader/GTShaders.java | 15 ++- .../gtceu/client/util/BloomEffectUtil.java | 122 +++++++++--------- .../client/util/EffectRenderContext.java | 2 - .../gtceu/client/util/IBloomEffect.java | 12 +- .../gtceu/client/util/RenderBufferHelper.java | 2 +- .../common/blockentity/CableBlockEntity.java | 7 +- .../gtceu/common/data/GTPlacerTypes.java | 2 +- .../electric/FusionReactorMachine.java | 5 +- .../gtceu/config/ConfigHolder.java | 10 +- .../gtceu/core/mixins/LevelRendererMixin.java | 30 ++--- .../core/mixins/ModelBlockRendererMixin.java | 18 +-- .../gtceu/core/mixins/PostChainAccessor.java | 1 + .../gtceu/core/mixins/QuadLighterMixin.java | 24 ++-- .../gtceu/core/mixins/RebuildTaskMixin.java | 17 +-- .../gtceu/core/mixins/RenderChunkMixin.java | 9 +- .../resources/META-INF/accesstransformer.cfg | 5 + 25 files changed, 182 insertions(+), 176 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 8b1d262a831..eb409a3374e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -24,15 +24,12 @@ import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.HangingSignRenderer; import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.*; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -99,12 +96,7 @@ public void onRegisterGuiOverlays(RegisterGuiOverlaysEvent event) { public void onRegisterParticleProviders(RegisterParticleProvidersEvent event) { event.registerSpriteSet(GTParticleTypes.HAZARD_PARTICLE.get(), HazardParticle.Provider::new); } -/* - @SubscribeEvent - public void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { - event.register("bloom", BloomEffectUtil.getEffectiveBloomLayer(), Sheets.cutoutBlockSheet()); - } -*/ + @SubscribeEvent public void onRegisterShaders(RegisterShadersEvent event) { GTShaders.onRegisterShaders(event); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java index 79a71f2e09b..887ebd0adc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java @@ -1,18 +1,21 @@ package com.gregtechceu.gtceu.client.model; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.gregtechceu.gtceu.GTCEu; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.metadata.MetadataSectionSerializer; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; public record GTMetadataSection(boolean bloom) { + public static final String SECTION_NAME = GTCEu.MOD_ID; public static final GTMetadataSection MISSING = new GTMetadataSection(false); @@ -32,7 +35,7 @@ public static GTMetadataSection getMetadata(ResourceLocation res) { public static boolean hasBloom(TextureAtlasSprite sprite) { if (sprite == null) return false; - //noinspection resource + // noinspection resource GTMetadataSection ret = getMetadata(spriteToAbsolute(sprite.contents().name())); return ret != null && ret.bloom; } @@ -48,7 +51,8 @@ public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { } public static class Serializer - implements MetadataSectionSerializer { + implements MetadataSectionSerializer { + static GTMetadataSection.Serializer INSTANCE = new GTMetadataSection.Serializer(); @NotNull @@ -74,4 +78,3 @@ public GTMetadataSection fromJson(JsonObject json) { } } } - diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java index 4e04931b080..2c631ccc1c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.gregtechceu.gtceu.client.util.IBloomEffect; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 4191c4ca99d..da7979c8467 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -1,19 +1,14 @@ package com.gregtechceu.gtceu.client.particle; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.IRenderSetup; import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.client.util.DrawUtil; import com.gregtechceu.gtceu.client.util.EffectRenderContext; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; - import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.lowdragmc.shimmer.client.shader.RenderUtils; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.phys.AABB; @@ -24,10 +19,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.lwjgl.opengl.GL11; import java.util.List; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index 09279d23935..69e44ca550c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.client.renderer.IRenderSetup; import com.gregtechceu.gtceu.client.util.EffectRenderContext; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -101,7 +100,7 @@ protected void onExpired() {} * called between a {@link IRenderSetup#preDraw(BufferBuilder)} call and a * {@link IRenderSetup#postDraw(BufferBuilder)} call. * - * @param poseStack + * @param poseStack pose stack * @param buffer buffer builder * @param context render context */ diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 5f03013638b..16cd73ba9c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -4,13 +4,10 @@ import com.gregtechceu.gtceu.client.renderer.IRenderSetup; import com.gregtechceu.gtceu.client.util.EffectRenderContext; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.Tesselator; import net.minecraft.ChatFormatting; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -23,7 +20,9 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; 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 d7b247e57d9..3255548bacb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.renderer; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.mojang.blaze3d.systems.RenderSystem; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; @@ -14,7 +14,8 @@ @OnlyIn(Dist.CLIENT) public class GTRenderTypes extends RenderType { - public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard("bloom_target", + public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard( + "bloom_target", () -> { if (GTShaders.allowedShader()) { GTShaders.BLOOM_TARGET.bindWrite(false); @@ -34,7 +35,8 @@ public class GTRenderTypes extends RenderType { .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) .createCompositeState(false)); - private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, + private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, + VertexFormat.Mode.QUADS, 2097152, false, false, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java index e2ce64b5e36..96ca4083bbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.client.renderer; import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; import org.jetbrains.annotations.NotNull; public interface IRenderSetup { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java index 82cd7e775cf..0a2f211d9cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java @@ -12,11 +12,10 @@ import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; import com.gregtechceu.gtceu.config.ConfigHolder; + import com.lowdragmc.lowdraglib.utils.ColorUtils; import com.lowdragmc.lowdraglib.utils.interpolate.Eases; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import lombok.RequiredArgsConstructor; + import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -25,6 +24,10 @@ import net.minecraft.world.phys.AABB; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.NotNull; public class FusionReactorRenderer extends WorkableCasingMachineRenderer { @@ -69,9 +72,9 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P float g = ColorUtils.green(ringColor); float b = ColorUtils.blue(ringColor); RenderBufferHelper.renderRing(stack, buffer, - pos.getX() /*- (float) context.cameraX()*/ + relativeBack.getStepX() * 7 + 0.5F, - pos.getY() /*- (float) context.cameraY()*/ + relativeBack.getStepY() * 7 + 0.5F, - pos.getZ() /*- (float) context.cameraZ()*/ + relativeBack.getStepZ() * 7 + 0.5F, + pos.getX() + relativeBack.getStepX() * 7 + 0.5F, + pos.getY() + relativeBack.getStepY() * 7 + 0.5F, + pos.getZ() + relativeBack.getStepZ() * 7 + 0.5F, 6, 0.2F, 10, 20, r, g, b, a, axis); } @@ -99,12 +102,15 @@ private final class FusionBloomEffect implements IBloomEffect { private final FusionReactorMachine machine; - private static final BufferBuilder lightRingBuffer = new BufferBuilder(GTRenderTypes.getLightRing().bufferSize()); + private static final BufferBuilder lightRingBuffer = new BufferBuilder( + GTRenderTypes.getLightRing().bufferSize()); @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + @NotNull EffectRenderContext context) { lightRingBuffer.begin(GTRenderTypes.getLightRing().mode(), GTRenderTypes.getLightRing().format()); - FusionReactorRenderer.this.renderLightRing(machine, context.partialTicks(), poseStack, lightRingBuffer, context); + FusionReactorRenderer.this.renderLightRing(machine, context.partialTicks(), poseStack, lightRingBuffer, + context); BufferUploader.drawWithShader(lightRingBuffer.end()); } @@ -131,8 +137,6 @@ public void preDraw(@NotNull BufferBuilder buffer) { } @Override - public void postDraw(@NotNull BufferBuilder buffer) { - - } + public void postDraw(@NotNull BufferBuilder buffer) {} } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index bb014700f4c..0ec090f8113 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -1,21 +1,23 @@ package com.gregtechceu.gtceu.client.shader; -import com.google.gson.JsonSyntaxException; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.VertexBuffer; + +import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.PostChain; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.ChunkPos; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterShadersEvent; +import com.google.gson.JsonSyntaxException; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.VertexBuffer; + import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -86,7 +88,8 @@ private static void initPostShaders() { } public static boolean allowedShader() { - return ConfigHolder.INSTANCE.client.shader.useShader && !GTCEu.isIrisOculusLoaded(); + return ConfigHolder.INSTANCE.client.shader.useShader && + !(GTCEu.isIrisOculusLoaded() && IrisApi.getInstance().isShaderPackInUse()); } public static float getITime(float pPartialTicks) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index a88647255d8..bc886e21ad0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -7,20 +7,14 @@ import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.shader.post.BloomEffect; import com.gregtechceu.gtceu.client.shader.post.BloomType; - import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.VertexBufferAccessor; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.CrashReport; -import net.minecraft.Util; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; +import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.PostPass; -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; @@ -29,12 +23,16 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import java.util.*; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; @@ -76,7 +74,8 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup new IBloomEffect() { @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + @NotNull EffectRenderContext context) { render.renderBloomEffect(poseStack, buffer, context); } @@ -222,13 +221,15 @@ public static void renderBloom(double camX, double camY, double camZ, Frustum frustum, float partialTicks, @NotNull Entity entity) { + if (!GTShaders.allowedShader()) { + return; + } Minecraft.getInstance().getProfiler().popPush("gtceu_block_bloom"); BLOOM_RENDER_LOCK.lock(); try { preDraw(); - //GTShaders.BLOOM_TARGET.setClearColor(1, 0, 0 ,1); GTShaders.BLOOM_TARGET.bindWrite(false); EffectRenderContext context = EffectRenderContext.getInstance() @@ -314,7 +315,7 @@ private static void draw(@NotNull PoseStack poseStack, } private static void postDraw() { - for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext(); ) { + for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext();) { List list = it.next(); if (!list.isEmpty()) { @@ -361,13 +362,13 @@ public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { return builder; } - public static void bakeBloomChunkBuffers(List list) { - if (list.isEmpty()) { + public static void bakeBloomChunkBuffers(Set list) { + if (!GTShaders.allowedShader() || list.isEmpty()) { return; } for (var chunk : list) { - BlockPos pos = chunk.getOrigin(); + BlockPos pos = chunk.chunk.getOrigin(); BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); if (builder == null || !builder.building()) { continue; @@ -392,54 +393,54 @@ public static void bakeBloomChunkBuffers(List private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, double camX, double camY, double camZ) { - if (GTShaders.allowedShader()) { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - // Forcefully insert config values to shader - List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); - for (PostPass pass : passes) { - EffectInstance shader = pass.getEffect(); - shader.safeGetUniform("iTime").set(GTShaders.getITime(partialTicks)); - shader.safeGetUniform("EnableFilter").set(BloomEffectUtil.isDrawingBlockBloom.get() ? 1 : 0); - - if (GTShaders.BLOOM_TYPE == BloomType.UNREAL) { - if (shader.getName().equals(SEPERABLE_BLUR_SHADER_NAME)) { - int index = passes.indexOf(pass); - switch (index) { - case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); - case 2, 4, 6, 8 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); - } + private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, double camX, + double camY, double camZ) { + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + // Forcefully insert config values to shader + List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); + for (PostPass pass : passes) { + EffectInstance shader = pass.getEffect(); + shader.safeGetUniform("iTime").set(GTShaders.getITime(partialTicks)); + shader.safeGetUniform("EnableFilter").set(BloomEffectUtil.isDrawingBlockBloom.get() ? 1 : 0); + + if (GTShaders.BLOOM_TYPE == BloomType.UNREAL) { + if (shader.getName().equals(SEPERABLE_BLUR_SHADER_NAME)) { + int index = passes.indexOf(pass); + switch (index) { + case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); + case 2, 4, 6, 8 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); } } - if (shader.getName().equals(UNITY_COMPOSITE_SHADER_NAME) || shader.getName().equals(UNREAL_COMPOSITE_SHADER_NAME)) { - shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(BloomEffect.strength); - shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(BloomEffect.baseBrightness); - shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(BloomEffect.highBrightnessThreshold); - shader.safeGetUniform(BLOOM_THRESHOLD_DOWN_UNIFORM).set(BloomEffect.lowBrightnessThreshold); - } } - - for (var entry : GTShaders.BLOOM_BUFFERS.entrySet()) { - // return early if buffer is invalid or has no vertex data bound - // VertexBuffer#mode's nullness is the easiest way to check this. - if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { - continue; - } - entry.getValue().bind(); - poseStack.pushPose(); - poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); - poseStack.translate(-camX, -camY, -camZ); - entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); - poseStack.popPose(); + if (shader.getName().equals(UNITY_COMPOSITE_SHADER_NAME) || + shader.getName().equals(UNREAL_COMPOSITE_SHADER_NAME)) { + shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(BloomEffect.strength); + shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(BloomEffect.baseBrightness); + shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(BloomEffect.highBrightnessThreshold); + shader.safeGetUniform(BLOOM_THRESHOLD_DOWN_UNIFORM).set(BloomEffect.lowBrightnessThreshold); } + } - GTShaders.BLOOM_CHAIN.process(partialTicks); - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - VertexBuffer.unbind(); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + for (var entry : GTShaders.BLOOM_BUFFERS.entrySet()) { + // return early if buffer is invalid or has no vertex data bound + // VertexBuffer#mode's nullness is the easiest way to check this. + if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { + continue; + } + entry.getValue().bind(); + poseStack.pushPose(); + poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); + poseStack.translate(-camX, -camY, -camZ); + entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); + poseStack.popPose(); } + + GTShaders.BLOOM_CHAIN.process(partialTicks); + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + VertexBuffer.unbind(); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) { @@ -462,12 +463,13 @@ public static final class BloomRenderTicket { private boolean invalidated; BloomRenderTicket() { - this(null, BloomType.DISABLED, (p, b, c) -> { - }, null, null); + this(null, BloomType.DISABLED, (p, b, c) -> {}, null, null); this.invalidated = true; } - BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType, @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { + BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType, + @NotNull IBloomEffect render, @Nullable Predicate validityChecker, + @Nullable Supplier worldContext) { this.renderSetup = renderSetup; this.bloomType = Objects.requireNonNull(bloomType, "bloomType == null"); this.render = Objects.requireNonNull(render, "render == null"); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java b/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java index 670ec134f36..11657bfb432 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java @@ -1,11 +1,9 @@ package com.gregtechceu.gtceu.client.util; -import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; -import net.minecraft.world.phys.Vec3; import lombok.Getter; import lombok.experimental.Accessors; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java index 3a3a021754d..a956606007d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java @@ -1,15 +1,14 @@ package com.gregtechceu.gtceu.client.util; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.client.renderer.IRenderSetup; import com.gregtechceu.gtceu.client.shader.post.BloomType; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; + import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; import org.jetbrains.annotations.NotNull; /** @@ -26,7 +25,8 @@ public interface IBloomEffect { * @param context render context */ @OnlyIn(Dist.CLIENT) - void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context); + void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + @NotNull EffectRenderContext context); /** * @param context render context 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 47314a1cad5..ac5189d9943 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.client.util; -import com.mojang.blaze3d.vertex.BufferBuilder; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.phys.AABB; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import org.joml.Matrix4f; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java index 80c6b2d0cd2..3d6361fd912 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -39,10 +39,10 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; - -import lombok.Getter; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; + +import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -257,7 +257,8 @@ public boolean isParticleAlive() { @OnlyIn(Dist.CLIENT) public void createParticle() { - particle = new GTOverheatParticle(this, meltTemp, getPipeBlock().getShape(getBlockState(), level, getBlockPos(), CollisionContext.empty()), + particle = new GTOverheatParticle(this, meltTemp, + getPipeBlock().getShape(getBlockState(), level, getBlockPos(), CollisionContext.empty()), getPipeType().insulationLevel >= 0); GTParticleManager.INSTANCE.addEffect(particle); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java index fafb721d9a3..c367185a952 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlacerTypes.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.common.worldgen.RubberFoliagePlacer; import com.gregtechceu.gtceu.common.worldgen.RubberTrunkPlacer; import com.gregtechceu.gtceu.core.mixins.IFoliagePlacerTypeAccessor; - import com.gregtechceu.gtceu.core.mixins.ITrunkPlacerTypeAccessor; + import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacerType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java index 488e3ad36fb..83152a8c28d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java @@ -27,13 +27,13 @@ import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; -import lombok.Setter; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.Block; import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -70,7 +70,8 @@ public class FusionReactorMachine extends WorkableElectricMultiblockMachine impl @Nullable protected TickableSubscription preHeatSubs; - @Getter @Setter + @Getter + @Setter protected boolean registeredBloomTicket; public FusionReactorMachine(IMachineBlockEntity holder, int tier) { diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 5d27b0623c3..69daa19ad16 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -672,8 +672,8 @@ public static class ShaderOptions { public boolean emissiveTexturesBloom = true; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", "1 - Unity Bloom", - "2 - Unreal Bloom", "Default: 2" }) + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", + "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) @Configurable.Range(min = 0, max = 2) public int bloomStyle = 2; @@ -735,7 +735,8 @@ public static class FusionBloom { public double strength = 1.5; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", "1 - Unity Bloom", + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", + "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) @Configurable.Range(min = 0, max = 2) public int bloomStyle = 1; @@ -781,7 +782,8 @@ public static class HeatEffectBloom { public double strength = 1.1; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", "1 - Unity Bloom", + @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", + "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) @Configurable.Range(min = 0, max = 2) public int bloomStyle = 2; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index dac297c7dc1..e6900129f82 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -1,26 +1,20 @@ package com.gregtechceu.gtceu.core.mixins; -import com.google.common.collect.Lists; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; - import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.Util; + import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; @@ -28,6 +22,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; @@ -39,7 +34,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.*; -import java.util.concurrent.CompletableFuture; @Mixin(LevelRenderer.class) @OnlyIn(Dist.CLIENT) @@ -112,7 +106,8 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo throw new AssertionError(); } - @Shadow public abstract Frustum getFrustum(); + @Shadow + public abstract Frustum getFrustum(); @Inject(method = "renderLevel", at = @At("HEAD")) private void gtceu$startBloomBuffer(PoseStack poseStack, float partialTick, long finishNanoTime, @@ -125,8 +120,8 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo @Inject(method = "renderLevel", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/DimensionSpecialEffects;constantAmbientLight()Z")) + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/DimensionSpecialEffects;constantAmbientLight()Z")) private void gtceu$injectRenderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { @@ -134,10 +129,12 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo poseStack, projectionMatrix, getFrustum(), partialTick, camera.getEntity()); } - @Inject(method = "compileChunks", at = @At("TAIL")) - private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, - @Local List list) { - BloomEffectUtil.bakeBloomChunkBuffers(list); + @Inject(method = "updateRenderChunks", at = @At("HEAD")) + private void gtceu$compileBloomBuffers(LinkedHashSet chunkInfos, + LevelRenderer.RenderInfoMap infoMap, Vec3 viewVector, + Queue infoQueue, boolean shouldCull, + CallbackInfo ci) { + BloomEffectUtil.bakeBloomChunkBuffers(chunkInfos); } @Inject(method = "resize", at = @At("TAIL")) @@ -148,7 +145,8 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo } @Inject(method = "renderHitOutline", at = @At("HEAD")) - private void gtceu$renderAOEHitOutline(PoseStack poseStack, VertexConsumer consumer, Entity entity, double camX, double camY, + private void gtceu$renderAOEHitOutline(PoseStack poseStack, VertexConsumer consumer, Entity entity, double camX, + double camY, double camZ, BlockPos pos, BlockState state, CallbackInfo ci) { if (minecraft.player == null || minecraft.level == null) return; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java index 407f17b02e3..6a0c08b505c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java @@ -3,12 +3,14 @@ import com.gregtechceu.gtceu.client.model.GTMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.*; + import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.BlockPos; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,16 +19,16 @@ public class ModelBlockRendererMixin { @WrapOperation(method = "putQuadData", at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") - ) + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { - BlockPos chunkPos = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); + BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); // Check if quad is full brightness OR we have bloom enabled for the quad - if (GTShaders.allowedShader() && chunkPos != null && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkPos), poseEntry, quad, + if (GTShaders.allowedShader() && chunkOrigin != null && + (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), poseEntry, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java index c15278a4f62..767a003e061 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java @@ -2,6 +2,7 @@ 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; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java index 3304d69b608..937a18b8ae3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java @@ -3,12 +3,14 @@ import com.gregtechceu.gtceu.client.model.GTMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.*; + import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.BlockPos; import net.minecraftforge.client.model.lighting.QuadLighter; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,16 +20,16 @@ public class QuadLighterMixin { @WrapOperation(method = "process", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", - remap = true) - ) + remap = true)) private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - BlockPos chunkPos = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); // Check if quad is full brightness OR we have bloom enabled for the quad - if (GTShaders.allowedShader() && chunkPos != null && (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkPos), poseEntry, quad, + if (GTShaders.allowedShader() && chunkOrigin != null && + (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), poseEntry, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java index 272892b71d0..c0cdcf1b300 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java @@ -1,9 +1,11 @@ package com.gregtechceu.gtceu.core.mixins; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; + import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.core.BlockPos; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,20 +16,15 @@ @Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") public class RebuildTaskMixin { - @Shadow @Final + @Shadow + @Final ChunkRenderDispatcher.RenderChunk this$1; @Inject(method = "compile", at = @At(value = "HEAD")) - private void gtceu$startBloomBufferForChunk(float x, float y, float z, ChunkBufferBuilderPack chunkBufferBuilderPack, CallbackInfoReturnable cir) { + private void gtceu$startBloomBufferForChunk(float x, float y, float z, + ChunkBufferBuilderPack chunkBufferBuilderPack, + CallbackInfoReturnable cir) { BlockPos pos = this.this$1.getOrigin(); BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(pos); } - - @Inject(method = "doTask", - at = @At(value = "INVOKE", - target = "Ljava/util/concurrent/CompletableFuture;completedFuture(Ljava/lang/Object;)Ljava/util/concurrent/CompletableFuture;", - remap = false)) - private void gtceu$cancelBloomBake(ChunkBufferBuilderPack buffers, CallbackInfoReturnable cir) { - BloomEffectUtil.removeBloomChunk(this.this$1.getOrigin()); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java index bcd933c6f78..9c9fede69d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java @@ -1,8 +1,10 @@ package com.gregtechceu.gtceu.core.mixins; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; + import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.core.BlockPos; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -13,11 +15,12 @@ @Mixin(ChunkRenderDispatcher.RenderChunk.class) public class RenderChunkMixin { - @Shadow @Final + @Shadow + @Final BlockPos.MutableBlockPos origin; - @Inject(method = "releaseBuffers", at = @At("HEAD")) - private void gtceu$releaseBloomBuffers(CallbackInfo ci) { + @Inject(method = "reset", at = @At("HEAD")) + private void gtceu$resetBloomBuffers(CallbackInfo ci) { BloomEffectUtil.removeBloomChunk(this.origin); } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index e416b85be76..a0e5f3fb3bc 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -22,6 +22,11 @@ public net.minecraft.world.entity.Entity m_20115_(IZ)V # setSharedFlag public net.minecraft.world.entity.vehicle.Boat f_38285_ # DATA_ID_TYPE +# for bloom +public net.minecraft.client.renderer.LevelRenderer$RenderChunkInfo +public net.minecraft.client.renderer.LevelRenderer$RenderChunkInfo f_109839_ # chunk +public net.minecraft.client.renderer.LevelRenderer$RenderInfoMap + # for AE2 to be able to load (idk why but it needs these?) public net.minecraft.world.level.block.Blocks m_50774_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # always public net.minecraft.world.level.block.Blocks m_50805_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # never From 03455c242201777eeac9da3827ad0a9dd290bf56 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 9 Oct 2024 21:05:23 +0300 Subject: [PATCH 014/269] placing blocks in chunks with bloom is annoyingly slow, works great otherwise --- dependencies.gradle | 2 +- .../java/com/gregtechceu/gtceu/GTCEu.java | 5 +- .../gregtechceu/gtceu/client/ClientProxy.java | 5 ++ .../forge/ForgeClientEventListener.java | 22 ++++- .../gtceu/client/renderer/GTRenderTypes.java | 1 - .../machine/FusionReactorRenderer.java | 28 ++++--- .../gtceu/client/util/BloomEffectUtil.java | 28 ++++--- .../gtceu/core/mixins/LevelRendererMixin.java | 28 +------ .../mixins/embeddium/BlockRendererMixin.java | 84 +++++++++++++++++++ .../mixins/embeddium/RenderSectionMixin.java | 30 +++++++ .../embeddium/GTEmbeddiumCompat.java | 15 ++++ .../embeddium/renderer/BloomMeshAppender.java | 21 +++++ src/main/resources/gtceu.mixins.json | 2 + 13 files changed, 218 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java diff --git a/dependencies.gradle b/dependencies.gradle index 5946f47e34c..8b5417a8810 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -58,7 +58,7 @@ dependencies { // Shimmer modCompileOnly(forge.shimmer.forge) { transitive = false } - modCompileOnly("maven.modrinth:embeddium:0.3.31+mc1.20.1") + modImplementation("maven.modrinth:embeddium:0.3.31+mc1.20.1") modCompileOnly("maven.modrinth:oculus:1.20.1-1.7.0") // JAVD diff --git a/src/main/java/com/gregtechceu/gtceu/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index 25c6ccfe15b..fae55bce278 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -66,9 +66,8 @@ public static boolean isIrisOculusLoaded() { return LDLib.isModLoaded(GTValues.MODID_IRIS) || LDLib.isModLoaded(GTValues.MODID_OCULUS); } - public static boolean isSodiumRubidiumEmbeddiumLoaded() { - return LDLib.isModLoaded(GTValues.MODID_SODIUM) || LDLib.isModLoaded(GTValues.MODID_RUBIDIUM) || - LDLib.isModLoaded(GTValues.MODID_EMBEDDIUM); + public static boolean isEmbeddiumLoaded() { + return LDLib.isModLoaded(GTValues.MODID_EMBEDDIUM); } public static boolean isAE2Loaded() { diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index eb409a3374e..2b3f9f650dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -17,6 +17,7 @@ import com.gregtechceu.gtceu.common.data.GTEntityTypes; import com.gregtechceu.gtceu.common.data.GTParticleTypes; import com.gregtechceu.gtceu.common.entity.GTBoat; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import com.gregtechceu.gtceu.utils.input.KeyBind; import com.lowdragmc.lowdraglib.gui.compass.CompassManager; @@ -31,6 +32,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.*; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import com.google.common.collect.BiMap; @@ -58,6 +60,9 @@ public static void init() { CompassManager.INSTANCE.registerUIConfig(GTCEu.MOD_ID, new GTCompassUIConfig()); CompassManager.INSTANCE.registerAction("multiblock", MultiblockAction::new); BloomEffectUtil.init(); + if (GTCEu.isEmbeddiumLoaded()) { + MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); + } } @SubscribeEvent diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 7158086e9b9..31d19273f3c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -6,9 +6,12 @@ import com.gregtechceu.gtceu.client.TooltipsHandler; import com.gregtechceu.gtceu.client.renderer.BlockHighLightRenderer; import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; import com.gregtechceu.gtceu.client.util.TooltipHelper; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.*; @@ -18,6 +21,8 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import com.mojang.blaze3d.vertex.PoseStack; + /** * @author KilaBash * @date 2022/8/27 @@ -30,10 +35,23 @@ public class ForgeClientEventListener { @SubscribeEvent public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) { + Camera camera = event.getCamera(); + PoseStack poseStack = event.getPoseStack(); + float partialTick = event.getPartialTick(); // to render the preview after block entities, before the translucent. so it can be seen through the // transparent blocks. - MultiblockInWorldPreviewRenderer.renderInWorldPreview(event.getPoseStack(), event.getCamera(), - event.getPartialTick()); + MultiblockInWorldPreviewRenderer.renderInWorldPreview(poseStack, camera, partialTick); + + BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, + poseStack, event.getProjectionMatrix(), event.getFrustum(), partialTick, camera.getEntity()); + } + } + + @SubscribeEvent + public static void onRenderTick(TickEvent.RenderTickEvent event) { + if (event.phase == TickEvent.Phase.START && Minecraft.getInstance().level != null) { + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } } 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 3255548bacb..edb71db40c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -31,7 +31,6 @@ public class GTRenderTypes extends RenderType { DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 131072, false, false, RenderType.CompositeState.builder() .setCullState(RenderStateShard.NO_CULL) - .setOutputState(BLOOM_TARGET) .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java index 0a2f211d9cd..25cd8171f58 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java @@ -41,11 +41,19 @@ public FusionReactorRenderer(ResourceLocation baseCasing, ResourceLocation worka public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, int combinedLight, int combinedOverlay) { if (blockEntity instanceof IMachineBlockEntity machineBlockEntity && - machineBlockEntity.getMetaMachine() instanceof FusionReactorMachine machine && - !machine.isRegisteredBloomTicket()) { - machine.setRegisteredBloomTicket(true); - BloomEffectUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), - new FusionBloomEffect(machine), blockEntity); + machineBlockEntity.getMetaMachine() instanceof FusionReactorMachine machine) { + if (!machine.isRegisteredBloomTicket()) { + machine.setRegisteredBloomTicket(true); + BloomEffectUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), + new FusionBloomEffect(machine), blockEntity); + } + // TODO fix bloom on fusion reactor light + stack.pushPose(); + // offset back by machine pos to render ring at machine in renderLightRing, sorry for this + BlockPos pos = machine.getPos(); + stack.translate(-pos.getX(), -pos.getY(), -pos.getZ()); + renderLightRing(machine, partialTicks, stack, buffer.getBuffer(GTRenderTypes.getLightRing()), 0, 0, 0); + stack.popPose(); } } @@ -56,7 +64,7 @@ private static BloomType getBloomType() { @OnlyIn(Dist.CLIENT) private void renderLightRing(FusionReactorMachine machine, float partialTicks, PoseStack stack, - VertexConsumer buffer, @NotNull EffectRenderContext context) { + VertexConsumer buffer, float camX, float camY, float camZ) { var color = machine.getColor(); if (color == -1) return; int ringColor = ColorUtils.blendColor(color, -1, Eases.EaseQuadIn.getInterpolation( @@ -72,9 +80,9 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P float g = ColorUtils.green(ringColor); float b = ColorUtils.blue(ringColor); RenderBufferHelper.renderRing(stack, buffer, - pos.getX() + relativeBack.getStepX() * 7 + 0.5F, - pos.getY() + relativeBack.getStepY() * 7 + 0.5F, - pos.getZ() + relativeBack.getStepZ() * 7 + 0.5F, + pos.getX() - camX + relativeBack.getStepX() * 7 + 0.5F, + pos.getY() - camY + relativeBack.getStepY() * 7 + 0.5F, + pos.getZ() - camZ + relativeBack.getStepZ() * 7 + 0.5F, 6, 0.2F, 10, 20, r, g, b, a, axis); } @@ -110,7 +118,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild @NotNull EffectRenderContext context) { lightRingBuffer.begin(GTRenderTypes.getLightRing().mode(), GTRenderTypes.getLightRing().format()); FusionReactorRenderer.this.renderLightRing(machine, context.partialTicks(), poseStack, lightRingBuffer, - context); + (float) context.cameraX(), (float) context.cameraY(), (float) context.cameraZ()); BufferUploader.drawWithShader(lightRingBuffer.end()); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index bc886e21ad0..6484796b6a4 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -13,7 +13,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; -import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.PostPass; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.BlockPos; @@ -351,24 +350,20 @@ public static void removeBloomChunk(BlockPos origin) { } public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { - BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); - if (builder == null) { - builder = new BufferBuilder(GTRenderTypes.getBloom().bufferSize()); - GTShaders.BLOOM_BUFFER_BUILDERS.put(pos, builder); - builder.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); - } else if (!builder.building()) { + BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.computeIfAbsent(pos, + $ -> new BufferBuilder(GTRenderTypes.getBloom().bufferSize())); + if (!builder.building()) { builder.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); } return builder; } - public static void bakeBloomChunkBuffers(Set list) { + public static void bakeBloomChunkBuffers(Set list) { if (!GTShaders.allowedShader() || list.isEmpty()) { return; } - for (var chunk : list) { - BlockPos pos = chunk.chunk.getOrigin(); + for (var pos : list) { BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); if (builder == null || !builder.building()) { continue; @@ -376,8 +371,17 @@ public static void bakeBloomChunkBuffers(Set list BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); if (buffer != null) { GTShaders.RENDERED_BLOOM_BUFFERS.put(pos, buffer); - BloomEffectUtil.uploadBloomBuffer(buffer, - GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, c -> new VertexBuffer(VertexBuffer.Usage.STATIC))); + if (RenderSystem.isOnRenderThread()) { + VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, + $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); + BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); + } else { + RenderSystem.recordRenderCall(() -> { + VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, + $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); + BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); + }); + } } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index e6900129f82..d398068eaa8 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -34,6 +34,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.*; +import java.util.stream.Collectors; @Mixin(LevelRenderer.class) @OnlyIn(Dist.CLIENT) @@ -106,35 +107,14 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo throw new AssertionError(); } - @Shadow - public abstract Frustum getFrustum(); - - @Inject(method = "renderLevel", at = @At("HEAD")) - private void gtceu$startBloomBuffer(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, - GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, - CallbackInfo ci) { - GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); - minecraft.getMainRenderTarget().bindWrite(false); - } - - @Inject(method = "renderLevel", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/renderer/DimensionSpecialEffects;constantAmbientLight()Z")) - private void gtceu$injectRenderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci) { - BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, - poseStack, projectionMatrix, getFrustum(), partialTick, camera.getEntity()); - } - @Inject(method = "updateRenderChunks", at = @At("HEAD")) private void gtceu$compileBloomBuffers(LinkedHashSet chunkInfos, LevelRenderer.RenderInfoMap infoMap, Vec3 viewVector, Queue infoQueue, boolean shouldCull, CallbackInfo ci) { - BloomEffectUtil.bakeBloomChunkBuffers(chunkInfos); + BloomEffectUtil.bakeBloomChunkBuffers(chunkInfos.stream() + .map(info -> info.chunk.getOrigin()) + .collect(Collectors.toSet())); } @Inject(method = "resize", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java new file mode 100644 index 00000000000..2f9cf1b9857 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -0,0 +1,84 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import com.gregtechceu.gtceu.client.model.GTMetadataSection; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; + +import net.caffeinemc.mods.sodium.api.util.ColorARGB; +import net.caffeinemc.mods.sodium.api.util.NormI8; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.world.phys.Vec3; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; +import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; +import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadOrientation; +import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; +import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; +import me.jellysquid.mods.sodium.client.util.ModelQuadUtil; +import org.embeddedt.embeddium.render.chunk.ChunkColorWriter; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = BlockRenderer.class, remap = false) +public class BlockRendererMixin { + + @Shadow + private boolean useReorienting; + + @Shadow + @Final + private ChunkVertexEncoder.Vertex[] vertices; + + @Shadow + @Final + private ChunkColorWriter colorEncoder; + + @WrapOperation(method = "renderQuadList", + at = @At(value = "INVOKE", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) + private void gtceu$captureBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder builder, + Vec3 offset, Material material, BakedQuadView quad, + int[] colors, QuadLightData light, Operation original) { + BlockPos chunkOrigin = SectionPos.of(ctx.pos()).origin(); + // Check if quad is full brightness OR we have bloom enabled for the quad + // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though + if (GTShaders.allowedShader() && (!quad.hasShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + ModelQuadOrientation orientation = this.useReorienting ? + ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; + for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { + int srcIndex = orientation.getVertexIndex(dstIndex); + int color = this.colorEncoder.writeColor( + ModelQuadUtil.mixARGBColors(colors[srcIndex], quad.getColor(srcIndex)), light.br[srcIndex]); + float u = quad.getTexU(srcIndex); + float v = quad.getTexV(srcIndex); + int lightUv = ModelQuadUtil.mergeBakedLight(quad.getLight(srcIndex), light.lm[srcIndex]); + int normal = quad.getForgeNormal(dstIndex); + + BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin) + .vertex(ctx.origin().x() + quad.getX(srcIndex) + (float) offset.x(), + ctx.origin().y() + quad.getY(srcIndex) + (float) offset.y(), + ctx.origin().z() + quad.getZ(srcIndex) + (float) offset.z(), + ColorARGB.unpackRed(color) * 255.0f, + ColorARGB.unpackGreen(color) * 255.0f, + ColorARGB.unpackBlue(color) * 255.0f, + ColorARGB.unpackAlpha(color) * 255.0f, + u, v, + OverlayTexture.NO_OVERLAY, + lightUv, + NormI8.unpackX(normal), + NormI8.unpackY(normal), + NormI8.unpackZ(normal)); + } + } + original.call(instance, ctx, builder, offset, material, quad, colors, light); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java new file mode 100644 index 00000000000..67ce8db3850 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java @@ -0,0 +1,30 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = RenderSection.class, remap = false) +public class RenderSectionMixin { + + + @Shadow @Final private int chunkX; + + @Shadow @Final private int chunkY; + + @Shadow @Final private int chunkZ; + + @Inject(method = "delete", at = @At("HEAD")) + private void gtceu$resetBloomBuffers(CallbackInfo ci) { + BlockPos origin = SectionPos.of(this.chunkX, this.chunkY, this.chunkZ).origin(); + BloomEffectUtil.removeBloomChunk(origin); + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java new file mode 100644 index 00000000000..185238ad760 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -0,0 +1,15 @@ +package com.gregtechceu.gtceu.integration.embeddium; + +import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; + +import net.minecraftforge.eventbus.api.SubscribeEvent; + +import org.embeddedt.embeddium.api.ChunkMeshEvent; + +public class GTEmbeddiumCompat { + + @SubscribeEvent + public static void registerExtraChunkMeshers(ChunkMeshEvent event) { + event.addMeshAppender(BloomMeshAppender.INSTANCE); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java new file mode 100644 index 00000000000..688fac31814 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -0,0 +1,21 @@ +package com.gregtechceu.gtceu.integration.embeddium.renderer; + +import com.gregtechceu.gtceu.client.util.BloomEffectUtil; + +import net.minecraft.core.BlockPos; + +import org.embeddedt.embeddium.api.MeshAppender; + +import java.util.Set; + +public class BloomMeshAppender implements MeshAppender { + + public static BloomMeshAppender INSTANCE = new BloomMeshAppender(); + + @Override + public void render(Context context) { + BlockPos chunkOrigin = context.sectionOrigin().origin(); + BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); + BloomEffectUtil.bakeBloomChunkBuffers(Set.of(chunkOrigin)); + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 56420dc1b3c..c206483d6c2 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -62,6 +62,8 @@ "ae2.GenericStackInvAccessor", "create.RotationPropagatorMixin", "embeddium.BiomeColorCacheMixin", + "embeddium.BlockRendererMixin", + "embeddium.RenderSectionMixin", "embeddium.VanillaColorAdapterMixin", "emi.FluidEmiStackMixin", "jei.FluidHelperMixin", From 0d2248072345ddbf20937df3b6eaeb8c70dec47e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:53:01 +0300 Subject: [PATCH 015/269] yoo it work --- dependencies.gradle | 1 - .../java/com/gregtechceu/gtceu/GTCEu.java | 9 ----- .../com/gregtechceu/gtceu/api/GTValues.java | 16 -------- .../gtceu/client/renderer/GTRenderTypes.java | 5 +-- .../gtceu/client/util/BloomEffectUtil.java | 37 ++++++++---------- .../gtceu/core/mixins/LevelRendererMixin.java | 23 ++++++----- .../mixins/embeddium/RenderSectionMixin.java | 18 ++++++--- .../embeddium/renderer/BloomMeshAppender.java | 5 +-- .../overlay_front.png | Bin 5718 -> 0 bytes .../overlay_front_active.png | Bin 10058 -> 0 bytes .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png | Bin 312 -> 0 bytes .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_emissive.png | Bin 219 -> 0 bytes .../overlay_front_paused.png | Bin 571 -> 0 bytes .../overlay_front_paused_emissive.png | Bin 569 -> 0 bytes .../processing_array/overlay_front.png | Bin 5718 -> 0 bytes .../processing_array/overlay_front_active.png | Bin 10058 -> 0 bytes .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png | Bin 312 -> 0 bytes .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_emissive.png | Bin 219 -> 0 bytes .../processing_array/overlay_front_paused.png | Bin 571 -> 0 bytes .../overlay_front_paused_emissive.png | Bin 569 -> 0 bytes 24 files changed, 45 insertions(+), 109 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused_emissive.png diff --git a/dependencies.gradle b/dependencies.gradle index 8b5417a8810..27ae9dc4c4a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -57,7 +57,6 @@ dependencies { jarJar(forge.configuration) // Shimmer - modCompileOnly(forge.shimmer.forge) { transitive = false } modImplementation("maven.modrinth:embeddium:0.3.31+mc1.20.1") modCompileOnly("maven.modrinth:oculus:1.20.1-1.7.0") diff --git a/src/main/java/com/gregtechceu/gtceu/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index fae55bce278..67b298b4b09 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -11,7 +11,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import org.slf4j.Logger; @@ -78,10 +77,6 @@ public static boolean isCuriosLoaded() { return LDLib.isModLoaded(GTValues.MODID_CURIOS); } - public static boolean isShimmerLoaded() { - return LDLib.isModLoaded(GTValues.MODID_SHIMMER); - } - public static boolean isJAVDLoaded() { return LDLib.isModLoaded(GTValues.MODID_JAVD); } @@ -94,10 +89,6 @@ public static boolean isArgonautsLoaded() { return LDLib.isModLoaded(GTValues.MODID_ARGONAUTS); } - public static boolean isOptifineLoaded() { - return ModList.get().isLoaded(GTValues.MODID_OPTIFINE); - } - @Deprecated(forRemoval = true, since = "1.0.21") public static boolean isHighTier() { return GTCEuAPI.isHighTier(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index 78a2657f373..8417849df74 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -42,12 +42,6 @@ public class GTValues { public static final int L = 144; public static final RandomSource RNG = RandomSource.createThreadSafe(); - /** - * The Item WildCard Tag. Even shorter than the "-1" of the past - */ - - // public static final short W = OreDictionary.WILDCARD_VALUE; - /** Current time on the Client. Will always be zero on the server. */ public static long CLIENT_TIME = 0; @@ -116,15 +110,10 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { MODID_KUBEJS = "kubejs", MODID_IRIS = "iris", MODID_OCULUS = "oculus", - MODID_SODIUM = "sodium", - MODID_RUBIDIUM = "rubidium", MODID_EMBEDDIUM = "embeddium", MODID_CREATE = "create", - MODID_REBORN_ENERGY = "team_reborn_energy", - MODID_ALMOSTUNIFIED = "almostunified", MODID_CURIOS = "curios", MODID_AE2WTLIB = "ae2wtlib", - MODID_SHIMMER = "shimmer", MODID_JAVD = "javd", MODID_FTBTEAMS = "ftbteams", MODID_ARGONAUTS = "argonauts", @@ -227,11 +216,6 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { "Ultra High Voltage", "Ultra Excessive Voltage", "Ultra Immense Voltage", "Ultra Extreme Voltage", "Overpowered Voltage", "Maximum Voltage" }; - /** - * Used to tell if any high-tier machine (UHV+) was registered. - */ - public static boolean HT = false; - public static Supplier FOOLS = () -> { String[] yearMonthDay = LocalDate.now().toString().split("-"); return yearMonthDay[1].equals("04") && yearMonthDay[2].equals("01"); 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 edb71db40c6..3ea8e1a1edb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -39,9 +39,8 @@ public class GTRenderTypes extends RenderType { 2097152, false, false, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) - .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_SHADER) - .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) - .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) + .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) + .setTextureState(RenderStateShard.BLOCK_SHEET) .setOutputState(BLOOM_TARGET) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 6484796b6a4..482a77b8725 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.client.util; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.IRenderSetup; @@ -173,7 +172,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { - if (GTCEu.isIrisOculusLoaded()) return BloomRenderTicket.INVALID; + if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.lock(); try { @@ -358,30 +357,28 @@ public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { return builder; } - public static void bakeBloomChunkBuffers(Set list) { - if (!GTShaders.allowedShader() || list.isEmpty()) { + public static void bakeBloomChunkBuffers(BlockPos pos) { + if (!GTShaders.allowedShader()) { return; } - for (var pos : list) { - BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); - if (builder == null || !builder.building()) { - continue; - } - BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); - if (buffer != null) { - GTShaders.RENDERED_BLOOM_BUFFERS.put(pos, buffer); - if (RenderSystem.isOnRenderThread()) { + BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); + if (builder == null || !builder.building()) { + return; + } + BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); + if (buffer != null) { + GTShaders.RENDERED_BLOOM_BUFFERS.put(pos, buffer); + if (RenderSystem.isOnRenderThread()) { + VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, + $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); + BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); + } else { + RenderSystem.recordRenderCall(() -> { VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); - } else { - RenderSystem.recordRenderCall(() -> { - VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, - $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); - }); - } + }); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java index d398068eaa8..9926fa2a478 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java @@ -9,7 +9,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; import net.minecraft.server.level.BlockDestructionProgress; @@ -22,8 +21,11 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; @@ -34,7 +36,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.*; -import java.util.stream.Collectors; @Mixin(LevelRenderer.class) @OnlyIn(Dist.CLIENT) @@ -107,14 +108,16 @@ private static void renderShape(PoseStack poseStack, VertexConsumer consumer, Vo throw new AssertionError(); } - @Inject(method = "updateRenderChunks", at = @At("HEAD")) - private void gtceu$compileBloomBuffers(LinkedHashSet chunkInfos, - LevelRenderer.RenderInfoMap infoMap, Vec3 viewVector, - Queue infoQueue, boolean shouldCull, - CallbackInfo ci) { - BloomEffectUtil.bakeBloomChunkBuffers(chunkInfos.stream() - .map(info -> info.chunk.getOrigin()) - .collect(Collectors.toSet())); + @WrapOperation(method = "applyFrustum", + at = @At(value = "INVOKE", + target = "Lit/unimi/dsi/fastutil/objects/ObjectArrayList;add(Ljava/lang/Object;)Z", + remap = false)) + private boolean gtceu$compileBloomBuffers(ObjectArrayList instance, + Object chunkInfo, + Operation original) { + // cast back to RenderChunkInfo + BloomEffectUtil.bakeBloomChunkBuffers(((LevelRenderer.RenderChunkInfo) chunkInfo).chunk.getOrigin()); + return original.call(instance, chunkInfo); } @Inject(method = "resize", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java index 67ce8db3850..dade0f496ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java @@ -1,9 +1,11 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; + import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; + +import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,17 +16,21 @@ @Mixin(value = RenderSection.class, remap = false) public class RenderSectionMixin { + @Shadow + @Final + private int chunkX; - @Shadow @Final private int chunkX; - - @Shadow @Final private int chunkY; + @Shadow + @Final + private int chunkY; - @Shadow @Final private int chunkZ; + @Shadow + @Final + private int chunkZ; @Inject(method = "delete", at = @At("HEAD")) private void gtceu$resetBloomBuffers(CallbackInfo ci) { BlockPos origin = SectionPos.of(this.chunkX, this.chunkY, this.chunkZ).origin(); BloomEffectUtil.removeBloomChunk(origin); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 688fac31814..97efb331aca 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -6,8 +6,6 @@ import org.embeddedt.embeddium.api.MeshAppender; -import java.util.Set; - public class BloomMeshAppender implements MeshAppender { public static BloomMeshAppender INSTANCE = new BloomMeshAppender(); @@ -15,7 +13,6 @@ public class BloomMeshAppender implements MeshAppender { @Override public void render(Context context) { BlockPos chunkOrigin = context.sectionOrigin().origin(); - BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); - BloomEffectUtil.bakeBloomChunkBuffers(Set.of(chunkOrigin)); + BloomEffectUtil.bakeBloomChunkBuffers(chunkOrigin); } } diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front.png b/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front.png deleted file mode 100644 index 729e656da0188cc3dcbf8dc0590175a2636a4972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5718 zcmeH~dpuO>AIFCxxs^*QQq$-nHTPjI48{=3wM3Y3%$zY3b1^f_ps`YHuBl&9Dwo>Y z%`Ndti(*k*Otvkgh*pYj>r%_6rG95dwe|Y#KfPYR{jYhw&YW|e=li_B-|y%7p68q= z&Bx1CPuo-*27~FjyE$)x&I^@?mL~MS;?+9<2Ga*)#ztXj2JcY4^^UfocuDSErbt~o0nxT|$3o)hueM^{K)0&W!woG-%_*k62%KJb;}C)GnqhdVPX}!!1B~; z@9gltIgexDQ@=Yjkb8`3)Arrs^!oN>FFU8!qyI7}S8v_3SB9HHZ^rr?c6Z+h_E?n6MGT3eBcG&b?xk5j7$ai+<(^)R|@U|L*tmkHyrA(pfB(OKU!w3&GSlB6fK)el=4w9Xe9UgYSQ zJ4t2^Xwx!O?GWO1X;F7^o?wHd{aD3QD;JOZTDcy=jj}!MmuAwQ2fH#oT8-|>u4(@$ z+hmMcBYvg7excLg6SoRj;qw`MTuhix1;%v)rnib=TwGp$)hyRdd=~ zs}Xj6x0>1Y`5IMiWzPGUa~+muBMzqOSi%kXj;;MGgAZBUtR2t34Jw*T&8&5t_vv`i zJVi?xamF@JT;+RHt4QMrL+90-4lZMi(VVnQ+2e|5ouwR~t{>dRl3T86D|cqDIdjBl z?Y9pt*RArzo<4+M(>`{5JT{f~OG?K22DkYxn>U<&q&?*qdOEelIzN9W|2~6$f>X@R zKwh|imcFS^`m{K5KXt+meqkVW1+Mv516R{2cGiuP6N-uFWw(GV^qDio{bd8&x(1Wk zyT|bi7`KPdWWfQ_-~>*qffe=M@e$HjI5E?o>Rr zYSoFO&9nvNfl|{%;>ZCzWNSdLJbR76dq8HTFuDq+wm3GVs@wiB*45q7!O#mp1$*T_ zi}vZotv_2+QfhR}H`uc1R_SWq$Wml_pk~gim&ON7^0xY2Tr&{1E@F2@Y2&b6NaKQ7 z!Djd6+`2UtLPzm}e1|&6jO$0h5auZ3MoM5#jeno^{-GlCv(`4Tx;`-xFZ-Lbj=Y9X zHbv>)UG9K*t0}Zknu6IFoe!-P?lrAlIgBnfsefGeB7CR$VNea_U%$WDLBlMmJ>W{> zoJmVF9Vacx_UC+~uygw7hq)vA+j@fR;?+{_N>Rr8yF*Hos;irWa_wKv4R8BJa_HhY z^_){KBd!G(7#%|77k-*(2C+L)*8EJzKxCVnuOuzj-f zH|KA0<@0v+>M|GKlJcvUGd2j^8WAhZ$mI;hj>@AKD}gJ|D)sv<xBs=jn{hWzI6$yQjQqg{)n1rf5=iyuT8mOr#Cb<-Xvj~}5eUX}Q$ z?!`;9;i{Izf~D4?d*p|f=Y2-PYcm3``lNloZ!o>Yx4~hwsyQyBI;gaIk~*c+;=+qd zdrtWFz|ZO?E1i-uDJ4HNIVJmN85;%mc*nhFW{0lI^Qf>|LLNG=w&>vCymxyZ^yQy! zoljhMTs;|GGlNy%8@t=TrKWK|uRcb7Zo%&L<%176>K%pO5h+2_T1)O~qAG0jFU@0& z!06s}EVpdqqNnJ?Nq^$soKas`tMSIaufOLnk{l-L+%}|1BF){XICObve58M*|1Gs+ zWOUv!qUd7Di)kM8Ml|I@Z@%rG9u%g4hXPoFa1bTq386P53})vb69UXgPy!DJBe;Aj zVzj;y0q3%)hyZI(jHi$ea=32sB5-TGmmf1el1XME9PG92WE2R%10?`l#*5;MDKaWT z#ic;k%4ReIt}>BCQW4udec*I~2!s<*1QZ78BICy55cb+|I}wXb+2XwMJp#I;A~+I> zkb*`_rBaj>j}nL?&{#5=jK<*5I2;nPK#Jq|5F$sn4n86$d_1rig0!J^!Z3orWC>D2~|l!;(g|f#r$X|j1fhtY*|X8|)t>D1ksicrQ&VF{RA7DaVQ zAhQ4_NMa%JI6MJK0LU05fWzA$+0Z=*kg#kliTnx5oiCOEd?u(wL2wio;;;!=5{X45 zAqfN`gdkyvNB|p-Ly|~DA`!Gu_XBD_Uhs49V|Poq+zSP;q@a>*hB;Yf10G8!8w zkZ>FeMB+%+Y>W+_fXCU)qLlMMq4~H|5jYe^6`!ibCkl|T1tK05;lbs{$o}r|$)&_^eSd*=>1n6u-#Q$yN4~oQ4!6}(o3<^h3^{|+fjSvxl3Wv)BB0#i|AED|{ zP74J}1`-xf)+t0*wL`g3=pqo12t&N~H#;eATrp%3r>yw*HNO>% zp1qrW1fsaAE;w9OwiJLl>qHF1f-IFIXxwZUlLPQ0K5;QfwTxHQz#p#fK=JQEmaz?`#csY z2UH4(!C{dYYb4Ib4~wT@tSMLm5<{e5FbMSfgwe{U`a{Nc=>O5gPG#`PG60R6ZG)B< zXthFrT&~`0rj+qt{Jo!xf6)Vk{_5n5^!+N=SGm4OfiE)tT3uh|`XU9s$oOk@{omx$ z{(Hj%@}aLFDYTu5{KM*JXe*={zS-4TwJCy4(d)l~uI3Bf0>vb_ zxO=+Hd#qt?2H>c~*ci)TI2ivXD>|Uo8XOxqY zWxPBoTVavJS*U?{gnd$!W^C%LgVgJEyX!XDM)fLz-v}B9<$c9z&a_j<$H%vY5KLG&pQh_qRCIL{OF@@G36( z=S|gm$GVB*@=&~2zO8iBcZ12jdvW#wVeFI=(c{d@Zqru-!s{dZvFjCZ#48@KWJ|ff zk;#kyzzkNdSnp}z?`L3h=BRQ@3*Vsxx(c369Q~pNmQ|Hx4p$DjO0HGe!)}%(|~Hckols zX(e^$)~LOner?e4^w2r)1@5O!DmP?Qnj6;8gUas|B1vARiYi0BmH{mVZV7X!?Ig$X ea>(Mh8Lu_CDdkV`gh`pQ0Nh=?oGYBdlK%_h_Tn1= diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active.png b/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active.png deleted file mode 100644 index cad1bcaa2bb1df1a41c393c86b0c3c2682ec45b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10058 zcmeHsXH=6}*LJ9(BUQRIrAQzNB@n6*dXX+gfe->jI)vV&7paO0BGROa^dh}U8>&c` zB1M{10i}s=aOQbtW_|CUS?hcMP1d?|-}l+qx%S@I+2^dBlNencRZ21zG5`QTsji05 z$K9{sE-(o(?wiT-^bP>P;OJ*)g4IWQbGo{_*kT;foLFC1G$+~zV+#QI%)EJyac7fy z6!CMJ-h&X3a3pCmxJvACe!}s{M!k5m7Lv}W$@_#k2JmTkA(Y?yVy(68Oypuk_n~He z?WpGdxw`C;af z_5Q>1md`k-`z?Qpg@Z9Fv0uTf{8gDNs>b;v%aM7?q>uQ;!1boHZ{CdzEU@{I zn<%UDHolw>bwA%twz92T+>#?)kUJw3O1(1{DN1Rivrr!!8h#d^doFQ&_GMVU__bd9 zd2M|~+v1vCbXw=t+HfBK2npeV^YcTq!ZQazZM45Zz_(DcV_Kmo+JN|q$Tm5NO;M)8 z_hN4Pp-CRI1JE0}=Jy@-zORakH#wjZGM_C9ktM$|$rGC+uF<%{dR$Z#lAR1Hc;V3} zUN?KdZ>-;!mtuwp$~Ds#pVW77s+oLWlK0dcQzJg<$13X;#^xc?{B6SjT39-j3P*sS zYde#uPC91Q)HcKEn-t@oDdw}0@x8$}E!_zpC1fi4OB=UadPsr%8Q8A^1uwl$nXeY! zYus2hcW&PPCLL7FIP1{3S6BAaf4swceCc(HaEZLpa&Ao!H4TE#R6N%jLL_Kmga=?Z z5?xT#cwdAqPTNf`?M*hdWv~Mp#gXOHS+^_}cm*5n)HT$nTv&QOTzKLkI2WAbu9J6m z^~st4+(q_%^ZQjz^>?^xvL(h@w|j^R;w23hgCIlg^ILP%-GfmEjRG$+WJGdCi#igr z2fmbUo9tv1xIG@2khn>pgP1nXoa~U@voO(h$`2{+m8Sl27v|Ppuk_63>Q=SIgk(zV zWG1x)>cd)Xm50n)IFel>_nE^zgD{;^$D^%sQ_aLJyf^(S&!X%!`&Big0_tb`tXRGL9c?0$pj9r*`uQ3%;!;GKwk#hsX7=_ z)~ZQwRc&O?OV2VNksV~!a25JyR(z>Xx?(6lL>NOOq-;4dr;)e?y(RcoHWx|$Ta0F% z>)O!Q9fp3j5|#tkDb%J}Psv!K?{0<*3&|jJ6MIKVt*}WEsJc<`j+xi94wW562lF1+ zkm2NyZzIy*8k(JP(swG;Q;I_^#LZe8~doz{5UV2Vj?>GSeotUBgk5Qp? zz3*0bE=zA1(=zo&e|wsdhUw9-VVsyMOJQV6NEaORbC=tmvECeb3=usZUK|VZ2L=cM zAL!`1IN4o+`{t?-4tx5RjY7b=;PLm1*w-!&zuj%j2M&7eHo~lOp-wLXCDt{Z9FIv( zj`AAb3xn#fEQs;j3D(}($?4UC_0$TkJ7vWR?pEEW|Cjq<7#Wz9I?-FZyxhg1RM_d;%s?jJ_Tl_d1$YK z(-n?4tO!~U-c^8vz3+qv8<(EGs$i&6;(IVL6a#i(%d$0%?rxbAUv02TZcSF%04j=L zEORH5Zm_MxZ>u=f-E}Tg)vZe%G7&0&I+xhS9`WTlnCC%+7lji2EK|wbV?2QftIE1< zcdIG!C49oWA&@6$+r6^ZM`%|_ahYmYY)X-<_HzPL__z@gu*J9lWK*hGumsVWb7zLFu`b*s+c~4RM z%EA1Vm1izWK_QI3);;Sz+Gdz3lrgXEqXJEWVFb_U4Paq0RS60Bj`r@WWPrvi%uI$Z z|J!EzDysQMqS|W2v5FZqy{0U@j2&4AJ@byDGm>eLnC0ZV?Q>i4?Sch#0Vk4ysz9u! z=7BsA__&flG_^#zY(G2B7w@@bZa1$Ct4gC6Mam3GNLP{*_F;FO?&J*lV?_fdv#qy1 zI=Kj?XBH<{j1A?%A1axrnZSdL!mLvG*TsxAT=>dErrrVd)EI`G<=6M>+1LiHH4-N{ zgTo>`NX04^{O8=wy7zY>{51Z=Zl>YBf`$*1H0r0UZ6(tr$GhbOMgMv>`ubOOD1hGZdxzF3+Qn5jtuH;Tch^IM&f{L>+bVvSKU#26$t=nmL`-;1&@fbfjEx7ddxf#$&t6e* zw$v2tx8W)ck?*(z(*N3H3Z{7{no#knq=sh)YzkaFgr!x>*NmwTECe+KA9b(sIg&nk zM)BcI{@gh?yXD2#@RQ^Oe^+NYebKQNFGpGX^!qFd*b2eaP&|@-L<4r^i?5yl{$v`w zd-_^5tCZk;G@LwOX=rs7--Pto7r~DureqRp>vdiRr;fL&4gi$UMA7Q%r}vy4quF*G z{MoHF`H$CAclxOPB2D86AFeOjD}vyY2}6?j98<3fOj@0>G&i`dGF62MWLpKCWB>ys zzI1mvVJXB2c3rY_k)34$`(6%)D1Vlbr2IBj@W>#L2w8)d<)ckq>hn`f&CXnpWphgd zZ@eLHg4x*-oMsMbM^?14H0k?(!DtFWP>%+&PU*BoIIX+YO`N~4szVc4CIabrkIY} zyA_38%0LKQ*pIgJ2}9UE3iov#(_WXrSDAQytr9~>Yg!*k2TW~LZ8M)$LG-t`o<1Ou zt|?R}D^6I*W+F}^j>W)bU)wdCIwPEohC%9lyo`<;Uhsa?pooaH+}2d(h-IE{BtI*` zSs{-!X+pN=n}&&>ghx>Ik}h+08WL^02$ICKBywjVrCnLdSt*S_lP29Yx%S}za1ZU0 z+;<%awHUJ&eN(Gd=F9oLmSGdm;vEbw=RK3M6KYn0A-SE@JqccP=6_=IF8I}6OxycX zjFe4<$;?5thst}h|$SC_4wf&#@$I!-e zz2}dKBxUBCd6MNduQHIumfN9T8Hxy)IYxM9nXn5rGHpG|FE1Bir_bjI(^1TtK?NzA zv2J&&Vmt6kDDXDU!)9!AKG~Q9&Paz4GWQr)-d|Lu`}n^~{HEme2_Qy`J{l(>CRA0R zZoj?PieSCZjURo}!YOSE{l0qWAX-6pna}2ea^EngLL-4S_uK?t{3;t+#qm{ z7JC@`Bd5F2q%+N`=CowdtGWj}lej$RZZPKM*~G}0%0Ht(d0(yLL0>i=!R^`t&^H2v z_HWln%pdO|3}4vrSc#XragBPp0cB~U4`=kXgt6{ZnVoc_!K;}juZ>u;BVJq^6`#Is zlDygDbkpidMH-g6uZ4$Lcv$IzuSuwTTMz?`7KAH?%})xoO4Y=>3(>`?NMj27G`~ES^hp z98?e3(-_Q>wN)L3oF`Dnd?Cog1{ zaoHa-`urVPv}S4T(_=P2pBx!L`ZkGyW9(70*=_l&zBGd&s0O^!zI9$uy#bv6WA641 zIz*87M+5sX{*iCgDwrWzl4Cwq<{_caoaLj+D%R6E+xU&i`ACwuZ_*U0J9J)}rjKA& z+HFzmU^aoGMN<7^!?MEC!q;}Bj;6YI8(41;WvLgi!&#KR@FP_)@Ij5zNDF(a@<42L zL6Ryt!JDiLDLr9!VkAvENqfKzcKAKMZN>>o?d)m9rU7CU1P!JY5)7@BUkm@-5vfQP z!Wq%7m9&+WYjT5aWvW3-e)&q|>9BWS_0R*AQ4CRhD03?7OYYe(y>XBSi>YohydnJ! z;kiR2SrpE3o^2gAiS36Y+?8Cb4CB)Wql%CXpXlzJgp@K6Qhc-AH-@^wcdvhR^l4q* z_4ET!ycVp{eC~&c{QjV(5uZ}x#fyEJ6&KpuygHK=1A;#_Uu5Hf7r{!`N4#g{*29I} z+ZT9p;ae>5KIWe`&U3BeHS(*BQh{H=V{^N=K0zu!_h{Tiv?t}fl-PgJ`JucCpOw3heUj8S_5?Zz$3Dh9aaES2 zsb=|Nk)06Bb4!Bg>Z7zZ;@+ur%7ls}rq2}L!i{&7&bu`0j|t^Ag-Fd~;2%g#f~h|n zCe4P$U44*6PGUH~Y@TS4o&DJ&|DrFd-|JPgvR8D$*`sorq%l93D&czFF2{kW+~hbc zE?)A=(^{>!mHCgR+OK_HGf!8J=!}*&A+1%Yvwcg9TGUv$Hmm`Ac z+rtS$6iU92{IqyLvKXWw;dRA;Y6~Ex6{ad<8bWBd=~+l=oS#5d=fy!z?_~qEx>BGS zz;nmjr!9u0m}9pj(GPi)y>g(_e&l*HT&WI0pD@07O}{?;ZOp-at|jf6(KKuMYf>{` z1Gi|syQn*F=kq;JbSt(Z%)RZ zPYsx&T-KwI$b3{nZm%j!nM}QN&k1%U=CCBHzLDvpv$adYNi>l?s{FC^W%kpuMDd_S z)Tv?7tF+A9Qq>H+O^IAVaOSZDLK#UN=t#^`GI3Xq9bKT^Z9~OV;PM^)=o&7SCxaHn zd@m*`DOSVUpZRa`B~h2J9eRuwaM>^I=Fq5L`OO-EadcNb1s)3vi?WZO;8m?-gA0nT zC(|E_eO6Bxz9syrZAF=H8_s3J8(;&OO0?Z9y&L`!(aWqx$xg9O%9&1e)r#k9NZQ^P zKCU^svYlH^zzLI7s=65`5I3#8{8k+{H2IJMFeBHPd~Vvc7D8xqmDI3)<2+qRtu`&X zU)F|0fdX~gT~?32;6c2#oe2+sd*kRVfp&k!ZwTyJ+7^!OrMRkl<>X~+!fY$m>^;N4 z$NI!1PrO>J%y~(X3On(OSz{%+ZU`E3A~g5gR6A^C*_t%xHPs`mRwE`y3%`Gsc04yD ziT*ihtE=bP>9lfSG!Zha%g!?DfTO?9HtJh_WD~)?Tfw@U(qU(B=Q6NQe@yBz``96a zr9P|u-u`YdtEV=3hMTq#?#XA ze*4iasW>$&wyJ?Gb@}`#@er6vw+O)1|0e*jDxgO#J@O&px4W{uZQS_vvFmgbT+%Do zq7n(l$Ch(D0OikaPFbD{wL3ly&$iebm*x!~tup}ecI6v?RGaRDA2o>ci$DIRDWDhC z;p$~hHdatk898e~Tv~5&-8+?T7%wDwC4Byc=T>+_MQE*Dm%JonetH4Hp#phX+`WPt znD`NUpy~bEud*;A9}SuycZ&Fz7|o0mCTzC?KPW?WWA`c1okcsy*s-`vS+BI-24%P7 z{E6OZw%dYV1H+esi4Tn*4%Z(&AOPK|VQt~c8>U)py}_B0k-WMF37KDt54GYu*686! zjxu#_tn7()lwEyJRUG4c*q+{%o^mdOO?0@$m`Ftws~4EBGvZjGWu@ME&mjEw#HA0k1mpA1v99Y6p8UN}ZcNmpG-=|AVLxYO1bfyuIJoeFGS zmgbtug52AjU0h0@m7IcIdarfE$+C^@$JhF~`&Mo!rX_njFmQnS>Bba9FUJ<^waD*QcKAN5GJ9S1P4G({|2D*e0(cy|Y& zbi2VuErC93L*&VW@1m#q_*d$QPL1d0XU-%80q$c)tHhF$gev_h&8z!6^E>kwvLAMK zf$1>!y5g;KC*1is3kG)%ZlbLPN4Yo&BW+x)(ZW7XuDEk@06<3G#}$ckKw~+r(RLVT zS?=A&R&Gv=jV$*aac!`+s}kBCqvq$1Ht^FiMEN2N&JzqA9aC82GU>#(+O|*46m0aA>oMOUa!eEfH55^11El0*F<8EUM*GH)Q zL4kXd<+jISUEv}k-rnBA-lD=T?sg&&DJdxtFjNEz1>q1N4_{|2(g)=1!E;IRI|l;o zfpW*VVlghxoR^$PYZp(fEH^jK&iSACoLsfF|4Z-e@rMdHJw$wvt|Aa&u!xhB$X|PS zV3oaaB!2|-zxMDj#QmKhqL21)@pMO_mA%l;Sf0O9sH$u0{+Ho0B|D6h>#wA6;{DB; z4eGx*S5J4xUl<#d2-*?tgd_F9#RvHt9*eR4Q>?$mc4_&Q&R+w;x%)5w-_ZZb{TCRA z($ayHWVep?Vx{gS!t&6*pEVmZM+0*AwgCWKVZGc5yiUyH@Lc!uv;-XLq zF)0`r@+Zg`?e2jqxJyn5SQsky%VL9qtKb-sxWd6WA??s2uFiJ9441|#of@w#Zi{~GFHw@%3tNpDf9cFs9`*C2;a+!|D)y&&~CrK{XPX8 zF~3ZloWIHzjzs*ZP!Jdf2ZOmq{zzEla#sH*V;PbEM-!P}fWIsQxPHI4 z;g%QNY9;dDZ)ey0RWKGUS4>k zb3y00Mj%#QTN(J7h=rbrlT)Ne8UVmAQb*h}RO{JJ8Frw%Mc*SY+Ndru7yrgcj}W6w zRKXrhKO^Y3w>kb(K~^9(hh%B`wW>%gUvu#%?OXet(eit$lN=1ex}p>okmi0GhvSMv@(M!&#VqEK=RTfE#91=06AczI$IKye}{p+=E%RFAXP$l7;Ee}OaJ8}Wd` zrER7y`jRZUps)~1CKT@-4^wsu+7qi23j)OCGyUsZt(Hh?5>p0HZ_@j+n(q57*1+_+zEw1gaO^D%KmqNfI8vk<)!fl zAEJ1uI2L--cxn=AEH2uknUfX!RP90;gDgrWSyv9E?oM`@J)C&XUks6zeZ%OPL<_!i zgfYFA5*9sjKTkfK-n`BkHP>+DxX|)gUtqm9X>~$Z+AWix+{gWp$@J;|`Iz0;6Sjn9 z-6G>c!<#AnpBK!hWT3)DjjBY-g2hW&q6`mR_kZour&i>JML4ANAUm z;b)ZXX!k%|&#bF+f$TE)_#l#U2fO>_ z%)r1c48n{Iv*t(u1=&kHeO=j~F>wiNasSVKxd|wA)YHW=#N+teDI2*C8A!C~Z#;V; zP2lCc@&bXHpo8Tb&MRzfZl0Wf;poAY&3tQb6>G41u1t^#IiqXe@>~DEuKb7eTMY_7 zeyHU72V`|Q1*UcFZD4M=^Xc|HHMS#i3tq|_#GVy6Dp<5;K1++b;T46IY8MvDt=r*y zyY5?!=Sw3+2AOic(|3c!FP)XYRN;8&^k;^KGa^r2cYkhRlbG8$Tbn;4tI+jr<%i0R zpJG1PEYJ{X4%+?MLBzqhzM1{)^{vkjPA@q4hgtmH-tEm_ZsqhI2YQIX)78&qol`;+ E07zAP)c^nh diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876f..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_emissive.png b/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_emissive.png deleted file mode 100644 index 0486a073200cbdd7ea5c25aafd12fc79ca526154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4rY@E?b97f^(=z$3Dl zfq`2Xgc%uT&5-~KvX^-Jy0SlG;u6*t|5VEak-aXL9cB67j%)vy2G+gtr# zx!Z7|w$+g{U;Z;HKmOnBz2*cGYtUs6IsB5tmtv$2ox8374fE;efhhAutrfPV*`zXICH;OXk; Jvd$@?2>^hePFw&0 diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused.png b/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused.png deleted file mode 100644 index 901e9e1e126f760029b545ab5778d0651e726e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571 zcmV-B0>u4^P)6FA;xuGr6h*vv+++Sof$dE=yinxj zlX#WqdCCt$IzQWdX?Lr8Vxn& zKx>Wf2Pmb`S|cJ12E*S%isj{#q{mrpS_=gda1ZHwCc1^};btTP^u*}3(NbUKA$ z7<6_!bap$m+wDI`u&fM*VN3zSaDZWGwAP6;-w&wQ>x%!PegX1csdutq75e}H002ov JPDHLkV1kRp^iu!; diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused_emissive.png b/src/main/resources/assets/gtceu/textures/block/multiblock/advanced_processing_array/overlay_front_paused_emissive.png deleted file mode 100644 index f18b9aa38996663d172c29d334a3e325a2dc0d2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmV-90>=G`P)6FbX(FBmV#Z0mey0 zK~y-)&5}QF(@+$}fA85zY~mJ*K#CZmq+Kc$r+`EPl!<-=R+vCt5CftUGeaj9R2C|x zsuB}?0$5={MTwOGAqoT*Kp~aV#CHDpG8l)32#F2u^3HoY=iGCo2mg9h0!pP4j*|so zI2>Y{CIH=T56|;Be+FzT=K2A=*om>37&uOrdacGnJ^&yD-oDSUbb1Nbb+Ijv$M=!r zM`7jauf<~n5n&-8u(^)R=V7-At9L@Bl*02oE?tPpCtML+}(goD#lX= zT5EPcXIZ(@9mjjuv?$Mk>$;4L4A?nRjzjqE4e&bFCFCfIc(&D**&_uu*O9|>MV@a5 z0^oTbeh||B-cp~MAJt$mobFPsR#>hUc=GU=Ts&9g>nmirTA)%n3&bf7p5x>PFHawQ zkb93Db^BUJF5fJwwd?z$wf?(*;JPl^>>)%15g`%wdOqoN3ez-+q6n=uoz6auMq@I8 z)*9arP)eb-MnvfM2S1Gzi;E}8QT7Rx!Ss4t&m>`5AIFCxxs^*QQq$-nHTPjI48{=3wM3Y3%$zY3b1^f_ps`YHuBl&9Dwo>Y z%`Ndti(*k*Otvkgh*pYj>r%_6rG95dwe|Y#KfPYR{jYhw&YW|e=li_B-|y%7p68q= z&Bx1CPuo-*27~FjyE$)x&I^@?mL~MS;?+9<2Ga*)#ztXj2JcY4^^UfocuDSErbt~o0nxT|$3o)hueM^{K)0&W!woG-%_*k62%KJb;}C)GnqhdVPX}!!1B~; z@9gltIgexDQ@=Yjkb8`3)Arrs^!oN>FFU8!qyI7}S8v_3SB9HHZ^rr?c6Z+h_E?n6MGT3eBcG&b?xk5j7$ai+<(^)R|@U|L*tmkHyrA(pfB(OKU!w3&GSlB6fK)el=4w9Xe9UgYSQ zJ4t2^Xwx!O?GWO1X;F7^o?wHd{aD3QD;JOZTDcy=jj}!MmuAwQ2fH#oT8-|>u4(@$ z+hmMcBYvg7excLg6SoRj;qw`MTuhix1;%v)rnib=TwGp$)hyRdd=~ zs}Xj6x0>1Y`5IMiWzPGUa~+muBMzqOSi%kXj;;MGgAZBUtR2t34Jw*T&8&5t_vv`i zJVi?xamF@JT;+RHt4QMrL+90-4lZMi(VVnQ+2e|5ouwR~t{>dRl3T86D|cqDIdjBl z?Y9pt*RArzo<4+M(>`{5JT{f~OG?K22DkYxn>U<&q&?*qdOEelIzN9W|2~6$f>X@R zKwh|imcFS^`m{K5KXt+meqkVW1+Mv516R{2cGiuP6N-uFWw(GV^qDio{bd8&x(1Wk zyT|bi7`KPdWWfQ_-~>*qffe=M@e$HjI5E?o>Rr zYSoFO&9nvNfl|{%;>ZCzWNSdLJbR76dq8HTFuDq+wm3GVs@wiB*45q7!O#mp1$*T_ zi}vZotv_2+QfhR}H`uc1R_SWq$Wml_pk~gim&ON7^0xY2Tr&{1E@F2@Y2&b6NaKQ7 z!Djd6+`2UtLPzm}e1|&6jO$0h5auZ3MoM5#jeno^{-GlCv(`4Tx;`-xFZ-Lbj=Y9X zHbv>)UG9K*t0}Zknu6IFoe!-P?lrAlIgBnfsefGeB7CR$VNea_U%$WDLBlMmJ>W{> zoJmVF9Vacx_UC+~uygw7hq)vA+j@fR;?+{_N>Rr8yF*Hos;irWa_wKv4R8BJa_HhY z^_){KBd!G(7#%|77k-*(2C+L)*8EJzKxCVnuOuzj-f zH|KA0<@0v+>M|GKlJcvUGd2j^8WAhZ$mI;hj>@AKD}gJ|D)sv<xBs=jn{hWzI6$yQjQqg{)n1rf5=iyuT8mOr#Cb<-Xvj~}5eUX}Q$ z?!`;9;i{Izf~D4?d*p|f=Y2-PYcm3``lNloZ!o>Yx4~hwsyQyBI;gaIk~*c+;=+qd zdrtWFz|ZO?E1i-uDJ4HNIVJmN85;%mc*nhFW{0lI^Qf>|LLNG=w&>vCymxyZ^yQy! zoljhMTs;|GGlNy%8@t=TrKWK|uRcb7Zo%&L<%176>K%pO5h+2_T1)O~qAG0jFU@0& z!06s}EVpdqqNnJ?Nq^$soKas`tMSIaufOLnk{l-L+%}|1BF){XICObve58M*|1Gs+ zWOUv!qUd7Di)kM8Ml|I@Z@%rG9u%g4hXPoFa1bTq386P53})vb69UXgPy!DJBe;Aj zVzj;y0q3%)hyZI(jHi$ea=32sB5-TGmmf1el1XME9PG92WE2R%10?`l#*5;MDKaWT z#ic;k%4ReIt}>BCQW4udec*I~2!s<*1QZ78BICy55cb+|I}wXb+2XwMJp#I;A~+I> zkb*`_rBaj>j}nL?&{#5=jK<*5I2;nPK#Jq|5F$sn4n86$d_1rig0!J^!Z3orWC>D2~|l!;(g|f#r$X|j1fhtY*|X8|)t>D1ksicrQ&VF{RA7DaVQ zAhQ4_NMa%JI6MJK0LU05fWzA$+0Z=*kg#kliTnx5oiCOEd?u(wL2wio;;;!=5{X45 zAqfN`gdkyvNB|p-Ly|~DA`!Gu_XBD_Uhs49V|Poq+zSP;q@a>*hB;Yf10G8!8w zkZ>FeMB+%+Y>W+_fXCU)qLlMMq4~H|5jYe^6`!ibCkl|T1tK05;lbs{$o}r|$)&_^eSd*=>1n6u-#Q$yN4~oQ4!6}(o3<^h3^{|+fjSvxl3Wv)BB0#i|AED|{ zP74J}1`-xf)+t0*wL`g3=pqo12t&N~H#;eATrp%3r>yw*HNO>% zp1qrW1fsaAE;w9OwiJLl>qHF1f-IFIXxwZUlLPQ0K5;QfwTxHQz#p#fK=JQEmaz?`#csY z2UH4(!C{dYYb4Ib4~wT@tSMLm5<{e5FbMSfgwe{U`a{Nc=>O5gPG#`PG60R6ZG)B< zXthFrT&~`0rj+qt{Jo!xf6)Vk{_5n5^!+N=SGm4OfiE)tT3uh|`XU9s$oOk@{omx$ z{(Hj%@}aLFDYTu5{KM*JXe*={zS-4TwJCy4(d)l~uI3Bf0>vb_ zxO=+Hd#qt?2H>c~*ci)TI2ivXD>|Uo8XOxqY zWxPBoTVavJS*U?{gnd$!W^C%LgVgJEyX!XDM)fLz-v}B9<$c9z&a_j<$H%vY5KLG&pQh_qRCIL{OF@@G36( z=S|gm$GVB*@=&~2zO8iBcZ12jdvW#wVeFI=(c{d@Zqru-!s{dZvFjCZ#48@KWJ|ff zk;#kyzzkNdSnp}z?`L3h=BRQ@3*Vsxx(c369Q~pNmQ|Hx4p$DjO0HGe!)}%(|~Hckols zX(e^$)~LOner?e4^w2r)1@5O!DmP?Qnj6;8gUas|B1vARiYi0BmH{mVZV7X!?Ig$X ea>(Mh8Lu_CDdkV`gh`pQ0Nh=?oGYBdlK%_h_Tn1= diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active.png b/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active.png deleted file mode 100644 index cad1bcaa2bb1df1a41c393c86b0c3c2682ec45b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10058 zcmeHsXH=6}*LJ9(BUQRIrAQzNB@n6*dXX+gfe->jI)vV&7paO0BGROa^dh}U8>&c` zB1M{10i}s=aOQbtW_|CUS?hcMP1d?|-}l+qx%S@I+2^dBlNencRZ21zG5`QTsji05 z$K9{sE-(o(?wiT-^bP>P;OJ*)g4IWQbGo{_*kT;foLFC1G$+~zV+#QI%)EJyac7fy z6!CMJ-h&X3a3pCmxJvACe!}s{M!k5m7Lv}W$@_#k2JmTkA(Y?yVy(68Oypuk_n~He z?WpGdxw`C;af z_5Q>1md`k-`z?Qpg@Z9Fv0uTf{8gDNs>b;v%aM7?q>uQ;!1boHZ{CdzEU@{I zn<%UDHolw>bwA%twz92T+>#?)kUJw3O1(1{DN1Rivrr!!8h#d^doFQ&_GMVU__bd9 zd2M|~+v1vCbXw=t+HfBK2npeV^YcTq!ZQazZM45Zz_(DcV_Kmo+JN|q$Tm5NO;M)8 z_hN4Pp-CRI1JE0}=Jy@-zORakH#wjZGM_C9ktM$|$rGC+uF<%{dR$Z#lAR1Hc;V3} zUN?KdZ>-;!mtuwp$~Ds#pVW77s+oLWlK0dcQzJg<$13X;#^xc?{B6SjT39-j3P*sS zYde#uPC91Q)HcKEn-t@oDdw}0@x8$}E!_zpC1fi4OB=UadPsr%8Q8A^1uwl$nXeY! zYus2hcW&PPCLL7FIP1{3S6BAaf4swceCc(HaEZLpa&Ao!H4TE#R6N%jLL_Kmga=?Z z5?xT#cwdAqPTNf`?M*hdWv~Mp#gXOHS+^_}cm*5n)HT$nTv&QOTzKLkI2WAbu9J6m z^~st4+(q_%^ZQjz^>?^xvL(h@w|j^R;w23hgCIlg^ILP%-GfmEjRG$+WJGdCi#igr z2fmbUo9tv1xIG@2khn>pgP1nXoa~U@voO(h$`2{+m8Sl27v|Ppuk_63>Q=SIgk(zV zWG1x)>cd)Xm50n)IFel>_nE^zgD{;^$D^%sQ_aLJyf^(S&!X%!`&Big0_tb`tXRGL9c?0$pj9r*`uQ3%;!;GKwk#hsX7=_ z)~ZQwRc&O?OV2VNksV~!a25JyR(z>Xx?(6lL>NOOq-;4dr;)e?y(RcoHWx|$Ta0F% z>)O!Q9fp3j5|#tkDb%J}Psv!K?{0<*3&|jJ6MIKVt*}WEsJc<`j+xi94wW562lF1+ zkm2NyZzIy*8k(JP(swG;Q;I_^#LZe8~doz{5UV2Vj?>GSeotUBgk5Qp? zz3*0bE=zA1(=zo&e|wsdhUw9-VVsyMOJQV6NEaORbC=tmvECeb3=usZUK|VZ2L=cM zAL!`1IN4o+`{t?-4tx5RjY7b=;PLm1*w-!&zuj%j2M&7eHo~lOp-wLXCDt{Z9FIv( zj`AAb3xn#fEQs;j3D(}($?4UC_0$TkJ7vWR?pEEW|Cjq<7#Wz9I?-FZyxhg1RM_d;%s?jJ_Tl_d1$YK z(-n?4tO!~U-c^8vz3+qv8<(EGs$i&6;(IVL6a#i(%d$0%?rxbAUv02TZcSF%04j=L zEORH5Zm_MxZ>u=f-E}Tg)vZe%G7&0&I+xhS9`WTlnCC%+7lji2EK|wbV?2QftIE1< zcdIG!C49oWA&@6$+r6^ZM`%|_ahYmYY)X-<_HzPL__z@gu*J9lWK*hGumsVWb7zLFu`b*s+c~4RM z%EA1Vm1izWK_QI3);;Sz+Gdz3lrgXEqXJEWVFb_U4Paq0RS60Bj`r@WWPrvi%uI$Z z|J!EzDysQMqS|W2v5FZqy{0U@j2&4AJ@byDGm>eLnC0ZV?Q>i4?Sch#0Vk4ysz9u! z=7BsA__&flG_^#zY(G2B7w@@bZa1$Ct4gC6Mam3GNLP{*_F;FO?&J*lV?_fdv#qy1 zI=Kj?XBH<{j1A?%A1axrnZSdL!mLvG*TsxAT=>dErrrVd)EI`G<=6M>+1LiHH4-N{ zgTo>`NX04^{O8=wy7zY>{51Z=Zl>YBf`$*1H0r0UZ6(tr$GhbOMgMv>`ubOOD1hGZdxzF3+Qn5jtuH;Tch^IM&f{L>+bVvSKU#26$t=nmL`-;1&@fbfjEx7ddxf#$&t6e* zw$v2tx8W)ck?*(z(*N3H3Z{7{no#knq=sh)YzkaFgr!x>*NmwTECe+KA9b(sIg&nk zM)BcI{@gh?yXD2#@RQ^Oe^+NYebKQNFGpGX^!qFd*b2eaP&|@-L<4r^i?5yl{$v`w zd-_^5tCZk;G@LwOX=rs7--Pto7r~DureqRp>vdiRr;fL&4gi$UMA7Q%r}vy4quF*G z{MoHF`H$CAclxOPB2D86AFeOjD}vyY2}6?j98<3fOj@0>G&i`dGF62MWLpKCWB>ys zzI1mvVJXB2c3rY_k)34$`(6%)D1Vlbr2IBj@W>#L2w8)d<)ckq>hn`f&CXnpWphgd zZ@eLHg4x*-oMsMbM^?14H0k?(!DtFWP>%+&PU*BoIIX+YO`N~4szVc4CIabrkIY} zyA_38%0LKQ*pIgJ2}9UE3iov#(_WXrSDAQytr9~>Yg!*k2TW~LZ8M)$LG-t`o<1Ou zt|?R}D^6I*W+F}^j>W)bU)wdCIwPEohC%9lyo`<;Uhsa?pooaH+}2d(h-IE{BtI*` zSs{-!X+pN=n}&&>ghx>Ik}h+08WL^02$ICKBywjVrCnLdSt*S_lP29Yx%S}za1ZU0 z+;<%awHUJ&eN(Gd=F9oLmSGdm;vEbw=RK3M6KYn0A-SE@JqccP=6_=IF8I}6OxycX zjFe4<$;?5thst}h|$SC_4wf&#@$I!-e zz2}dKBxUBCd6MNduQHIumfN9T8Hxy)IYxM9nXn5rGHpG|FE1Bir_bjI(^1TtK?NzA zv2J&&Vmt6kDDXDU!)9!AKG~Q9&Paz4GWQr)-d|Lu`}n^~{HEme2_Qy`J{l(>CRA0R zZoj?PieSCZjURo}!YOSE{l0qWAX-6pna}2ea^EngLL-4S_uK?t{3;t+#qm{ z7JC@`Bd5F2q%+N`=CowdtGWj}lej$RZZPKM*~G}0%0Ht(d0(yLL0>i=!R^`t&^H2v z_HWln%pdO|3}4vrSc#XragBPp0cB~U4`=kXgt6{ZnVoc_!K;}juZ>u;BVJq^6`#Is zlDygDbkpidMH-g6uZ4$Lcv$IzuSuwTTMz?`7KAH?%})xoO4Y=>3(>`?NMj27G`~ES^hp z98?e3(-_Q>wN)L3oF`Dnd?Cog1{ zaoHa-`urVPv}S4T(_=P2pBx!L`ZkGyW9(70*=_l&zBGd&s0O^!zI9$uy#bv6WA641 zIz*87M+5sX{*iCgDwrWzl4Cwq<{_caoaLj+D%R6E+xU&i`ACwuZ_*U0J9J)}rjKA& z+HFzmU^aoGMN<7^!?MEC!q;}Bj;6YI8(41;WvLgi!&#KR@FP_)@Ij5zNDF(a@<42L zL6Ryt!JDiLDLr9!VkAvENqfKzcKAKMZN>>o?d)m9rU7CU1P!JY5)7@BUkm@-5vfQP z!Wq%7m9&+WYjT5aWvW3-e)&q|>9BWS_0R*AQ4CRhD03?7OYYe(y>XBSi>YohydnJ! z;kiR2SrpE3o^2gAiS36Y+?8Cb4CB)Wql%CXpXlzJgp@K6Qhc-AH-@^wcdvhR^l4q* z_4ET!ycVp{eC~&c{QjV(5uZ}x#fyEJ6&KpuygHK=1A;#_Uu5Hf7r{!`N4#g{*29I} z+ZT9p;ae>5KIWe`&U3BeHS(*BQh{H=V{^N=K0zu!_h{Tiv?t}fl-PgJ`JucCpOw3heUj8S_5?Zz$3Dh9aaES2 zsb=|Nk)06Bb4!Bg>Z7zZ;@+ur%7ls}rq2}L!i{&7&bu`0j|t^Ag-Fd~;2%g#f~h|n zCe4P$U44*6PGUH~Y@TS4o&DJ&|DrFd-|JPgvR8D$*`sorq%l93D&czFF2{kW+~hbc zE?)A=(^{>!mHCgR+OK_HGf!8J=!}*&A+1%Yvwcg9TGUv$Hmm`Ac z+rtS$6iU92{IqyLvKXWw;dRA;Y6~Ex6{ad<8bWBd=~+l=oS#5d=fy!z?_~qEx>BGS zz;nmjr!9u0m}9pj(GPi)y>g(_e&l*HT&WI0pD@07O}{?;ZOp-at|jf6(KKuMYf>{` z1Gi|syQn*F=kq;JbSt(Z%)RZ zPYsx&T-KwI$b3{nZm%j!nM}QN&k1%U=CCBHzLDvpv$adYNi>l?s{FC^W%kpuMDd_S z)Tv?7tF+A9Qq>H+O^IAVaOSZDLK#UN=t#^`GI3Xq9bKT^Z9~OV;PM^)=o&7SCxaHn zd@m*`DOSVUpZRa`B~h2J9eRuwaM>^I=Fq5L`OO-EadcNb1s)3vi?WZO;8m?-gA0nT zC(|E_eO6Bxz9syrZAF=H8_s3J8(;&OO0?Z9y&L`!(aWqx$xg9O%9&1e)r#k9NZQ^P zKCU^svYlH^zzLI7s=65`5I3#8{8k+{H2IJMFeBHPd~Vvc7D8xqmDI3)<2+qRtu`&X zU)F|0fdX~gT~?32;6c2#oe2+sd*kRVfp&k!ZwTyJ+7^!OrMRkl<>X~+!fY$m>^;N4 z$NI!1PrO>J%y~(X3On(OSz{%+ZU`E3A~g5gR6A^C*_t%xHPs`mRwE`y3%`Gsc04yD ziT*ihtE=bP>9lfSG!Zha%g!?DfTO?9HtJh_WD~)?Tfw@U(qU(B=Q6NQe@yBz``96a zr9P|u-u`YdtEV=3hMTq#?#XA ze*4iasW>$&wyJ?Gb@}`#@er6vw+O)1|0e*jDxgO#J@O&px4W{uZQS_vvFmgbT+%Do zq7n(l$Ch(D0OikaPFbD{wL3ly&$iebm*x!~tup}ecI6v?RGaRDA2o>ci$DIRDWDhC z;p$~hHdatk898e~Tv~5&-8+?T7%wDwC4Byc=T>+_MQE*Dm%JonetH4Hp#phX+`WPt znD`NUpy~bEud*;A9}SuycZ&Fz7|o0mCTzC?KPW?WWA`c1okcsy*s-`vS+BI-24%P7 z{E6OZw%dYV1H+esi4Tn*4%Z(&AOPK|VQt~c8>U)py}_B0k-WMF37KDt54GYu*686! zjxu#_tn7()lwEyJRUG4c*q+{%o^mdOO?0@$m`Ftws~4EBGvZjGWu@ME&mjEw#HA0k1mpA1v99Y6p8UN}ZcNmpG-=|AVLxYO1bfyuIJoeFGS zmgbtug52AjU0h0@m7IcIdarfE$+C^@$JhF~`&Mo!rX_njFmQnS>Bba9FUJ<^waD*QcKAN5GJ9S1P4G({|2D*e0(cy|Y& zbi2VuErC93L*&VW@1m#q_*d$QPL1d0XU-%80q$c)tHhF$gev_h&8z!6^E>kwvLAMK zf$1>!y5g;KC*1is3kG)%ZlbLPN4Yo&BW+x)(ZW7XuDEk@06<3G#}$ckKw~+r(RLVT zS?=A&R&Gv=jV$*aac!`+s}kBCqvq$1Ht^FiMEN2N&JzqA9aC82GU>#(+O|*46m0aA>oMOUa!eEfH55^11El0*F<8EUM*GH)Q zL4kXd<+jISUEv}k-rnBA-lD=T?sg&&DJdxtFjNEz1>q1N4_{|2(g)=1!E;IRI|l;o zfpW*VVlghxoR^$PYZp(fEH^jK&iSACoLsfF|4Z-e@rMdHJw$wvt|Aa&u!xhB$X|PS zV3oaaB!2|-zxMDj#QmKhqL21)@pMO_mA%l;Sf0O9sH$u0{+Ho0B|D6h>#wA6;{DB; z4eGx*S5J4xUl<#d2-*?tgd_F9#RvHt9*eR4Q>?$mc4_&Q&R+w;x%)5w-_ZZb{TCRA z($ayHWVep?Vx{gS!t&6*pEVmZM+0*AwgCWKVZGc5yiUyH@Lc!uv;-XLq zF)0`r@+Zg`?e2jqxJyn5SQsky%VL9qtKb-sxWd6WA??s2uFiJ9441|#of@w#Zi{~GFHw@%3tNpDf9cFs9`*C2;a+!|D)y&&~CrK{XPX8 zF~3ZloWIHzjzs*ZP!Jdf2ZOmq{zzEla#sH*V;PbEM-!P}fWIsQxPHI4 z;g%QNY9;dDZ)ey0RWKGUS4>k zb3y00Mj%#QTN(J7h=rbrlT)Ne8UVmAQb*h}RO{JJ8Frw%Mc*SY+Ndru7yrgcj}W6w zRKXrhKO^Y3w>kb(K~^9(hh%B`wW>%gUvu#%?OXet(eit$lN=1ex}p>okmi0GhvSMv@(M!&#VqEK=RTfE#91=06AczI$IKye}{p+=E%RFAXP$l7;Ee}OaJ8}Wd` zrER7y`jRZUps)~1CKT@-4^wsu+7qi23j)OCGyUsZt(Hh?5>p0HZ_@j+n(q57*1+_+zEw1gaO^D%KmqNfI8vk<)!fl zAEJ1uI2L--cxn=AEH2uknUfX!RP90;gDgrWSyv9E?oM`@J)C&XUks6zeZ%OPL<_!i zgfYFA5*9sjKTkfK-n`BkHP>+DxX|)gUtqm9X>~$Z+AWix+{gWp$@J;|`Iz0;6Sjn9 z-6G>c!<#AnpBK!hWT3)DjjBY-g2hW&q6`mR_kZour&i>JML4ANAUm z;b)ZXX!k%|&#bF+f$TE)_#l#U2fO>_ z%)r1c48n{Iv*t(u1=&kHeO=j~F>wiNasSVKxd|wA)YHW=#N+teDI2*C8A!C~Z#;V; zP2lCc@&bXHpo8Tb&MRzfZl0Wf;poAY&3tQb6>G41u1t^#IiqXe@>~DEuKb7eTMY_7 zeyHU72V`|Q1*UcFZD4M=^Xc|HHMS#i3tq|_#GVy6Dp<5;K1++b;T46IY8MvDt=r*y zyY5?!=Sw3+2AOic(|3c!FP)XYRN;8&^k;^KGa^r2cYkhRlbG8$Tbn;4tI+jr<%i0R zpJG1PEYJ{X4%+?MLBzqhzM1{)^{vkjPA@q4hgtmH-tEm_ZsqhI2YQIX)78&qol`;+ E07zAP)c^nh diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876f..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_emissive.png b/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_emissive.png deleted file mode 100644 index 0486a073200cbdd7ea5c25aafd12fc79ca526154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4rY@E?b97f^(=z$3Dl zfq`2Xgc%uT&5-~KvX^-Jy0SlG;u6*t|5VEak-aXL9cB67j%)vy2G+gtr# zx!Z7|w$+g{U;Z;HKmOnBz2*cGYtUs6IsB5tmtv$2ox8374fE;efhhAutrfPV*`zXICH;OXk; Jvd$@?2>^hePFw&0 diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused.png b/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused.png deleted file mode 100644 index 901e9e1e126f760029b545ab5778d0651e726e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571 zcmV-B0>u4^P)6FA;xuGr6h*vv+++Sof$dE=yinxj zlX#WqdCCt$IzQWdX?Lr8Vxn& zKx>Wf2Pmb`S|cJ12E*S%isj{#q{mrpS_=gda1ZHwCc1^};btTP^u*}3(NbUKA$ z7<6_!bap$m+wDI`u&fM*VN3zSaDZWGwAP6;-w&wQ>x%!PegX1csdutq75e}H002ov JPDHLkV1kRp^iu!; diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused_emissive.png b/src/main/resources/assets/gtceu/textures/block/multiblock/processing_array/overlay_front_paused_emissive.png deleted file mode 100644 index f18b9aa38996663d172c29d334a3e325a2dc0d2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmV-90>=G`P)6FbX(FBmV#Z0mey0 zK~y-)&5}QF(@+$}fA85zY~mJ*K#CZmq+Kc$r+`EPl!<-=R+vCt5CftUGeaj9R2C|x zsuB}?0$5={MTwOGAqoT*Kp~aV#CHDpG8l)32#F2u^3HoY=iGCo2mg9h0!pP4j*|so zI2>Y{CIH=T56|;Be+FzT=K2A=*om>37&uOrdacGnJ^&yD-oDSUbb1Nbb+Ijv$M=!r zM`7jauf<~n5n&-8u(^)R=V7-At9L@Bl*02oE?tPpCtML+}(goD#lX= zT5EPcXIZ(@9mjjuv?$Mk>$;4L4A?nRjzjqE4e&bFCFCfIc(&D**&_uu*O9|>MV@a5 z0^oTbeh||B-cp~MAJt$mobFPsR#>hUc=GU=Ts&9g>nmirTA)%n3&bf7p5x>PFHawQ zkb93Db^BUJF5fJwwd?z$wf?(*;JPl^>>)%15g`%wdOqoN3ez-+q6n=uoz6auMq@I8 z)*9arP)eb-MnvfM2S1Gzi;E}8QT7Rx!Ss4t&m>`5 Date: Thu, 10 Oct 2024 13:42:09 +0300 Subject: [PATCH 016/269] it's done. will have to ask embeddium ppl for extra api to capture the bloom quads tho --- .../gregtechceu/gtceu/client/model/GTMetadataSection.java | 3 +-- .../gregtechceu/gtceu/client/renderer/GTRenderTypes.java | 5 +++-- .../java/com/gregtechceu/gtceu/common/data/GTModels.java | 6 ++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java index 887ebd0adc8..7bc37d9ed16 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java @@ -50,8 +50,7 @@ public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { return sprite; } - public static class Serializer - implements MetadataSectionSerializer { + public static class Serializer implements MetadataSectionSerializer { static GTMetadataSection.Serializer INSTANCE = new GTMetadataSection.Serializer(); 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 3ea8e1a1edb..edb71db40c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -39,8 +39,9 @@ public class GTRenderTypes extends RenderType { 2097152, false, false, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) - .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) - .setTextureState(RenderStateShard.BLOCK_SHEET) + .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_SHADER) + .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) + .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) .setOutputState(BLOOM_TARGET) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java index c500a9dc93d..49cd4899488 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java @@ -245,8 +245,7 @@ public static NonNullBiConsumer, RegistrateBloc ModelFile inactive = prov.models().cubeAll(name, coilType.getTexture()); ModelFile active = prov.models().withExistingParent(name + "_active", GTCEu.id("block/cube_2_layer/all")) .texture("bot_all", coilType.getTexture()) - .texture("top_all", coilType.getTexture().withSuffix("_bloom")) - .renderType(GTCEu.id("bloom")); + .texture("top_all", coilType.getTexture().withSuffix("_bloom")); prov.getVariantBuilder(block) .partialState().with(ActiveBlock.ACTIVE, false).modelForState().modelFile(inactive).addModel() .partialState().with(ActiveBlock.ACTIVE, true).modelForState().modelFile(active).addModel(); @@ -303,8 +302,7 @@ public static NonNullBiConsumer, RegistrateBl ModelFile active = prov.models().withExistingParent(name + "_active", GTCEu.id("block/fire_box_active")) .texture("side", type.side()) .texture("bottom", type.bottom()) - .texture("top", type.top()) - .renderType(GTCEu.id("bloom")); + .texture("top", type.top()); prov.getVariantBuilder(block) .partialState().with(ActiveBlock.ACTIVE, false).modelForState().modelFile(inactive).addModel() .partialState().with(ActiveBlock.ACTIVE, true).modelForState().modelFile(active).addModel(); From cf72496cae7ec9e84bb05ac835f1c6f46a998503 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 11 Oct 2024 20:14:23 +0300 Subject: [PATCH 017/269] datagen --- .../assets/gtceu/models/block/cupronickel_coil_block_active.json | 1 - .../assets/gtceu/models/block/hssg_coil_block_active.json | 1 - .../assets/gtceu/models/block/kanthal_coil_block_active.json | 1 - .../assets/gtceu/models/block/naquadah_coil_block_active.json | 1 - .../assets/gtceu/models/block/nichrome_coil_block_active.json | 1 - .../assets/gtceu/models/block/rtm_alloy_coil_block_active.json | 1 - .../assets/gtceu/models/block/trinium_coil_block_active.json | 1 - .../assets/gtceu/models/block/tritanium_coil_block_active.json | 1 - 8 files changed, 8 deletions(-) diff --git a/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json index a78e9f7909f..7fda089ccb8 100644 --- a/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/cupronickel_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_cupronickel", "top_all": "gtceu:block/casings/coils/machine_coil_cupronickel_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json index 6a221f09243..41edb518870 100644 --- a/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/hssg_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_hssg", "top_all": "gtceu:block/casings/coils/machine_coil_hssg_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json index 4de0b658fcd..e52f55e6460 100644 --- a/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/kanthal_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_kanthal", "top_all": "gtceu:block/casings/coils/machine_coil_kanthal_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json index 2cda617d69d..953c619e1ab 100644 --- a/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/naquadah_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_naquadah", "top_all": "gtceu:block/casings/coils/machine_coil_naquadah_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json index 6f676e9d050..792d1d73024 100644 --- a/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/nichrome_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_nichrome", "top_all": "gtceu:block/casings/coils/machine_coil_nichrome_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json index 75e25d1bf20..23c85ffe103 100644 --- a/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/rtm_alloy_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_rtm_alloy", "top_all": "gtceu:block/casings/coils/machine_coil_rtm_alloy_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json index 018e0f519f7..3d730a8dc4b 100644 --- a/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/trinium_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_trinium", "top_all": "gtceu:block/casings/coils/machine_coil_trinium_bloom" diff --git a/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json b/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json index 9bc69bc77c8..c4c5f476247 100644 --- a/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json +++ b/src/generated/resources/assets/gtceu/models/block/tritanium_coil_block_active.json @@ -1,6 +1,5 @@ { "parent": "gtceu:block/cube_2_layer/all", - "render_type": "gtceu:bloom", "textures": { "bot_all": "gtceu:block/casings/coils/machine_coil_tritanium", "top_all": "gtceu:block/casings/coils/machine_coil_tritanium_bloom" From 5b22258ddfd907e7ee0f2553fc542157c537f6bc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Oct 2024 14:02:42 +0300 Subject: [PATCH 018/269] remove leftover RenderDoc run config --- gradle/scripts/moddevgradle.gradle | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index e0ed2ffa138..d5c5545250e 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -84,28 +84,3 @@ idea { downloadJavadoc = true } } - -tasks.register("run + RenderDoc", Exec.class) { - var javaHome = org.gradle.internal.jvm.Jvm.current().javaHome - - commandLine = [ - "C:\\Program Files\\RenderDoc\\renderdoccmd.exe", - "capture", - "--opt-api-validation", // Remove if you don't want api validation - "--opt-api-validation-unmute", // Remove if you don't want api validation - "--opt-hook-children", - "--wait-for-exit", - "--working-dir", - ".", - "$javaHome/bin/java.exe", - "-Xmx64m", - "-Xms64m", - //"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005", // Uncomment for remote debug - "-Dorg.gradle.appname=gradlew", - "-Dorg.gradle.java.home=$javaHome", - "-classpath", - "./gradle/wrapper/gradle-wrapper.jar", - "org.gradle.wrapper.GradleWrapperMain", - "runClient", - ] -} From 0dfc5f6691a52821e3f5533fb7667ff461087824 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 20 Oct 2024 18:08:38 +0300 Subject: [PATCH 019/269] why does it render other bloomy things through the bloom... --- .../forge/ForgeClientEventListener.java | 14 ++++--- .../gtceu/client/renderer/GTRenderTypes.java | 3 +- .../gtceu/client/shader/GTShaders.java | 17 +++----- .../gtceu/client/util/BloomEffectUtil.java | 40 ++++++++++--------- .../shaders/program/filter_bloom_color.fsh | 2 +- 5 files changed, 37 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 31d19273f3c..45bb7738001 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -34,14 +34,14 @@ public class ForgeClientEventListener { @SubscribeEvent public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { + Camera camera = event.getCamera(); + PoseStack poseStack = event.getPoseStack(); + float partialTick = event.getPartialTick(); if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) { - Camera camera = event.getCamera(); - PoseStack poseStack = event.getPoseStack(); - float partialTick = event.getPartialTick(); // to render the preview after block entities, before the translucent. so it can be seen through the // transparent blocks. MultiblockInWorldPreviewRenderer.renderInWorldPreview(poseStack, camera, partialTick); - + } else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) { BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, poseStack, event.getProjectionMatrix(), event.getFrustum(), partialTick, camera.getEntity()); } @@ -50,8 +50,10 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { @SubscribeEvent public static void onRenderTick(TickEvent.RenderTickEvent event) { if (event.phase == TickEvent.Phase.START && Minecraft.getInstance().level != null) { - GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + if (GTShaders.allowedShader()) { + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + } } } 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 edb71db40c6..ff2537b0c47 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -39,9 +39,8 @@ public class GTRenderTypes extends RenderType { 2097152, false, false, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) - .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_SHADER) + .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_MIPPED_SHADER) .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) - .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) .setOutputState(BLOOM_TARGET) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 0ec090f8113..37382565079 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @OnlyIn(Dist.CLIENT) public class GTShaders { @@ -32,11 +33,13 @@ public class GTShaders { public static RenderTarget BLOOM_TARGET; public static Map BLOOM_BUFFERS = new HashMap<>(); - public static Map BLOOM_BUFFER_BUILDERS = new HashMap<>(); + public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); public static Map RENDERED_BLOOM_BUFFERS = new HashMap<>(); public static void onRegisterShaders(RegisterShadersEvent event) { - if (!allowedShader()) { + // skip bloom target check here + if (!ConfigHolder.INSTANCE.client.shader.useShader || + GTCEu.isIrisOculusLoaded() && IrisApi.getInstance().isShaderPackInUse()) { return; } @@ -88,15 +91,7 @@ private static void initPostShaders() { } public static boolean allowedShader() { - return ConfigHolder.INSTANCE.client.shader.useShader && + return ConfigHolder.INSTANCE.client.shader.useShader && BLOOM_TARGET != null && !(GTCEu.isIrisOculusLoaded() && IrisApi.getInstance().isShaderPackInUse()); } - - public static float getITime(float pPartialTicks) { - if (mc.level == null) { - return System.currentTimeMillis() % 1200000 / 1000f; - } else { - return ((mc.level.getGameTime() % 24000) + pPartialTicks) / 20f; - } - } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 482a77b8725..3b7c2dbbf10 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -248,6 +248,7 @@ public static void renderBloom(double camX, double camY, double camZ, RenderSystem.depthMask(false); render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); + GTRenderTypes.getBloom().clearRenderState(); return; } @@ -261,8 +262,7 @@ public static void renderBloom(double camX, double camY, double camZ, RenderSystem.depthMask(true); if (!BLOOM_RENDERS.isEmpty()) { - for (var e : BLOOM_RENDERS.entrySet()) { - List list = e.getValue(); + for (List list : BLOOM_RENDERS.values()) { BufferBuilder buffer = Tesselator.getInstance().getBuilder(); draw(poseStack, buffer, context, list); } @@ -396,13 +396,13 @@ public static void bakeBloomChunkBuffers(BlockPos pos) { private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, double camX, double camY, double camZ) { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + //RenderSystem.enableDepthTest(); + //RenderSystem.enableBlend(); + //RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { EffectInstance shader = pass.getEffect(); - shader.safeGetUniform("iTime").set(GTShaders.getITime(partialTicks)); shader.safeGetUniform("EnableFilter").set(BloomEffectUtil.isDrawingBlockBloom.get() ? 1 : 0); if (GTShaders.BLOOM_TYPE == BloomType.UNREAL) { @@ -423,25 +423,27 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro } } - for (var entry : GTShaders.BLOOM_BUFFERS.entrySet()) { - // return early if buffer is invalid or has no vertex data bound - // VertexBuffer#mode's nullness is the easiest way to check this. - if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { - continue; + if (BloomEffectUtil.isDrawingBlockBloom.get()) { + for (var entry : GTShaders.BLOOM_BUFFERS.entrySet()) { + // return early if buffer is invalid or has no vertex data bound + // VertexBuffer#mode's nullness is the easiest way to check this. + if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { + continue; + } + entry.getValue().bind(); + poseStack.pushPose(); + poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); + poseStack.translate(-camX, -camY, -camZ); + entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); + poseStack.popPose(); } - entry.getValue().bind(); - poseStack.pushPose(); - poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); - poseStack.translate(-camX, -camY, -camZ); - entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); - poseStack.popPose(); } GTShaders.BLOOM_CHAIN.process(partialTicks); - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); + //RenderSystem.disableDepthTest(); + //RenderSystem.disableBlend(); + //RenderSystem.defaultBlendFunc(); VertexBuffer.unbind(); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) { 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 3ce28090828..ab141a90e4b 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 @@ -10,7 +10,7 @@ out vec4 fragColor; void main(){ fragColor = texture(DiffuseSampler, texCoord); - if (EnableFilter){ + if (EnableFilter) { vec4 mainColor = texture(MainSampler, texCoord); if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.01){ fragColor = vec4(0.0); From bfb4afe0357cb9f9bb260cc0037657c59534c214 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:27:30 +0300 Subject: [PATCH 020/269] fix number uno: no more locks --- .../gtceu/client/util/BloomEffectUtil.java | 110 ++++++++---------- 1 file changed, 46 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 3b7c2dbbf10..41227b2ad24 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -22,27 +22,24 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; import java.util.function.Supplier; @OnlyIn(Dist.CLIENT) public class BloomEffectUtil { - private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); - private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); - - private static final ReentrantLock BLOOM_RENDER_LOCK = new ReentrantLock(); + private static final Map> BLOOM_RENDERS = new ConcurrentHashMap<>(); + private static final List SCHEDULED_BLOOM_RENDERS = new CopyOnWriteArrayList<>(); /** *

@@ -174,12 +171,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @Nullable Supplier worldContext) { if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); - BLOOM_RENDER_LOCK.lock(); - try { - SCHEDULED_BLOOM_RENDERS.add(ticket); - } finally { - BLOOM_RENDER_LOCK.unlock(); - } + SCHEDULED_BLOOM_RENDERS.add(ticket); return ticket; } @@ -190,23 +182,18 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup */ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { Objects.requireNonNull(level, "level == null"); - BLOOM_RENDER_LOCK.lock(); - try { - for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { - if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { - ticket.invalidate(); - } + for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { + ticket.invalidate(); } + } - for (Map.Entry> e : BLOOM_RENDERS.entrySet()) { - for (BloomRenderTicket ticket : e.getValue()) { - if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { - ticket.invalidate(); - } + for (Map.Entry> e : BLOOM_RENDERS.entrySet()) { + for (BloomRenderTicket ticket : e.getValue()) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { + ticket.invalidate(); } } - } finally { - BLOOM_RENDER_LOCK.unlock(); } } @@ -224,60 +211,55 @@ public static void renderBloom(double camX, double camY, double camZ, } Minecraft.getInstance().getProfiler().popPush("gtceu_block_bloom"); - BLOOM_RENDER_LOCK.lock(); - try { - preDraw(); - - GTShaders.BLOOM_TARGET.bindWrite(false); - - EffectRenderContext context = EffectRenderContext.getInstance() - .update(entity, camX, camY, camZ, frustum, partialTicks); - - GTRenderTypes.getBloom().setupRenderState(); - - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { - RenderSystem.depthMask(true); - - if (!BLOOM_RENDERS.isEmpty()) { - for (List list : BLOOM_RENDERS.values()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - draw(poseStack, buffer, context, list); - } - } - postDraw(); - RenderSystem.depthMask(false); + preDraw(); - render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); - GTRenderTypes.getBloom().clearRenderState(); - return; - } + GTShaders.BLOOM_TARGET.bindWrite(false); - BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; - BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; - BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; - BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; + EffectRenderContext context = EffectRenderContext.getInstance() + .update(entity, camX, camY, camZ, frustum, partialTicks); - // ********** render custom bloom ************ + GTRenderTypes.getBloom().setupRenderState(); + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { RenderSystem.depthMask(true); + if (!BLOOM_RENDERS.isEmpty()) { for (List list : BLOOM_RENDERS.values()) { BufferBuilder buffer = Tesselator.getInstance().getBuilder(); draw(poseStack, buffer, context, list); } } + postDraw(); RenderSystem.depthMask(false); - isDrawingBlockBloom.set(true); render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); - isDrawingBlockBloom.set(false); - - postDraw(); GTRenderTypes.getBloom().clearRenderState(); - } finally { - BLOOM_RENDER_LOCK.unlock(); + return; } + + BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; + BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; + BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; + BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; + + // ********** render custom bloom ************ + + RenderSystem.depthMask(true); + if (!BLOOM_RENDERS.isEmpty()) { + for (List list : BLOOM_RENDERS.values()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + draw(poseStack, buffer, context, list); + } + } + RenderSystem.depthMask(false); + + isDrawingBlockBloom.set(true); + render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); + isDrawingBlockBloom.set(false); + + postDraw(); + GTRenderTypes.getBloom().clearRenderState(); } private static void preDraw() { From bdee0afba4104705009d90ccf67cc69b6e26b5d5 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:34:37 +0300 Subject: [PATCH 021/269] fix number dos: free the buffers LMAO --- .../gtceu/client/util/BloomEffectUtil.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 41227b2ad24..09a67d7c087 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -406,18 +406,26 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro } if (BloomEffectUtil.isDrawingBlockBloom.get()) { - for (var entry : GTShaders.BLOOM_BUFFERS.entrySet()) { + for (var it = GTShaders.BLOOM_BUFFERS.entrySet().iterator(); it.hasNext();) { + var entry = it.next(); // return early if buffer is invalid or has no vertex data bound // VertexBuffer#mode's nullness is the easiest way to check this. - if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { - continue; + try { + if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { + continue; + } + entry.getValue().bind(); + poseStack.pushPose(); + poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); + poseStack.translate(-camX, -camY, -camZ); + entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); + poseStack.popPose(); + } finally { + entry.getValue().close(); + GTShaders.BLOOM_BUFFER_BUILDERS.remove(entry.getKey()); + GTShaders.RENDERED_BLOOM_BUFFERS.remove(entry.getKey()); + it.remove(); } - entry.getValue().bind(); - poseStack.pushPose(); - poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); - poseStack.translate(-camX, -camY, -camZ); - entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); - poseStack.popPose(); } } From 9866a6d39d6f0ca4f3f4ce2586eafc210aff45c3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:34:45 +0300 Subject: [PATCH 022/269] Revert "fix number uno: no more locks" This reverts commit bfb4afe0357cb9f9bb260cc0037657c59534c214. --- .../gtceu/client/util/BloomEffectUtil.java | 109 ++++++++++-------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index 09a67d7c087..f56a81f0f89 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -24,22 +24,24 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Predicate; import java.util.function.Supplier; @OnlyIn(Dist.CLIENT) public class BloomEffectUtil { - private static final Map> BLOOM_RENDERS = new ConcurrentHashMap<>(); - private static final List SCHEDULED_BLOOM_RENDERS = new CopyOnWriteArrayList<>(); + private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); + private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); + + private static final ReentrantLock BLOOM_RENDER_LOCK = new ReentrantLock(); /** *

@@ -171,7 +173,12 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @Nullable Supplier worldContext) { if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); - SCHEDULED_BLOOM_RENDERS.add(ticket); + BLOOM_RENDER_LOCK.lock(); + try { + SCHEDULED_BLOOM_RENDERS.add(ticket); + } finally { + BLOOM_RENDER_LOCK.unlock(); + } return ticket; } @@ -182,18 +189,23 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup */ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { Objects.requireNonNull(level, "level == null"); - for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { - if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { - ticket.invalidate(); - } - } - - for (Map.Entry> e : BLOOM_RENDERS.entrySet()) { - for (BloomRenderTicket ticket : e.getValue()) { + BLOOM_RENDER_LOCK.lock(); + try { + for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { ticket.invalidate(); } } + + for (Map.Entry> e : BLOOM_RENDERS.entrySet()) { + for (BloomRenderTicket ticket : e.getValue()) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { + ticket.invalidate(); + } + } + } + } finally { + BLOOM_RENDER_LOCK.unlock(); } } @@ -211,55 +223,60 @@ public static void renderBloom(double camX, double camY, double camZ, } Minecraft.getInstance().getProfiler().popPush("gtceu_block_bloom"); - preDraw(); + BLOOM_RENDER_LOCK.lock(); + try { + preDraw(); - GTShaders.BLOOM_TARGET.bindWrite(false); + GTShaders.BLOOM_TARGET.bindWrite(false); - EffectRenderContext context = EffectRenderContext.getInstance() - .update(entity, camX, camY, camZ, frustum, partialTicks); + EffectRenderContext context = EffectRenderContext.getInstance() + .update(entity, camX, camY, camZ, frustum, partialTicks); - GTRenderTypes.getBloom().setupRenderState(); + GTRenderTypes.getBloom().setupRenderState(); - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { - RenderSystem.depthMask(true); + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { + RenderSystem.depthMask(true); + + if (!BLOOM_RENDERS.isEmpty()) { + for (List list : BLOOM_RENDERS.values()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + draw(poseStack, buffer, context, list); + } + } + postDraw(); + RenderSystem.depthMask(false); + + render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); + GTRenderTypes.getBloom().clearRenderState(); + return; + } + + BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; + BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; + BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; + BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; + // ********** render custom bloom ************ + + RenderSystem.depthMask(true); if (!BLOOM_RENDERS.isEmpty()) { for (List list : BLOOM_RENDERS.values()) { BufferBuilder buffer = Tesselator.getInstance().getBuilder(); draw(poseStack, buffer, context, list); } } - postDraw(); RenderSystem.depthMask(false); + isDrawingBlockBloom.set(true); render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); - GTRenderTypes.getBloom().clearRenderState(); - return; - } + isDrawingBlockBloom.set(false); - BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; - BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; - BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; - BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; - - // ********** render custom bloom ************ - - RenderSystem.depthMask(true); - if (!BLOOM_RENDERS.isEmpty()) { - for (List list : BLOOM_RENDERS.values()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - draw(poseStack, buffer, context, list); - } + postDraw(); + GTRenderTypes.getBloom().clearRenderState(); + } finally { + BLOOM_RENDER_LOCK.unlock(); } - RenderSystem.depthMask(false); - - isDrawingBlockBloom.set(true); - render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); - isDrawingBlockBloom.set(false); - - postDraw(); - GTRenderTypes.getBloom().clearRenderState(); } private static void preDraw() { From d7cddb1f08716feb0a7f5dfc0a4f5d0249f504ae Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:40:36 +0300 Subject: [PATCH 023/269] switch to ReadWriteLock --- .../gtceu/client/util/BloomEffectUtil.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java index f56a81f0f89..d95c2a63456 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java @@ -31,7 +31,8 @@ import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Predicate; import java.util.function.Supplier; @@ -41,7 +42,7 @@ public class BloomEffectUtil { private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); - private static final ReentrantLock BLOOM_RENDER_LOCK = new ReentrantLock(); + private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); /** *

@@ -173,11 +174,11 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @Nullable Supplier worldContext) { if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); - BLOOM_RENDER_LOCK.lock(); + BLOOM_RENDER_LOCK.writeLock().lock(); try { SCHEDULED_BLOOM_RENDERS.add(ticket); } finally { - BLOOM_RENDER_LOCK.unlock(); + BLOOM_RENDER_LOCK.writeLock().unlock(); } return ticket; } @@ -189,7 +190,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup */ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { Objects.requireNonNull(level, "level == null"); - BLOOM_RENDER_LOCK.lock(); + BLOOM_RENDER_LOCK.readLock().lock(); try { for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { @@ -205,7 +206,7 @@ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { } } } finally { - BLOOM_RENDER_LOCK.unlock(); + BLOOM_RENDER_LOCK.readLock().lock(); } } @@ -223,7 +224,7 @@ public static void renderBloom(double camX, double camY, double camZ, } Minecraft.getInstance().getProfiler().popPush("gtceu_block_bloom"); - BLOOM_RENDER_LOCK.lock(); + BLOOM_RENDER_LOCK.writeLock().lock(); try { preDraw(); @@ -275,7 +276,7 @@ public static void renderBloom(double camX, double camY, double camZ, postDraw(); GTRenderTypes.getBloom().clearRenderState(); } finally { - BLOOM_RENDER_LOCK.unlock(); + BLOOM_RENDER_LOCK.writeLock().unlock(); } } @@ -395,9 +396,9 @@ public static void bakeBloomChunkBuffers(BlockPos pos) { private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, double camX, double camY, double camZ) { - //RenderSystem.enableDepthTest(); - //RenderSystem.enableBlend(); - //RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + // RenderSystem.enableDepthTest(); + // RenderSystem.enableBlend(); + // RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { @@ -435,7 +436,8 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro poseStack.pushPose(); poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); poseStack.translate(-camX, -camY, -camZ); - entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); + entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, + RenderSystem.getShader()); poseStack.popPose(); } finally { entry.getValue().close(); @@ -447,9 +449,9 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro } GTShaders.BLOOM_CHAIN.process(partialTicks); - //RenderSystem.disableDepthTest(); - //RenderSystem.disableBlend(); - //RenderSystem.defaultBlendFunc(); + // RenderSystem.disableDepthTest(); + // RenderSystem.disableBlend(); + // RenderSystem.defaultBlendFunc(); VertexBuffer.unbind(); } From 05fa7ceb54c63c5ac669e087150b47ee26bbcd30 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 20:38:58 +0300 Subject: [PATCH 024/269] fix mixin config and move the mixins to appropriate packages --- .../{util => bloom}/BloomEffectUtil.java | 4 +- .../gtceu/core/mixins/GTMixinPlugin.java | 1 + .../gtceu/core/mixins/LevelRendererMixin.java | 62 ------------------- .../mixins/client/LevelRendererMixin.java | 20 ++++++ .../{ => client}/ModelBlockRendererMixin.java | 2 +- .../{ => client}/PostChainAccessor.java | 2 +- .../mixins/{ => client}/RebuildTaskMixin.java | 2 +- .../mixins/{ => client}/RenderChunkMixin.java | 2 +- .../{ => client}/VertexBufferAccessor.java | 2 +- .../mixins/{ => forge}/QuadLighterMixin.java | 2 +- src/main/resources/gtceu.mixins.json | 16 ++--- 11 files changed, 37 insertions(+), 78 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/{util => bloom}/BloomEffectUtil.java (99%) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java rename src/main/java/com/gregtechceu/gtceu/core/mixins/{ => client}/ModelBlockRendererMixin.java (97%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{ => client}/PostChainAccessor.java (86%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{ => client}/RebuildTaskMixin.java (95%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{ => client}/RenderChunkMixin.java (93%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{ => client}/VertexBufferAccessor.java (85%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{ => forge}/QuadLighterMixin.java (97%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index 482a77b8725..67aa2f84fec 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.client.shader.post.BloomEffect; import com.gregtechceu.gtceu.client.shader.post.BloomType; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.core.mixins.PostChainAccessor; -import com.gregtechceu.gtceu.core.mixins.VertexBufferAccessor; +import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; +import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 430c4aaaf2c..fd9ef91b9b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -30,6 +30,7 @@ public String getRefMapperConfig() { addModCompatMixin("emi"); addModCompatMixin("jei"); addModCompatMixin("top"); + addModCompatMixin("embeddium"); addModCompatMixin("ftbchunks"); addModCompatMixin("xaerominimap"); addModCompatMixin("xaeroworldmap"); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java deleted file mode 100644 index 025033568a8..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/LevelRendererMixin.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import com.gregtechceu.gtceu.api.item.tool.ToolHelper; -import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; - -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.*; -import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.BlockDestructionProgress; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.*; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.*; - -@Mixin(LevelRenderer.class) -@OnlyIn(Dist.CLIENT) -public abstract class LevelRendererMixin { - - @WrapOperation(method = "applyFrustum", - at = @At(value = "INVOKE", - target = "Lit/unimi/dsi/fastutil/objects/ObjectArrayList;add(Ljava/lang/Object;)Z", - remap = false)) - private boolean gtceu$compileBloomBuffers(ObjectArrayList instance, - Object chunkInfo, - Operation original) { - // cast back to RenderChunkInfo - BloomEffectUtil.bakeBloomChunkBuffers(((LevelRenderer.RenderChunkInfo) chunkInfo).chunk.getOrigin()); - return original.call(instance, chunkInfo); - } - - @Inject(method = "resize", at = @At("TAIL")) - private void gtceu$resize(int width, int height, CallbackInfo ci) { - if (GTShaders.BLOOM_CHAIN != null) { - GTShaders.BLOOM_CHAIN.resize(width, height); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index 62c5075dce4..2ef1081b208 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -10,6 +10,8 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; @@ -18,6 +20,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; @@ -39,6 +42,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -78,6 +82,22 @@ public abstract class LevelRendererMixin { @Unique private final RandomSource gtceu$modelRandom = RandomSource.create(); + @Inject(method = "applyFrustum", + at = @At(value = "INVOKE", + target = "Lit/unimi/dsi/fastutil/objects/ObjectArrayList;add(Ljava/lang/Object;)Z", + remap = false)) + private void gtceu$compileBloomBuffers(Frustum frustum, CallbackInfo ci, + @Local LevelRenderer.RenderChunkInfo chunkInfo) { + BloomEffectUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin()); + } + + @Inject(method = "resize", at = @At("TAIL")) + private void gtceu$resize(int width, int height, CallbackInfo ci) { + if (GTShaders.BLOOM_CHAIN != null) { + GTShaders.BLOOM_CHAIN.resize(width, height); + } + } + @Inject(method = "renderLevel", at = @At("HEAD")) private void renderLevel(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java index 6a0c08b505c..6d0fafcbafd 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins; +package com.gregtechceu.gtceu.core.mixins.client; import com.gregtechceu.gtceu.client.model.GTMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainAccessor.java similarity index 86% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainAccessor.java index 767a003e061..51424d86d9e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/PostChainAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainAccessor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins; +package com.gregtechceu.gtceu.core.mixins.client; import net.minecraft.client.renderer.PostChain; import net.minecraft.client.renderer.PostPass; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java index c0cdcf1b300..a7f79a01622 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins; +package com.gregtechceu.gtceu.core.mixins.client; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java similarity index 93% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java index 9c9fede69d4..a8ebccc1f33 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/RenderChunkMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins; +package com.gregtechceu.gtceu.core.mixins.client; import com.gregtechceu.gtceu.client.util.BloomEffectUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/VertexBufferAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexBufferAccessor.java similarity index 85% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/VertexBufferAccessor.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexBufferAccessor.java index 0b72f018a74..6c2f88c11fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/VertexBufferAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexBufferAccessor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins; +package com.gregtechceu.gtceu.core.mixins.client; import com.mojang.blaze3d.vertex.VertexBuffer; import com.mojang.blaze3d.vertex.VertexFormat; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java index 937a18b8ae3..29785915a7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins; +package com.gregtechceu.gtceu.core.mixins.forge; import com.gregtechceu.gtceu.client.model.GTMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 8ef93c10fc2..467a25471bc 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -7,26 +7,27 @@ "plugin": "com.gregtechceu.gtceu.core.mixins.GTMixinPlugin", "client": [ "client.AbstractClientPlayerAccessor", - "client.FaceBakeryMixin", "client.BakedQuadMixin", "client.BiomeColorsMixin", "client.BlockModelMixin", "client.ClientLevelAccessor", + "client.FaceBakeryMixin", "client.GuiGraphicsAccessor", "client.GuiGraphicsMixin", "client.GuiHeartTypeMixin", "client.HumanoidArmorLayerMixin", "client.LevelRendererMixin", - "ModelBlockRendererMixin", + "client.ModelBlockRendererMixin", "client.ModelManagerMixin", "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", + "client.PostChainAccessor", + "client.RebuildTaskMixin", + "client.RenderChunkMixin", "client.VariantDeserializerMixin", - "PostChainAccessor", - "QuadLighterMixin", - "RebuildTaskMixin", - "RenderChunkMixin", - "VertexBufferAccessor", + "client.VertexBufferAccessor", + "embeddium.BlockRendererMixin", + "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", @@ -67,7 +68,6 @@ "emi.FluidEmiStackMixin", "forge.ConfiguredModelBuilderAccessor", "forge.ConfiguredModelListAccessor", - "ForgeHooksMixin", "forge.IntersectionIngredientAccessor", "forge.PartialNBTIngredientAccessor", "forge.StrictNBTIngredientAccessor", From 1b3ed666190582079ade9cadb4193d6e6a7b3462 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 20:43:31 +0300 Subject: [PATCH 025/269] move all the bloom handling into its own package --- .../java/com/gregtechceu/gtceu/GTCEu.java | 2 +- .../gregtechceu/gtceu/client/ClientProxy.java | 7 ++---- .../gtceu/client/bloom/BloomEffectUtil.java | 24 +++++++++++++++---- .../{util => bloom}/EffectRenderContext.java | 2 +- .../client/{util => bloom}/IBloomEffect.java | 5 ++-- .../{renderer => bloom}/IRenderSetup.java | 2 +- .../{ => bloom}/particle/GTBloomParticle.java | 11 +++++---- .../post => bloom/shader}/BloomEffect.java | 2 +- .../post => bloom/shader}/BloomType.java | 2 +- .../forge/ForgeClientEventListener.java | 3 +-- .../client/particle/GTOverheatParticle.java | 8 +++---- .../gtceu/client/particle/GTParticle.java | 4 ++-- .../client/particle/GTParticleManager.java | 4 ++-- .../gtceu/client/shader/GTShaders.java | 4 ++-- .../gtceu/config/ConfigHolder.java | 17 ++++--------- .../client/ModelBlockRendererMixin.java | 4 +--- .../core/mixins/client/RebuildTaskMixin.java | 4 ++-- .../core/mixins/client/RenderChunkMixin.java | 2 +- .../mixins/embeddium/BlockRendererMixin.java | 2 +- .../core/mixins/forge/QuadLighterMixin.java | 4 +--- 20 files changed, 57 insertions(+), 56 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/{util => bloom}/EffectRenderContext.java (98%) rename src/main/java/com/gregtechceu/gtceu/client/{util => bloom}/IBloomEffect.java (87%) rename src/main/java/com/gregtechceu/gtceu/client/{renderer => bloom}/IRenderSetup.java (90%) rename src/main/java/com/gregtechceu/gtceu/client/{ => bloom}/particle/GTBloomParticle.java (60%) rename src/main/java/com/gregtechceu/gtceu/client/{shader/post => bloom/shader}/BloomEffect.java (91%) rename src/main/java/com/gregtechceu/gtceu/client/{shader/post => bloom/shader}/BloomType.java (93%) diff --git a/src/main/java/com/gregtechceu/gtceu/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index a1ea059067f..d29b1ec68d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -173,7 +173,7 @@ public static boolean isIrisOculusLoaded() { return isModLoaded(GTValues.MODID_IRIS) || isModLoaded(GTValues.MODID_OCULUS); } - public static boolean isSodiumRubidiumEmbeddiumLoaded() { + public static boolean isSodiumEmbeddiumLoaded() { return isModLoaded(GTValues.MODID_SODIUM) || isModLoaded(GTValues.MODID_EMBEDDIUM); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 1cb2968aa58..18b44424964 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -21,7 +21,7 @@ import com.gregtechceu.gtceu.client.renderer.machine.impl.*; import com.gregtechceu.gtceu.client.renderer.machine.impl.BoilerMultiPartRender; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTEntityTypes; @@ -45,10 +45,7 @@ import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.*; -import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -74,7 +71,7 @@ public static void init() { Layers.registerLayer(OreRenderLayer::new, "ore_veins"); Layers.registerLayer(FluidRenderLayer::new, "bedrock_fluids"); BloomEffectUtil.init(); - if (GTCEu.isEmbeddiumLoaded()) { + if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index 67aa2f84fec..7056464a240 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -1,11 +1,11 @@ -package com.gregtechceu.gtceu.client.util; +package com.gregtechceu.gtceu.client.bloom; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.renderer.IRenderSetup; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.shader.post.BloomEffect; -import com.gregtechceu.gtceu.client.shader.post.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; +import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.util.GTQuadTransformers; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; @@ -22,6 +22,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; @@ -444,6 +445,21 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } + public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); + if (GTShaders.allowedShader() && chunkOrigin != null && GTQuadTransformers.isEmissive(quad, combinedLights)) { + original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), pose, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } + original.call(consumer, pose, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + } + private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) { } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java index 11657bfb432..b72ab5e68e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/EffectRenderContext.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util; +package com.gregtechceu.gtceu.client.bloom; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.culling.Frustum; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java similarity index 87% rename from src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java index a956606007d..9c817626e5a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java @@ -1,7 +1,6 @@ -package com.gregtechceu.gtceu.client.util; +package com.gregtechceu.gtceu.client.bloom; -import com.gregtechceu.gtceu.client.renderer.IRenderSetup; -import com.gregtechceu.gtceu.client.shader.post.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java similarity index 90% rename from src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java index 96ca4083bbb..eacba5c987f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/IRenderSetup.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.renderer; +package com.gregtechceu.gtceu.client.bloom; import com.mojang.blaze3d.vertex.BufferBuilder; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java similarity index 60% rename from src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java index 2c631ccc1c8..51eb717a9e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java @@ -1,9 +1,10 @@ -package com.gregtechceu.gtceu.client.particle; +package com.gregtechceu.gtceu.client.bloom.particle; -import com.gregtechceu.gtceu.client.renderer.IRenderSetup; -import com.gregtechceu.gtceu.client.shader.post.BloomType; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import com.gregtechceu.gtceu.client.util.IBloomEffect; +import com.gregtechceu.gtceu.client.particle.GTParticle; +import com.gregtechceu.gtceu.client.bloom.IRenderSetup; +import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomEffect.java similarity index 91% rename from src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomEffect.java index a061f1184d7..dc166abe9a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomEffect.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.shader.post; +package com.gregtechceu.gtceu.client.bloom.shader; import com.gregtechceu.gtceu.config.ConfigHolder; diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomType.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java similarity index 93% rename from src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomType.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java index e5000091c1e..7b51ee21327 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/post/BloomType.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.shader.post; +package com.gregtechceu.gtceu.client.bloom.shader; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 4d4bb933842..d3f7a657da6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -11,7 +11,7 @@ import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; import com.gregtechceu.gtceu.client.renderer.cover.FacadeCoverRenderer; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.commands.GTClientCommands; import com.gregtechceu.gtceu.core.mixins.client.AbstractClientPlayerAccessor; @@ -28,7 +28,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.*; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index da7979c8467..72a4ad41ac3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.client.particle; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.client.renderer.IRenderSetup; -import com.gregtechceu.gtceu.client.shader.post.BloomType; -import com.gregtechceu.gtceu.client.util.DrawUtil; -import com.gregtechceu.gtceu.client.util.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; +import com.gregtechceu.gtceu.client.bloom.IRenderSetup; +import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.config.ConfigHolder; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index 69e44ca550c..9c46a9ac2bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.particle; -import com.gregtechceu.gtceu.client.renderer.IRenderSetup; -import com.gregtechceu.gtceu.client.util.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.IRenderSetup; +import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 16cd73ba9c5..3e865c4a068 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.client.particle; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.renderer.IRenderSetup; -import com.gregtechceu.gtceu.client.util.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.IRenderSetup; +import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import net.minecraft.ChatFormatting; import net.minecraft.client.Camera; diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 0ec090f8113..1cec30bc1b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.shader; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.shader.post.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomType; import com.gregtechceu.gtceu.config.ConfigHolder; import net.irisshaders.iris.api.v0.IrisApi; @@ -89,7 +89,7 @@ private static void initPostShaders() { public static boolean allowedShader() { return ConfigHolder.INSTANCE.client.shader.useShader && - !(GTCEu.isIrisOculusLoaded() && IrisApi.getInstance().isShaderPackInUse()); + !(GTCEu.Mods.isIrisOculusLoaded() && IrisApi.getInstance().isShaderPackInUse()); } public static float getITime(float pPartialTicks) { diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 350c7ed8663..eeb2b480cc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -836,12 +836,6 @@ public static class ShaderOptions { @Configurable.DecimalRange(min = 0) public float baseBrightness = 0.1f; - @Configurable - @Configurable.Comment({ "Mipmap Size.", "Higher values increase quality, but are slower to render.", - "Default: 5" }) - @Configurable.Range(min = 2, max = 5) - public int nMips = 5; - @Configurable @Configurable.Comment({ "Bloom Strength", "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", @@ -865,12 +859,11 @@ public static class FusionBloom { "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", "Default: 2" }) @Configurable.DecimalRange(min = 0) - public double strength = 1.5; + public float strength = 1.5f; @Configurable @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", - "1 - Unity Bloom", - "2 - Unreal Bloom", "Default: 2" }) + "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) @Configurable.Range(min = 0, max = 2) public int bloomStyle = 1; @@ -881,7 +874,7 @@ public static class FusionBloom { "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) @Configurable.DecimalRange(min = 0) - public double highBrightnessThreshold = 1.3; + public float highBrightnessThreshold = 1.3f; @Configurable @Configurable.Comment({ @@ -890,7 +883,7 @@ public static class FusionBloom { "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) @Configurable.DecimalRange(min = 0) - public double lowBrightnessThreshold = 0.3; + public float lowBrightnessThreshold = 0.3f; @Configurable @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", @@ -898,7 +891,7 @@ public static class FusionBloom { "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", "Default: 0.1" }) @Configurable.DecimalRange(min = 0) - public double baseBrightness = 0; + public float baseBrightness = 0.0f; } public static class HeatEffectBloom { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java index 6d0fafcbafd..b167c3b05ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.model.GTMetadataSection; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java index a7f79a01622..3f8a18b5609 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; @@ -16,7 +16,7 @@ @Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") public class RebuildTaskMixin { - @Shadow + @Shadow(aliases = { "this$1", "f_290687_", "f" }) @Final ChunkRenderDispatcher.RenderChunk this$1; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java index a8ebccc1f33..d19502f3a02 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 2f9cf1b9857..aab9cda556c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.client.model.GTMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java index 29785915a7c..45ee7e8ab8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.forge; -import com.gregtechceu.gtceu.client.model.GTMetadataSection; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.BlockPos; From 3283b244ffadf3f02e5dc07f7668f482c7e07e08 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 20:43:47 +0300 Subject: [PATCH 026/269] deduplicate mixin code --- .../client/ModelBlockRendererMixin.java | 22 +++++-------------- .../core/mixins/forge/QuadLighterMixin.java | 22 +++++-------------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java index b167c3b05ee..e70fa9d61ea 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java @@ -4,7 +4,6 @@ import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.core.BlockPos; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -18,20 +17,11 @@ public class ModelBlockRendererMixin { @WrapOperation(method = "putQuadData", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) - private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); - // Check if quad is full brightness OR we have bloom enabled for the quad - if (GTShaders.allowedShader() && chunkOrigin != null && - (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); - } - original.call(instance, poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); + private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BloomEffectUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor, original); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java index 45ee7e8ab8e..ae43b280120 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.core.BlockPos; import net.minecraftforge.client.model.lighting.QuadLighter; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; @@ -19,20 +18,11 @@ public class QuadLighterMixin { at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", remap = true)) - private void gtceu$renderToEmissiveBuffer(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); - // Check if quad is full brightness OR we have bloom enabled for the quad - if (GTShaders.allowedShader() && chunkOrigin != null && - (!quad.isShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { - original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); - } - original.call(instance, poseEntry, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); + private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BloomEffectUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor, original); } } From 191a01ea383a0bbeaa3b81aecae85ddadcb219e0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 20:59:26 +0300 Subject: [PATCH 027/269] pass the camera position struct around instead of its components --- .../com/gregtechceu/gtceu/api/GTValues.java | 4 +- .../gtceu/client/bloom/BloomEffectUtil.java | 48 +++++++++---------- .../client/bloom/EffectRenderContext.java | 19 +++----- .../client/particle/GTOverheatParticle.java | 4 +- .../gtceu/client/particle/GTParticle.java | 2 +- .../client/particle/GTParticleManager.java | 3 +- .../gtceu/core/mixins/GTMixinPlugin.java | 1 + 7 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index 90b76ecfcec..b75b58cfd13 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -106,12 +106,11 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { MODID_KUBEJS = "kubejs", MODID_IRIS = "iris", MODID_OCULUS = "oculus", + MODID_SODIUM = "sodium", MODID_EMBEDDIUM = "embeddium", MODID_OPTIFINE = "optifine", - MODID_CREATE = "create", MODID_CURIOS = "curios", MODID_AE2WTLIB = "ae2wtlib", - MODID_SHIMMER = "shimmer", MODID_MODERNFIX = "modernfix", MODID_JOURNEYMAP = "journeymap", MODID_XAEROS_MINIMAP = "xaerominimap", @@ -255,6 +254,7 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { 0x7EC3C4, 0x7EB07E, 0xBF74C0, 0x0B5CFE, 0x914E91, 0x488748, 0x8C0000, 0x2828F5 }; // Main colour for each tier + @SuppressWarnings("DataFlowIssue") public static final int[] VCM = new int[] { DARK_GRAY.getColor(), GRAY.getColor(), diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index 7056464a240..42cb28c48a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -13,12 +13,14 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EffectInstance; import net.minecraft.client.renderer.PostPass; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -80,7 +82,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild @Override public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { - return blockEntity.getLevel() == context.renderViewEntity().level() && + return blockEntity.getLevel() == context.getRenderViewEntity().level() && render.shouldRenderBloomEffect(context); } }, @@ -215,11 +217,8 @@ public static void init() {} public static final AtomicBoolean isDrawingBlockBloom = new AtomicBoolean(false); - public static void renderBloom(double camX, double camY, double camZ, - PoseStack poseStack, Matrix4f projectionMatrix, - Frustum frustum, - float partialTicks, - @NotNull Entity entity) { + public static void renderBloom(Vec3 camPos, @NotNull Entity entity, PoseStack poseStack, + Matrix4f projectionMatrix, Frustum frustum, float partialTicks) { if (!GTShaders.allowedShader()) { return; } @@ -232,7 +231,7 @@ public static void renderBloom(double camX, double camY, double camZ, GTShaders.BLOOM_TARGET.bindWrite(false); EffectRenderContext context = EffectRenderContext.getInstance() - .update(entity, camX, camY, camZ, frustum, partialTicks); + .update(entity, camPos, frustum, partialTicks); GTRenderTypes.getBloom().setupRenderState(); @@ -248,7 +247,7 @@ public static void renderBloom(double camX, double camY, double camZ, postDraw(); RenderSystem.depthMask(false); - render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); + render(partialTicks, poseStack, projectionMatrix, camPos); return; } @@ -271,7 +270,7 @@ public static void renderBloom(double camX, double camY, double camZ, RenderSystem.depthMask(false); isDrawingBlockBloom.set(true); - render(partialTicks, poseStack, projectionMatrix, camX, camY, camZ); + render(partialTicks, poseStack, projectionMatrix, camPos); isDrawingBlockBloom.set(false); postDraw(); @@ -290,9 +289,8 @@ private static void preDraw() { SCHEDULED_BLOOM_RENDERS.clear(); } - private static void draw(@NotNull PoseStack poseStack, - @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context, - @NotNull List tickets) { + private static void draw(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + @NotNull EffectRenderContext context, @NotNull List tickets) { boolean initialized = false; @Nullable IRenderSetup renderSetup = null; @@ -306,7 +304,11 @@ private static void draw(@NotNull PoseStack poseStack, renderSetup.preDraw(buffer); } } + + poseStack.pushPose(); + poseStack.translate(-context.camPos().x(), -context.camPos().y(), -context.camPos().z()); ticket.render.renderBloomEffect(poseStack, buffer, context); + poseStack.popPose(); } if (initialized && renderSetup != null) { renderSetup.postDraw(buffer); @@ -395,28 +397,26 @@ public static void bakeBloomChunkBuffers(BlockPos pos) { private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, double camX, - double camY, double camZ) { + private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { EffectInstance shader = pass.getEffect(); + String name = shader.getName(); + shader.safeGetUniform("iTime").set(GTShaders.getITime(partialTicks)); shader.safeGetUniform("EnableFilter").set(BloomEffectUtil.isDrawingBlockBloom.get() ? 1 : 0); - if (GTShaders.BLOOM_TYPE == BloomType.UNREAL) { - if (shader.getName().equals(SEPERABLE_BLUR_SHADER_NAME)) { - int index = passes.indexOf(pass); - switch (index) { - case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); - case 2, 4, 6, 8 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); - } + if (GTShaders.BLOOM_TYPE == BloomType.UNREAL && name.equals(SEPERABLE_BLUR_SHADER_NAME)) { + int index = passes.indexOf(pass); + switch (index) { + case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); + case 2, 4, 6, 8 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); } } - if (shader.getName().equals(UNITY_COMPOSITE_SHADER_NAME) || - shader.getName().equals(UNREAL_COMPOSITE_SHADER_NAME)) { + if (name.equals(UNITY_COMPOSITE_SHADER_NAME) || name.equals(UNREAL_COMPOSITE_SHADER_NAME)) { shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(BloomEffect.strength); shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(BloomEffect.baseBrightness); shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(BloomEffect.highBrightnessThreshold); @@ -433,7 +433,7 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro entry.getValue().bind(); poseStack.pushPose(); poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); - poseStack.translate(-camX, -camY, -camZ); + poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); poseStack.popPose(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java index b72ab5e68e9..5d7aa9c344a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java @@ -4,6 +4,7 @@ import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; import lombok.Getter; import lombok.experimental.Accessors; @@ -32,11 +33,7 @@ public static EffectRenderContext getInstance() { @Getter private float partialTicks; @Getter - private double cameraX; - @Getter - private double cameraY; - @Getter - private double cameraZ; + private Vec3 camPos; @Getter private float rotationX; @Getter @@ -49,17 +46,13 @@ public static EffectRenderContext getInstance() { private float rotationXZ; @NotNull - public EffectRenderContext update(@NotNull Entity renderViewEntity, - double camX, double camY, double camZ, + public EffectRenderContext update(@NotNull Entity renderViewEntity, Vec3 camPos, Frustum frustum, float partialTicks) { this.renderViewEntity = renderViewEntity; + this.camPos = camPos; this.partialTicks = partialTicks; - this.cameraX = camX; - this.cameraY = camY; - this.cameraZ = camZ; - - float i = 1 - (Minecraft.getInstance().options.getCameraType().isFirstPerson() ? 0 : 2); + float i = Minecraft.getInstance().options.getCameraType().isFirstPerson() ? 1 : -1; float pitch = renderViewEntity.getYRot(); float yaw = renderViewEntity.getXRot(); this.rotationX = Mth.cos(yaw * Mth.DEG_TO_RAD) * i; @@ -77,7 +70,7 @@ public EffectRenderContext update(@NotNull Entity renderViewEntity, * @return render view entity */ @NotNull - public Entity renderViewEntity() { + public Entity getRenderViewEntity() { return Objects.requireNonNull(renderViewEntity, "renderViewEntity not available yet"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 72a4ad41ac3..ffadca44139 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -275,7 +275,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild float blue = (color & 0xFF) / 255f; poseStack.pushPose(); - poseStack.translate(posX - context.cameraX(), posY - context.cameraY(), posZ - context.cameraZ()); + poseStack.translate(posX, posY, posZ); for (AABB cuboid : pipeBoxes.toAabbs()) { RenderBufferHelper.renderCubeFace(poseStack, buffer, cuboid, red, green, blue, alpha, true); } @@ -295,7 +295,7 @@ public void preDraw(@NotNull BufferBuilder buffer) { @Override @OnlyIn(Dist.CLIENT) public void postDraw(@NotNull BufferBuilder buffer) { - Tesselator.getInstance().end(); + BufferUploader.drawWithShader(buffer.end()); RenderSystem.disableBlend(); } }; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index 9c46a9ac2bc..e94b6b91cb5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -49,7 +49,7 @@ protected GTParticle(double posX, double posY, double posZ) { public boolean shouldRender(@NotNull EffectRenderContext context) { if (squaredRenderRange < 0) return true; - return context.renderViewEntity().getEyePosition(context.partialTicks()) + return context.getRenderViewEntity().getEyePosition(context.partialTicks()) .distanceToSqr(posX, posY, posZ) <= squaredRenderRange; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 3e865c4a068..0606ae88001 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -124,8 +124,7 @@ public void renderParticles(@NotNull PoseStack poseStack, @NotNull Entity render if (depthEnabledParticles.isEmpty() && depthDisabledParticles.isEmpty()) return; EffectRenderContext instance = EffectRenderContext.getInstance() - .update(renderViewEntity, camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, - frustum, partialTicks); + .update(renderViewEntity, camera.getPosition(), frustum, partialTicks); RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index fd9ef91b9b7..cdafb919444 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -31,6 +31,7 @@ public String getRefMapperConfig() { addModCompatMixin("jei"); addModCompatMixin("top"); addModCompatMixin("embeddium"); + MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); addModCompatMixin("ftbchunks"); addModCompatMixin("xaerominimap"); addModCompatMixin("xaeroworldmap"); From b26aced6080d85c21d89c4d42af55bc2129e1e1c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:01:39 +0300 Subject: [PATCH 028/269] slightly better embeddium compatibility --- .../forge/ForgeClientEventListener.java | 25 +++++++++++-- .../mixins/embeddium/RenderSectionMixin.java | 36 ------------------- .../embeddium/renderer/BloomMeshAppender.java | 8 ++++- 3 files changed, 30 insertions(+), 39 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index d3f7a657da6..7eb13564d97 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -21,10 +21,13 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.client.Camera; @@ -34,6 +37,7 @@ import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.event.server.ServerStoppedEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -62,8 +66,25 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { // transparent blocks. MultiblockInWorldPreviewRenderer.renderInWorldPreview(poseStack, camera, partialTick); - BloomEffectUtil.renderBloom(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, - poseStack, event.getProjectionMatrix(), event.getFrustum(), partialTick, camera.getEntity()); + BloomEffectUtil.renderBloom(camera.getPosition(), camera.getEntity(), poseStack, + event.getProjectionMatrix(), event.getFrustum(), partialTick); + } + } + + @SubscribeEvent + public static void onChunkUnloadEvent(ChunkEvent.Unload event) { + if (!GTShaders.allowedShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { + return; + } + ChunkAccess chunk = event.getChunk(); + LevelAccessor level = chunk.getWorldForge(); + if (level == null) { + return; + } + + BlockPos.MutableBlockPos chunkPos = chunk.getPos().getWorldPosition().mutable(); + for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { + BloomEffectUtil.removeBloomChunk(chunkPos.setY(SectionPos.sectionToBlockCoord(y))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java deleted file mode 100644 index dade0f496ec..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/RenderSectionMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; - -import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = RenderSection.class, remap = false) -public class RenderSectionMixin { - - @Shadow - @Final - private int chunkX; - - @Shadow - @Final - private int chunkY; - - @Shadow - @Final - private int chunkZ; - - @Inject(method = "delete", at = @At("HEAD")) - private void gtceu$resetBloomBuffers(CallbackInfo ci) { - BlockPos origin = SectionPos.of(this.chunkX, this.chunkY, this.chunkZ).origin(); - BloomEffectUtil.removeBloomChunk(origin); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 97efb331aca..7b3b8f3730c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.embeddium.renderer; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.shader.GTShaders; import net.minecraft.core.BlockPos; @@ -12,7 +13,12 @@ public class BloomMeshAppender implements MeshAppender { @Override public void render(Context context) { + if (!GTShaders.allowedShader()) { + return; + } + BlockPos chunkOrigin = context.sectionOrigin().origin(); + BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); BloomEffectUtil.bakeBloomChunkBuffers(chunkOrigin); } } From fb804106c42eb1bd8e2667ebd7226d5991f03323 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:03:11 +0300 Subject: [PATCH 029/269] clean up the extra rendering utility classes --- .../client/particle/GTOverheatParticle.java | 5 +- .../renderer/block/FluidBlockRenderer.java | 44 +++---- .../renderer/item/ToolChargeBarRenderer.java | 4 +- .../machine/impl/FluidAreaRender.java | 22 ++-- .../gtceu/client/util/DrawUtil.java | 98 --------------- .../gtceu/client/util/RenderBufferHelper.java | 113 +++++++++++++----- .../gtceu/client/util/RenderUtil.java | 99 +++++++++++++-- .../map/ftbchunks/veins/ore/OreVeinIcon.java | 6 +- .../minimap/ore/OreVeinElementRenderer.java | 4 +- .../worldmap/ore/OreVeinElementRenderer.java | 6 +- 10 files changed, 223 insertions(+), 178 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index ffadca44139..3f2f8cb3f03 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.client.bloom.shader.BloomType; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -141,7 +142,7 @@ public static int getBlackBodyColor(int temperature) { if (index >= blackBodyColors.length - 1) return blackBodyColors[blackBodyColors.length - 1]; int color = blackBodyColors[index]; - return DrawUtil.interpolateColor(color, blackBodyColors[index + 1], temperature % 200 / 200f); + return RenderUtil.interpolateColor(color, blackBodyColors[index + 1], temperature % 200 / 200f); } private final CableBlockEntity tileEntity; @@ -277,7 +278,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild poseStack.pushPose(); poseStack.translate(posX, posY, posZ); for (AABB cuboid : pipeBoxes.toAabbs()) { - RenderBufferHelper.renderCubeFace(poseStack, buffer, cuboid, red, green, blue, alpha, true); + RenderBufferHelper.renderColorCube(poseStack, buffer, cuboid, red, green, blue, alpha, true); } poseStack.popPose(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java index e8a9e820e37..5a3d52df0a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java @@ -9,13 +9,13 @@ import net.minecraft.world.level.material.Fluid; import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Data; import lombok.Getter; -import org.joml.Matrix4f; import org.joml.Vector3f; import org.joml.Vector3fc; @@ -52,7 +52,7 @@ public Vector3f[] transformVertices(Vector3fc[] vertices, Direction face) { return newVertices; } - public void drawBlocks(Set offsets, Matrix4f pose, VertexConsumer consumer, + public void drawBlocks(Set offsets, PoseStack poseStack, VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); @@ -62,32 +62,34 @@ public void drawBlocks(Set offsets, Matrix4f pose, VertexConsumer cons int r = red(color), g = green(color), b = blue(color), a = alpha(color); for (var pos : offsets) { - pose.translate(pos.getX(), pos.getY(), pos.getZ()); + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + for (var direction : Direction.values()) { if (offsets.contains(pos.relative(direction))) continue; if (direction != Direction.UP && direction != Direction.DOWN) direction = direction.getOpposite(); - drawFace(pose, consumer, + drawFace(poseStack.last(), consumer, transformVertices(getVertices(direction), direction), getNormal(direction), u0, u1, v0, v1, r, g, b, a, combinedOverlay, combinedLight); } - pose.translate(-pos.getX(), -pos.getY(), -pos.getZ()); + poseStack.popPose(); } } - public void drawPlanes(Direction[] faces, Map> directionalOffsets, Matrix4f pose, + public void drawPlanes(Direction[] faces, Map> directionalOffsets, PoseStack poseStack, VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { for (var face : faces) { if (!directionalOffsets.containsKey(face)) continue; - drawPlane(face, directionalOffsets.get(face), pose, consumer, fluid, texture, combinedOverlay, + drawPlane(face, directionalOffsets.get(face), poseStack, consumer, fluid, texture, combinedOverlay, combinedLight); } } - public void drawPlane(Direction face, Collection offsets, Matrix4f pose, VertexConsumer consumer, + public void drawPlane(Direction face, Collection offsets, PoseStack poseStack, VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, BlockPos origin) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); @@ -97,17 +99,16 @@ public void drawPlane(Direction face, Collection offsets, Matrix4f pos var normal = getNormal(face); var vertices = transformVertices(getVertices(face), face); - BlockPos prevOffset = null; for (var offset : offsets) { - BlockPos currOffset = prevOffset == null ? offset : offset.subtract(prevOffset); - pose.translate(currOffset.getX(), currOffset.getY(), currOffset.getZ()); - drawFace(pose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, - RenderUtil.getFluidLight(fluid, origin.offset(currOffset))); - prevOffset = offset; + poseStack.pushPose(); + poseStack.translate(offset.getX(), offset.getY(), offset.getZ()); + drawFace(poseStack.last(), consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, + RenderUtil.getFluidLight(fluid, origin.offset(offset))); + poseStack.popPose(); } } - public void drawPlane(Direction face, Collection offsets, Matrix4f pose, VertexConsumer consumer, + public void drawPlane(Direction face, Collection offsets, PoseStack poseStack, VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); @@ -117,16 +118,15 @@ public void drawPlane(Direction face, Collection offsets, Matrix4f pos var normal = getNormal(face); var vertices = transformVertices(getVertices(face), face); - BlockPos prevOffset = null; for (var offset : offsets) { - BlockPos currOffset = prevOffset == null ? offset : offset.subtract(prevOffset); - pose.translate(currOffset.getX(), currOffset.getY(), currOffset.getZ()); - drawFace(pose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, combinedLight); - prevOffset = offset; + poseStack.pushPose(); + poseStack.translate(offset.getX(), offset.getY(), offset.getZ()); + drawFace(poseStack.last(), consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, combinedLight); + poseStack.popPose(); } } - public void drawFace(Direction face, Matrix4f pose, VertexConsumer consumer, Fluid fluid, + public void drawFace(Direction face, PoseStack.Pose pose, VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); @@ -138,7 +138,7 @@ public void drawFace(Direction face, Matrix4f pose, VertexConsumer consumer, Flu drawFace(pose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, combinedLight); } - public void drawFace(Matrix4f pose, VertexConsumer consumer, Vector3f[] vertices, Vector3fc normal, + public void drawFace(PoseStack.Pose pose, VertexConsumer consumer, Vector3f[] vertices, Vector3fc normal, float u0, float u1, float v0, float v1, int r, int g, int b, int a, int combinedOverlay, int combinedLight) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/item/ToolChargeBarRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/item/ToolChargeBarRenderer.java index 04e16962445..6307a1f8b52 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/item/ToolChargeBarRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/item/ToolChargeBarRenderer.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.api.item.component.IDurabilityBar; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; -import com.gregtechceu.gtceu.client.util.DrawUtil; +import com.gregtechceu.gtceu.client.util.RenderUtil; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.RenderType; @@ -39,7 +39,7 @@ public static void render(GuiGraphics graphics, int level, int xPosition, int yP int x = xPosition + 2; int y = yPosition + 13 - offset; graphics.fill(RenderType.guiOverlay(), x, y, x + 13, y + (shadow ? 2 : 1), 400, colorShadow); - DrawUtil.fillHorizontalGradient(graphics, RenderType.guiOverlay(), x, y, x + level, y + 1, left, right, 400); + RenderUtil.fillHorizontalGradient(graphics, RenderType.guiOverlay(), x, y, x + level, y + 1, left, right, 400); // graphics.fill(RenderType.guiOverlay(), x + BAR_W, y, x + BAR_W - level, y - 1, colorBG); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java index c0cd3bc9ffd..0bceab9db58 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.client.renderer.machine.impl; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.client.renderer.block.FluidBlockRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; @@ -10,6 +11,7 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; @@ -17,6 +19,7 @@ import net.minecraftforge.client.RenderTypeHelper; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; @@ -80,12 +83,13 @@ public void render(IFluidRenderMulti machine, float partialTick, if (!machine.isFormed() || machine.getFluidOffsets() == null) { return; } + MultiblockControllerMachine full = machine.self(); if (!fixedFluid) { var lastRecipe = machine.getRecipeLogic().getLastRecipe(); if (lastRecipe == null) { cachedRecipe = null; cachedFluid = null; - } else if (machine.self().getOffsetTimer() % 20 == 0 || lastRecipe.id != cachedRecipe) { + } else if (full.getOffsetTimer() % 20 == 0 || lastRecipe.id != cachedRecipe) { cachedRecipe = lastRecipe.id; if (machine.isActive()) { cachedFluid = RenderUtil.getRecipeFluidToRender(lastRecipe); @@ -98,22 +102,16 @@ public void render(IFluidRenderMulti machine, float partialTick, return; } - poseStack.pushPose(); - var pose = poseStack.last().pose(); - - var fluidRenderType = ItemBlockRenderTypes.getRenderLayer(cachedFluid.defaultFluidState()); - var consumer = buffer.getBuffer(RenderTypeHelper.getEntityRenderType(fluidRenderType, false)); + RenderType fluidRenderType = ItemBlockRenderTypes.getRenderLayer(cachedFluid.defaultFluidState()); + VertexConsumer consumer = buffer.getBuffer(RenderTypeHelper.getEntityRenderType(fluidRenderType, false)); for (RelativeDirection face : this.drawFaces) { - var dir = face.getRelative(machine.self().getFrontFacing(), machine.self().getUpwardsFacing(), - machine.self().isFlipped()); + Direction dir = face.getRelative(full.getFrontFacing(), full.getUpwardsFacing(), full.isFlipped()); if (dir.getAxis() != Direction.Axis.Y) dir = dir.getOpposite(); - fluidBlockRenderer.drawPlane(dir, machine.getFluidOffsets(), pose, consumer, cachedFluid, - RenderUtil.FluidTextureType.STILL, packedOverlay, machine.self().getPos()); + fluidBlockRenderer.drawPlane(dir, machine.getFluidOffsets(), poseStack, consumer, cachedFluid, + RenderUtil.FluidTextureType.STILL, packedOverlay, full.getPos()); } - - poseStack.popPose(); } private Optional getFixedFluid() { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java deleted file mode 100644 index e8affa27d49..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/util/DrawUtil.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.gregtechceu.gtceu.client.util; - -import com.gregtechceu.gtceu.core.mixins.client.GuiGraphicsAccessor; - -import com.lowdragmc.lowdraglib.utils.ColorUtils; - -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.RenderType; - -import com.mojang.blaze3d.vertex.VertexConsumer; -import org.joml.Matrix4f; - -public class DrawUtil { - - /** - * Fills a rectangle with a gradient color from colorFrom to colorTo at the specified z-level using the given render - * type and coordinates as the boundaries. - * - * @param y2 the y-coordinate of the second corner of the rectangle. - * @param x2 the x-coordinate of the second corner of the rectangle. - * @param y1 the y-coordinate of the first corner of the rectangle. - * @param x1 the x-coordinate of the first corner of the rectangle. - * @param renderType the render type to use. - * @param z the z-level of the rectangle. - * @param colorTo the ending color of the gradient. - * @param colorFrom the starting color of the gradient. - */ - public static void fillHorizontalGradient(GuiGraphics graphics, RenderType renderType, int x1, int y1, int x2, - int y2, int colorFrom, int colorTo, int z) { - VertexConsumer vertexconsumer = graphics.bufferSource().getBuffer(renderType); - fillHorizontalGradient(graphics, vertexconsumer, x1, y1, x2, y2, z, colorFrom, colorTo); - ((GuiGraphicsAccessor) graphics).callFlushIfUnmanaged(); - } - - /** - * The core `fillGradient` method. - *

- * Fills a rectangle with a gradient color from colorFrom to colorTo at the specified z-level using the given render - * type and coordinates as the boundaries. - * - * @param consumer the {@linkplain VertexConsumer} object for drawing the vertices on screen. - * @param x1 the x-coordinate of the first corner of the rectangle. - * @param y1 the y-coordinate of the first corner of the rectangle. - * @param x2 the x-coordinate of the second corner of the rectangle. - * @param y2 the y-coordinate of the second corner of the rectangle. - * @param z the z-level of the rectangle. - * @param colorFrom the starting color of the gradient. - * @param colorTo the ending color of the gradient. - */ - private static void fillHorizontalGradient(GuiGraphics graphics, VertexConsumer consumer, int x1, int y1, int x2, - int y2, int z, int colorFrom, int colorTo) { - float a1 = ColorUtils.alpha(colorFrom); - float r1 = ColorUtils.red(colorFrom); - float g1 = ColorUtils.green(colorFrom); - float b1 = ColorUtils.blue(colorFrom); - float a2 = ColorUtils.alpha(colorTo); - float r2 = ColorUtils.red(colorTo); - float g2 = ColorUtils.green(colorTo); - float b2 = ColorUtils.blue(colorTo); - Matrix4f matrix4f = graphics.pose().last().pose(); - consumer.vertex(matrix4f, (float) x1, (float) y1, (float) z).color(r1, g1, b1, a1).endVertex(); - consumer.vertex(matrix4f, (float) x1, (float) y2, (float) z).color(r1, g1, b1, a1).endVertex(); - consumer.vertex(matrix4f, (float) x2, (float) y2, (float) z).color(r2, g2, b2, a2).endVertex(); - consumer.vertex(matrix4f, (float) x2, (float) y1, (float) z).color(r2, g2, b2, a2).endVertex(); - } - - /** - * Converts an (A)RGB integer color into an array of floats, for use in GL calls - * - * @return float[]{R, G, B, A} - */ - public static float[] floats(int argb) { - return new float[] { - (float) (argb >> 16 & 255) / 255.0F, - (float) (argb >> 8 & 255) / 255.0F, - (float) (argb & 255) / 255.0F, - (float) (argb >> 24 & 255) / 255.0F - }; - } - - public static int interpolateColor(int color1, int color2, float blend) { - int a1 = color1 >> 24 & 255; - int r1 = color1 >> 16 & 255; - int g1 = color1 >> 8 & 255; - int b1 = color1 & 255; - - int a2 = color2 >> 24 & 255; - int r2 = color2 >> 16 & 255; - int g2 = color2 >> 8 & 255; - int b2 = color2 & 255; - - int a = (int) (a1 * (1 - blend) + a2 * blend); - int r = (int) (r1 * (1 - blend) + r2 * blend); - int g = (int) (g1 * (1 - blend) + g2 * blend); - int b = (int) (b1 * (1 - blend) + b2 * blend); - return a << 24 | r << 16 | g << 8 | b; - } -} 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 ef8d6a278d0..478c41487ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java @@ -15,6 +15,8 @@ import java.util.EnumSet; import java.util.Set; +import static net.minecraft.util.FastColor.ARGB32.*; + @OnlyIn(Dist.CLIENT) public class RenderBufferHelper { @@ -151,6 +153,80 @@ public static void renderCube(VertexConsumer buffer, PoseStack.Pose pose, Set + * Fills a rectangle with a gradient color from colorFrom to colorTo at the specified z-level using the given render + * type and coordinates as the boundaries. + * + * @param consumer the {@linkplain VertexConsumer} object for drawing the vertices on screen. + * @param x1 the x-coordinate of the first corner of the rectangle. + * @param y1 the y-coordinate of the first corner of the rectangle. + * @param x2 the x-coordinate of the second corner of the rectangle. + * @param y2 the y-coordinate of the second corner of the rectangle. + * @param z the z-level of the rectangle. + * @param colorFrom the starting color of the gradient. + * @param colorTo the ending color of the gradient. + */ + private static void fillHorizontalGradient(GuiGraphics graphics, VertexConsumer consumer, + float x1, float y1, float x2, float y2, float z, + int colorFrom, int colorTo) { + int a1 = alpha(colorFrom), r1 = red(colorFrom), g1 = green(colorFrom), b1 = blue(colorFrom); + int a2 = alpha(colorTo), r2 = red(colorTo), g2 = green(colorTo), b2 = blue(colorTo); + + Matrix4f pose = graphics.pose().last().pose(); + consumer.vertex(pose, x1, y1, z).color(r1, g1, b1, a1).endVertex(); + consumer.vertex(pose, x1, y2, z).color(r1, g1, b1, a1).endVertex(); + consumer.vertex(pose, x2, y2, z).color(r2, g2, b2, a2).endVertex(); + consumer.vertex(pose, x2, y1, z).color(r2, g2, b2, a2).endVertex(); + } + + /** + * Converts an (A)RGB integer color into an array of floats, for use in GL calls + * + * @return float[]{R, G, B, A} + */ + public static float[] floats(int argb) { + return new float[] { + (float) (argb >> 16 & 255) / 255.0F, + (float) (argb >> 8 & 255) / 255.0F, + (float) (argb & 255) / 255.0F, + (float) (argb >> 24 & 255) / 255.0F + }; + } + + public static int interpolateColor(int color1, int color2, float blend) { + int a1 = color1 >> 24 & 255; + int r1 = color1 >> 16 & 255; + int g1 = color1 >> 8 & 255; + int b1 = color1 & 255; + + int a2 = color2 >> 24 & 255; + int r2 = color2 >> 16 & 255; + int g2 = color2 >> 8 & 255; + int b2 = color2 & 255; + + int a = (int) (a1 * (1 - blend) + a2 * blend); + int r = (int) (r1 * (1 - blend) + r2 * blend); + int g = (int) (g1 * (1 - blend) + g2 * blend); + int b = (int) (b1 * (1 - blend) + b2 * blend); + return a << 24 | r << 16 | g << 8 | b; + } + public static void moveToFace(PoseStack poseStack, double x, double y, double z, Direction face) { poseStack.translate(x + 0.5d + face.getStepX() * 0.5d, y + 0.5d + face.getStepY() * 0.5d, diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java index c6cd4331c23..4fc31c7643c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/ftbchunks/veins/ore/OreVeinIcon.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.client.util.DrawUtil; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.ftbchunks.FTBChunksOptions; import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; @@ -157,7 +157,7 @@ public void draw(MapType mapType, GuiGraphics graphics, int x, int y, int w, int var iconSize = ConfigHolder.INSTANCE.compat.minimap.oreIconSize; var material = getMaterial(); var color = material.isNull() ? 0xFFFFFFFF : material.getMaterialARGB(); - var colors = DrawUtil.floats(color); + var colors = RenderUtil.floats(color); RenderSystem.setShaderColor(1, 1, 1, 1); var iconSet = material.isNull() ? MaterialIconSet.METALLIC : material.getMaterialIconSet(); @@ -172,7 +172,7 @@ public void draw(MapType mapType, GuiGraphics graphics, int x, int y, int w, int oreTexture = MaterialIconType.rawOre.getItemTexturePath(iconSet, "secondary", true); if (oreTexture != null) { var materialSecondaryARGB = material.isNull() ? 0xFFFFFFFF : material.getMaterialSecondaryARGB(); - colors = DrawUtil.floats(materialSecondaryARGB); + colors = RenderUtil.floats(materialSecondaryARGB); var oreSprite = Minecraft.getInstance() .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) .apply(oreTexture); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java index 6539ed5ffad..3fb592d1e79 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/minimap/ore/OreVeinElementRenderer.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.client.util.DrawUtil; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; @@ -45,7 +45,7 @@ public boolean renderElement(OreVeinElement element, Material firstMaterial = vein.definition().veinGenerator().getAllMaterials().get(0); int materialARGB = firstMaterial.getMaterialARGB(); - float[] colors = DrawUtil.floats(materialARGB); + float[] colors = RenderUtil.floats(materialARGB); RenderSystem.setShaderColor(1, 1, 1, 1); ResourceLocation oreTexture = MaterialIconType.rawOre.getItemTexturePath(firstMaterial.getMaterialIconSet(), diff --git a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java index 653e9667f00..bc70aae18aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/map/xaeros/worldmap/ore/OreVeinElementRenderer.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; -import com.gregtechceu.gtceu.client.util.DrawUtil; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.map.GroupingMapRenderer; @@ -84,7 +84,7 @@ public boolean renderElement(int location, OreVeinElement element, Material firstMaterial = vein.definition().veinGenerator().getAllMaterials().get(0); int materialARGB = firstMaterial.getMaterialARGB(); - float[] colors = DrawUtil.floats(materialARGB); + float[] colors = RenderUtil.floats(materialARGB); RenderSystem.setShaderColor(1, 1, 1, 1); ResourceLocation oreTexture = MaterialIconType.rawOre.getItemTexturePath(firstMaterial.getMaterialIconSet(), @@ -99,7 +99,7 @@ public boolean renderElement(int location, OreVeinElement element, oreTexture = MaterialIconType.rawOre.getItemTexturePath(firstMaterial.getMaterialIconSet(), "secondary", true); if (oreTexture != null) { int materialSecondaryARGB = firstMaterial.getMaterialSecondaryARGB(); - colors = DrawUtil.floats(materialSecondaryARGB); + colors = RenderUtil.floats(materialSecondaryARGB); var oreSprite = Minecraft.getInstance() .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) .apply(oreTexture); From a605a58a490d527b4b3ea582131e9d76ddf9ff8b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:06:37 +0300 Subject: [PATCH 030/269] reimplement fusion ring bloom --- .../machine/FusionReactorRenderer.java | 150 ------------------ .../machine/impl/FusionRingRender.java | 111 ++++++++++--- .../gtceu/client/shader/GTShaders.java | 11 +- .../electric/FusionReactorMachine.java | 2 +- 4 files changed, 100 insertions(+), 174 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java deleted file mode 100644 index 25cd8171f58..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/FusionReactorRenderer.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.gregtechceu.gtceu.client.renderer.machine; - -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.renderer.IRenderSetup; -import com.gregtechceu.gtceu.client.shader.post.BloomEffect; -import com.gregtechceu.gtceu.client.shader.post.BloomType; -import com.gregtechceu.gtceu.client.util.BloomEffectUtil; -import com.gregtechceu.gtceu.client.util.EffectRenderContext; -import com.gregtechceu.gtceu.client.util.IBloomEffect; -import com.gregtechceu.gtceu.client.util.RenderBufferHelper; -import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import com.lowdragmc.lowdraglib.utils.ColorUtils; -import com.lowdragmc.lowdraglib.utils.interpolate.Eases; - -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.phys.AABB; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; - -public class FusionReactorRenderer extends WorkableCasingMachineRenderer { - - public FusionReactorRenderer(ResourceLocation baseCasing, ResourceLocation workableModel) { - super(baseCasing, workableModel); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, - int combinedLight, int combinedOverlay) { - if (blockEntity instanceof IMachineBlockEntity machineBlockEntity && - machineBlockEntity.getMetaMachine() instanceof FusionReactorMachine machine) { - if (!machine.isRegisteredBloomTicket()) { - machine.setRegisteredBloomTicket(true); - BloomEffectUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), - new FusionBloomEffect(machine), blockEntity); - } - // TODO fix bloom on fusion reactor light - stack.pushPose(); - // offset back by machine pos to render ring at machine in renderLightRing, sorry for this - BlockPos pos = machine.getPos(); - stack.translate(-pos.getX(), -pos.getY(), -pos.getZ()); - renderLightRing(machine, partialTicks, stack, buffer.getBuffer(GTRenderTypes.getLightRing()), 0, 0, 0); - stack.popPose(); - } - } - - private static BloomType getBloomType() { - ConfigHolder.ClientConfigs.ShaderOptions.FusionBloom fusionBloom = ConfigHolder.INSTANCE.client.shader.fusionBloom; - return BloomType.fromValue(fusionBloom.useShader ? fusionBloom.bloomStyle : -1); - } - - @OnlyIn(Dist.CLIENT) - private void renderLightRing(FusionReactorMachine machine, float partialTicks, PoseStack stack, - VertexConsumer buffer, float camX, float camY, float camZ) { - var color = machine.getColor(); - if (color == -1) return; - int ringColor = ColorUtils.blendColor(color, -1, Eases.EaseQuadIn.getInterpolation( - Math.abs((Math.abs(machine.getOffsetTimer() % 50) + partialTicks) - 25) / 25)); - var front = machine.getFrontFacing(); - var upwards = machine.getUpwardsFacing(); - var flipped = machine.isFlipped(); - BlockPos pos = machine.getPos(); - Direction relativeBack = RelativeDirection.BACK.getRelativeFacing(front, upwards, flipped); - Direction.Axis axis = RelativeDirection.UP.getRelativeFacing(front, upwards, flipped).getAxis(); - float a = ColorUtils.alpha(ringColor); - float r = ColorUtils.red(ringColor); - float g = ColorUtils.green(ringColor); - float b = ColorUtils.blue(ringColor); - RenderBufferHelper.renderRing(stack, buffer, - pos.getX() - camX + relativeBack.getStepX() * 7 + 0.5F, - pos.getY() - camY + relativeBack.getStepY() * 7 + 0.5F, - pos.getZ() - camZ + relativeBack.getStepZ() * 7 + 0.5F, - 6, 0.2F, 10, 20, - r, g, b, a, axis); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean hasTESR(BlockEntity blockEntity) { - return true; - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean isGlobalRenderer(BlockEntity blockEntity) { - return true; - } - - @Override - @OnlyIn(Dist.CLIENT) - public int getViewDistance() { - return 32; - } - - @RequiredArgsConstructor - private final class FusionBloomEffect implements IBloomEffect { - - private final FusionReactorMachine machine; - - private static final BufferBuilder lightRingBuffer = new BufferBuilder( - GTRenderTypes.getLightRing().bufferSize()); - - @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, - @NotNull EffectRenderContext context) { - lightRingBuffer.begin(GTRenderTypes.getLightRing().mode(), GTRenderTypes.getLightRing().format()); - FusionReactorRenderer.this.renderLightRing(machine, context.partialTicks(), poseStack, lightRingBuffer, - (float) context.cameraX(), (float) context.cameraY(), (float) context.cameraZ()); - BufferUploader.drawWithShader(lightRingBuffer.end()); - } - - @Override - public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { - return machine.getColor() != null && context.frustum() - .isVisible(new AABB(machine.getPos()).inflate(FusionReactorRenderer.this.getViewDistance())); - } - } - - private static final class FusionBloomSetup implements IRenderSetup { - - private static final FusionBloomSetup INSTANCE = new FusionBloomSetup(); - - @Override - public void preDraw(@NotNull BufferBuilder buffer) { - BloomEffect.strength = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.strength; - BloomEffect.baseBrightness = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.baseBrightness; - BloomEffect.highBrightnessThreshold = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.highBrightnessThreshold; - BloomEffect.lowBrightnessThreshold = (float) ConfigHolder.INSTANCE.client.shader.fusionBloom.lowBrightnessThreshold; - BloomEffect.step = 1; - - RenderSystem.setShaderColor(1, 1, 1, 1); - } - - @Override - public void postDraw(@NotNull BufferBuilder buffer) {} - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index fb5e254216e..ea759cb8e45 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -1,27 +1,37 @@ package com.gregtechceu.gtceu.client.renderer.machine.impl; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; -import com.gregtechceu.gtceu.client.util.BloomUtils; +import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; +import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; - -import com.lowdragmc.shimmer.client.shader.RenderUtils; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; +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.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.serialization.Codec; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import static net.minecraft.util.FastColor.ARGB32.*; @@ -56,22 +66,22 @@ public void render(FusionReactorMachine machine, float partialTick, if (!machine.recipeLogic.isWorking() && delta <= 0) { return; } - if (GTCEu.Mods.isShimmerLoaded()) { - PoseStack finalStack = RenderUtils.copyPoseStack(poseStack); - BloomUtils.entityBloom(source -> renderLightRing(machine, partialTick, finalStack, - source.getBuffer(GTRenderTypes.getLightRing()))); - } else { - renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); + + if (!machine.isRegisteredBloomTicket()) { + machine.setRegisteredBloomTicket(true); + BloomEffectUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), + new FusionBloomEffect(machine), machine.getHolder().self()); } + // TODO fix bloom on fusion reactor light + renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); } @OnlyIn(Dist.CLIENT) private void renderLightRing(FusionReactorMachine machine, float partialTicks, PoseStack stack, VertexConsumer buffer) { - var color = machine.getColor(); - var alpha = 1f; + float alpha = 1f; if (machine.recipeLogic.isWorking()) { - lastColor = color; + lastColor = machine.getColor(); delta = FADEOUT; } else { alpha = delta / FADEOUT; @@ -79,15 +89,15 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P delta -= Minecraft.getInstance().getDeltaFrameTime(); } - final var lerpFactor = Math.abs((Math.abs(machine.getOffsetTimer() % 50) + partialTicks) - 25) / 25; - var front = machine.getFrontFacing(); - var upwards = machine.getUpwardsFacing(); - var flipped = machine.isFlipped(); - var back = RelativeDirection.BACK.getRelative(front, upwards, flipped); - var axis = RelativeDirection.UP.getRelative(front, upwards, flipped).getAxis(); - var r = Mth.lerp(lerpFactor, red(lastColor), 255) / 255f; - var g = Mth.lerp(lerpFactor, green(lastColor), 255) / 255f; - var b = Mth.lerp(lerpFactor, blue(lastColor), 255) / 255f; + final float lerpFactor = Math.abs((Math.abs(machine.getOffsetTimer() % 50) + partialTicks) - 25) / 25; + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, flipped); + Direction.Axis axis = RelativeDirection.UP.getRelative(front, upwards, flipped).getAxis(); + float r = Mth.lerp(lerpFactor, red(lastColor), 255) / 255f; + float g = Mth.lerp(lerpFactor, green(lastColor), 255) / 255f; + float b = Mth.lerp(lerpFactor, blue(lastColor), 255) / 255f; RenderBufferHelper.renderRing(stack, buffer, back.getStepX() * 7 + 0.5F, back.getStepY() * 7 + 0.5F, @@ -110,4 +120,61 @@ public int getViewDistance() { public AABB getRenderBoundingBox(FusionReactorMachine machine) { return new AABB(machine.getPos()).inflate(getViewDistance() / 2.0D); } + + private static BloomType getBloomType() { + var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; + return BloomType.fromValue(config.useShader ? config.bloomStyle : -1); + } + + @RequiredArgsConstructor + private final class FusionBloomEffect implements IBloomEffect { + + private final FusionReactorMachine machine; + + private static final BufferBuilder lightRingBuffer = new BufferBuilder( + GTRenderTypes.getLightRing().bufferSize()); + + @Override + public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, + @NotNull EffectRenderContext context) { + BlockPos pos = machine.getPos(); + + lightRingBuffer.begin(GTRenderTypes.getLightRing().mode(), GTRenderTypes.getLightRing().format()); + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + + FusionRingRender.this.renderLightRing(machine, context.partialTicks(), poseStack, lightRingBuffer); + + poseStack.popPose(); + + BufferUploader.drawWithShader(lightRingBuffer.end()); + } + + @Override + public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { + return machine.recipeLogic.isWorking() && delta > 0 && + context.frustum().isVisible(FusionRingRender.this.getRenderBoundingBox(machine)); + } + } + + private static final class FusionBloomSetup implements IRenderSetup { + + private static final FusionBloomSetup INSTANCE = new FusionBloomSetup(); + + @Override + public void preDraw(@NotNull BufferBuilder buffer) { + var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; + + BloomEffect.strength = config.strength; + BloomEffect.baseBrightness = config.baseBrightness; + BloomEffect.highBrightnessThreshold = config.highBrightnessThreshold; + BloomEffect.lowBrightnessThreshold = config.lowBrightnessThreshold; + BloomEffect.step = 1; + + RenderSystem.setShaderColor(1, 1, 1, 1); + } + + @Override + public void postDraw(@NotNull BufferBuilder buffer) {} + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 1cec30bc1b8..dd3af455cb5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.client.shader; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.client.bloom.shader.BloomType; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -89,7 +90,8 @@ private static void initPostShaders() { public static boolean allowedShader() { return ConfigHolder.INSTANCE.client.shader.useShader && - !(GTCEu.Mods.isIrisOculusLoaded() && IrisApi.getInstance().isShaderPackInUse()); + GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && + !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); } public static float getITime(float pPartialTicks) { @@ -99,4 +101,11 @@ public static float getITime(float pPartialTicks) { return ((mc.level.getGameTime() % 24000) + pPartialTicks) / 20f; } } + + private static class IrisCallWrapper { + + private static boolean isShaderActive() { + return IrisApi.getInstance().isShaderPackInUse(); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java index 97f0b427edd..b7d6e3753cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java @@ -82,7 +82,7 @@ public class FusionReactorMachine extends WorkableElectricMultiblockMachine impl protected final NotifiableEnergyContainer energyContainer; @Getter @DescSynced - private Integer color = -1; + private int color = -1; @Nullable protected TickableSubscription preHeatSubs; From 24da07a2adda778452dae736c4bf164986db16e7 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:17:47 +0300 Subject: [PATCH 031/269] use the quad's light data for determining emissivity --- .../gtceu/client/bloom/BloomEffectUtil.java | 4 +- .../client/model/BloomMetadataSection.java | 96 +++++++++++++++++++ .../gtceu/client/model/GTMetadataSection.java | 79 --------------- .../gtceu/client/util/GTQuadTransformers.java | 10 ++ .../mixins/embeddium/BlockRendererMixin.java | 37 +++++-- 5 files changed, 139 insertions(+), 87 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index 42cb28c48a7..256cc80f910 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.client.bloom; +import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.bloom.shader.BloomType; -import com.gregtechceu.gtceu.client.util.GTQuadTransformers; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; @@ -450,7 +450,7 @@ public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pos int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); - if (GTShaders.allowedShader() && chunkOrigin != null && GTQuadTransformers.isEmissive(quad, combinedLights)) { + if (GTShaders.allowedShader() && chunkOrigin != null || BloomMetadataSection.hasBloom(quad, combinedLights)) { original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java new file mode 100644 index 00000000000..ce540a58337 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java @@ -0,0 +1,96 @@ +package com.gregtechceu.gtceu.client.model; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.util.GTQuadTransformers; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.atlas.SpriteSource; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.metadata.MetadataSectionSerializer; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; + +public record BloomMetadataSection(boolean bloom) { + + public static final String SECTION_NAME = GTCEu.MOD_ID; + public static final BloomMetadataSection MISSING = new BloomMetadataSection(false); + + public static boolean hasBloom(TextureAtlasSprite sprite) { + ResourceLocation textureLoc = SpriteSource.TEXTURE_ID_CONVERTER.idToFile(sprite.contents().name()); + return hasBloom(textureLoc); + } + + public static boolean hasBloom(ResourceLocation res) { + try { + var resource = Minecraft.getInstance().getResourceManager().getResource(res); + if (resource.isPresent()) { + return resource.get().metadata().getSection(Serializer.INSTANCE) + .orElse(MISSING).bloom; + } + } catch (IOException e) { + throw new RuntimeException(e); + } + return false; + } + + public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { + if (!quad.isShade() || !quad.hasAmbientOcclusion()) { + return true; + } + if (hasBloom(quad.getSprite())) { + return true; + } + return isEmissive(quad, ambientPackedLights); + } + + public static boolean isEmissive(BakedQuad quad, int[] ambientPackedLights) { + int[] quadPackedLights = GTQuadTransformers.getPackedLights(quad); + + for (int i = 0; i < 4; i++) { + int quadLight = quadPackedLights[i]; + int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); + + int ambientLight = ambientPackedLights[i]; + int aBlock = LightTexture.block(ambientLight), aSky = LightTexture.sky(ambientLight); + + if (qBlock > aBlock || qSky > aSky) { + return true; + } + } + return false; + } + + public static class Serializer implements MetadataSectionSerializer { + + static BloomMetadataSection.Serializer INSTANCE = new BloomMetadataSection.Serializer(); + + @NotNull + @Override + public String getMetadataSectionName() { + return SECTION_NAME; + } + + @Override + public BloomMetadataSection fromJson(JsonObject json) { + boolean bloom = false; + if (json.isJsonObject()) { + JsonObject obj = json.getAsJsonObject(); + if (obj.has("bloom")) { + JsonElement element = obj.get("bloom"); + if (element.isJsonPrimitive() && + element.getAsJsonPrimitive().isBoolean()) { + bloom = element.getAsBoolean(); + } + } + } + return new BloomMetadataSection(bloom); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java deleted file mode 100644 index 7bc37d9ed16..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/model/GTMetadataSection.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.gregtechceu.gtceu.client.model; - -import com.gregtechceu.gtceu.GTCEu; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.metadata.MetadataSectionSerializer; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.IOException; - -public record GTMetadataSection(boolean bloom) { - - public static final String SECTION_NAME = GTCEu.MOD_ID; - public static final GTMetadataSection MISSING = new GTMetadataSection(false); - - @Nullable - public static GTMetadataSection getMetadata(ResourceLocation res) { - GTMetadataSection ret = MISSING; - try { - var resource = Minecraft.getInstance().getResourceManager().getResource(res); - if (resource.isPresent()) { - ret = resource.get().metadata().getSection(GTMetadataSection.Serializer.INSTANCE).orElse(MISSING); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return ret; - } - - public static boolean hasBloom(TextureAtlasSprite sprite) { - if (sprite == null) return false; - // noinspection resource - GTMetadataSection ret = getMetadata(spriteToAbsolute(sprite.contents().name())); - return ret != null && ret.bloom; - } - - public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { - if (!sprite.getPath().startsWith("textures/")) { - sprite = sprite.withPrefix("textures/"); - } - if (!sprite.getPath().endsWith(".png")) { - sprite = sprite.withSuffix(".png"); - } - return sprite; - } - - public static class Serializer implements MetadataSectionSerializer { - - static GTMetadataSection.Serializer INSTANCE = new GTMetadataSection.Serializer(); - - @NotNull - @Override - public String getMetadataSectionName() { - return SECTION_NAME; - } - - @Override - public GTMetadataSection fromJson(JsonObject json) { - boolean bloom = false; - if (json.isJsonObject()) { - JsonObject obj = json.getAsJsonObject(); - if (obj.has("bloom")) { - JsonElement element = obj.get("bloom"); - if (element.isJsonPrimitive() && - element.getAsJsonPrimitive().isBoolean()) { - bloom = element.getAsBoolean(); - } - } - } - return new GTMetadataSection(bloom); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java b/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java index fdfea07a48d..6d1ac3f4b8d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java @@ -80,5 +80,15 @@ public static BakedQuad copy(BakedQuad quad) { .gtceu$setTextureKey(quad.gtceu$getTextureKey()); } + public static int[] getPackedLights(BakedQuad quad) { + int[] vertices = quad.getVertices(); + + int[] lights = new int[4]; + for (int i = 0; i < 4; i++) { + lights[i] = vertices[i * IQuadTransformer.STRIDE + IQuadTransformer.UV2]; + } + return lights; + } + private GTQuadTransformers() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index aab9cda556c..94899a9f5ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -1,11 +1,12 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; -import com.gregtechceu.gtceu.client.model.GTMetadataSection; +import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; @@ -26,6 +27,7 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @Mixin(value = BlockRenderer.class, remap = false) @@ -51,7 +53,7 @@ public class BlockRendererMixin { BlockPos chunkOrigin = SectionPos.of(ctx.pos()).origin(); // Check if quad is full brightness OR we have bloom enabled for the quad // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though - if (GTShaders.allowedShader() && (!quad.hasShade() || GTMetadataSection.hasBloom(quad.getSprite()))) { + if (GTShaders.allowedShader() && gtceu$isEmissive(quad, light)) { ModelQuadOrientation orientation = this.useReorienting ? ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { @@ -67,10 +69,10 @@ public class BlockRendererMixin { .vertex(ctx.origin().x() + quad.getX(srcIndex) + (float) offset.x(), ctx.origin().y() + quad.getY(srcIndex) + (float) offset.y(), ctx.origin().z() + quad.getZ(srcIndex) + (float) offset.z(), - ColorARGB.unpackRed(color) * 255.0f, - ColorARGB.unpackGreen(color) * 255.0f, - ColorARGB.unpackBlue(color) * 255.0f, - ColorARGB.unpackAlpha(color) * 255.0f, + ColorARGB.unpackRed(color) / 255.0f, + ColorARGB.unpackGreen(color) / 255.0f, + ColorARGB.unpackBlue(color) / 255.0f, + ColorARGB.unpackAlpha(color) / 255.0f, u, v, OverlayTexture.NO_OVERLAY, lightUv, @@ -81,4 +83,27 @@ public class BlockRendererMixin { } original.call(instance, ctx, builder, offset, material, quad, colors, light); } + + @Unique + private static boolean gtceu$isEmissive(BakedQuadView quad, QuadLightData light) { + if (!quad.hasShade() || !quad.hasAmbientOcclusion()) { + return true; + } + if (BloomMetadataSection.hasBloom(quad.getSprite())) { + return true; + } + + for (int i = 0; i < 4; i++) { + int quadLight = quad.getLight(i); + int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); + + int ambientLight = light.lm[i]; + int aBlock = LightTexture.block(ambientLight), aSky = LightTexture.sky(ambientLight); + + if (qBlock > aBlock || qSky > aSky) { + return true; + } + } + return false; + } } From 9ce14e8c6f5a1d371e6606de93dd1a94d7b6e40e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:18:08 +0300 Subject: [PATCH 032/269] remove unused PoseStackExtensions class --- .../gtceu/client/renderer/BlockHighlightRenderer.java | 3 --- .../renderer/machine/impl/QuantumChestItemRender.java | 3 --- .../gtceu/client/util/PoseStackExtensions.java | 11 ----------- 3 files changed, 17 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/PoseStackExtensions.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java index de352d7f65a..e4006b4ebe4 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.pipenet.IPipeType; -import com.gregtechceu.gtceu.client.util.PoseStackExtensions; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.item.CoverPlaceBehavior; import com.gregtechceu.gtceu.common.item.tool.rotation.CustomBlockRotations; @@ -36,7 +35,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import lombok.experimental.ExtensionMethod; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Vector3f; @@ -47,7 +45,6 @@ import static com.gregtechceu.gtceu.utils.GTMatrixUtils.*; @OnlyIn(Dist.CLIENT) -@ExtensionMethod(PoseStackExtensions.class) public class BlockHighlightRenderer { public static void renderBlockHighlight(PoseStack poseStack, Camera camera, BlockHitResult target, diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumChestItemRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumChestItemRender.java index 479c073e9ad..f9ce9280633 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumChestItemRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumChestItemRender.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; -import com.gregtechceu.gtceu.client.util.PoseStackExtensions; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.machine.storage.CreativeChestMachine; @@ -26,13 +25,11 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.serialization.Codec; -import lombok.experimental.ExtensionMethod; import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import static com.gregtechceu.gtceu.utils.GTMatrixUtils.*; -@ExtensionMethod(PoseStackExtensions.class) public class QuantumChestItemRender extends DynamicRender { // spotless:off diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/PoseStackExtensions.java b/src/main/java/com/gregtechceu/gtceu/client/util/PoseStackExtensions.java deleted file mode 100644 index ac411d26ada..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/util/PoseStackExtensions.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gregtechceu.gtceu.client.util; - -import com.mojang.blaze3d.vertex.PoseStack; -import org.joml.Matrix4fc; - -public class PoseStackExtensions { - - public static void mulPoseMatrix(PoseStack self, Matrix4fc matrix) { - self.last().pose().mul(matrix); - } -} From 2ab74d155c5ab3c808c6e3eb4d037bf9f1d318c3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 18 Jul 2025 23:54:26 +0300 Subject: [PATCH 033/269] use the enum directly in our configs instead of guessing the correct value based on an int --- .../gtceu/client/bloom/BloomEffectUtil.java | 9 +- .../gtceu/client/bloom/shader/BloomType.java | 25 +-- .../forge/ForgeClientEventListener.java | 4 + .../client/model/BloomMetadataSection.java | 3 +- .../client/particle/GTOverheatParticle.java | 13 +- .../machine/impl/FusionRingRender.java | 7 +- .../gtceu/client/shader/GTShaders.java | 15 +- .../gtceu/config/ConfigHolder.java | 153 +++++++++--------- 8 files changed, 105 insertions(+), 124 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index 256cc80f910..6a1332ea192 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -176,6 +176,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; + if (bloomType == BloomType.DISABLED) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.lock(); try { @@ -201,7 +202,7 @@ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { } } - for (Map.Entry> e : BLOOM_RENDERS.entrySet()) { + for (var e : BLOOM_RENDERS.entrySet()) { for (BloomRenderTicket ticket : e.getValue()) { if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { ticket.invalidate(); @@ -244,8 +245,9 @@ public static void renderBloom(Vec3 camPos, @NotNull Entity entity, PoseStack po draw(poseStack, buffer, context, list); } } - postDraw(); + RenderSystem.depthMask(false); + postDraw(); render(partialTicks, poseStack, projectionMatrix, camPos); return; @@ -406,7 +408,6 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro EffectInstance shader = pass.getEffect(); String name = shader.getName(); - shader.safeGetUniform("iTime").set(GTShaders.getITime(partialTicks)); shader.safeGetUniform("EnableFilter").set(BloomEffectUtil.isDrawingBlockBloom.get() ? 1 : 0); if (GTShaders.BLOOM_TYPE == BloomType.UNREAL && name.equals(SEPERABLE_BLUR_SHADER_NAME)) { @@ -450,7 +451,7 @@ public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pos int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); - if (GTShaders.allowedShader() && chunkOrigin != null || BloomMetadataSection.hasBloom(quad, combinedLights)) { + if (GTShaders.allowedShader() && chunkOrigin != null && BloomMetadataSection.hasBloom(quad, combinedLights)) { original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java index 7b51ee21327..a90d8b0c152 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.client.bloom.shader; -import org.jetbrains.annotations.NotNull; - public enum BloomType { /** @@ -17,26 +15,7 @@ public enum BloomType { */ UNREAL, /** - * No bloom at all :O + * No bloom at all */ - DISABLED; - - public int getValue() { - return switch (this) { - case GAUSSIAN -> 0; - case UNITY -> 1; - case UNREAL -> 2; - case DISABLED -> -1; - }; - } - - @NotNull - public static BloomType fromValue(int value) { - return switch (value) { - case 0 -> GAUSSIAN; - case 1 -> UNITY; - case 2 -> UNREAL; - default -> DISABLED; - }; - } + DISABLED } diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 7eb13564d97..06b7e02669d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -91,6 +91,10 @@ public static void onChunkUnloadEvent(ChunkEvent.Unload event) { @SubscribeEvent public static void onRenderTick(TickEvent.RenderTickEvent event) { if (event.phase == TickEvent.Phase.START && Minecraft.getInstance().level != null) { + if (!GTShaders.allowedShader()) { + return; + } + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java index ce540a58337..690d33c89dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.util.GTQuadTransformers; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; @@ -47,7 +48,7 @@ public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { if (hasBloom(quad.getSprite())) { return true; } - return isEmissive(quad, ambientPackedLights); + return ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom && isEmissive(quad, ambientPackedLights); } public static boolean isEmissive(BakedQuad quad, int[] ambientPackedLights) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 3f2f8cb3f03..8b3658a6507 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; +import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.bloom.shader.BloomType; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; @@ -265,8 +266,8 @@ protected IRenderSetup getBloomRenderSetup() { @NotNull @Override protected BloomType getBloomType() { - ConfigHolder.ClientConfigs.ShaderOptions.HeatEffectBloom heatEffectBloom = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; - return BloomType.fromValue(heatEffectBloom.useShader ? heatEffectBloom.bloomStyle : -1); + var config = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; + return config.useShader ? config.bloomAlgorithm : BloomType.DISABLED; } public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @@ -288,6 +289,14 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild @Override @OnlyIn(Dist.CLIENT) public void preDraw(@NotNull BufferBuilder buffer) { + var config = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; + + BloomEffect.strength = config.strength; + BloomEffect.baseBrightness = config.baseBrightness; + BloomEffect.highBrightnessThreshold = config.highBrightnessThreshold; + BloomEffect.lowBrightnessThreshold = config.lowBrightnessThreshold; + BloomEffect.step = 1; + RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.enableBlend(); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index ea759cb8e45..f68dcf06679 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -111,11 +111,6 @@ public boolean shouldRenderOffScreen(FusionReactorMachine machine) { return machine.recipeLogic.isWorking() || delta > 0; } - @Override - public int getViewDistance() { - return 32; - } - @Override public AABB getRenderBoundingBox(FusionReactorMachine machine) { return new AABB(machine.getPos()).inflate(getViewDistance() / 2.0D); @@ -123,7 +118,7 @@ public AABB getRenderBoundingBox(FusionReactorMachine machine) { private static BloomType getBloomType() { var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; - return BloomType.fromValue(config.useShader ? config.bloomStyle : -1); + return config.useShader ? config.bloomAlgorithm : BloomType.DISABLED; } @RequiredArgsConstructor diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index dd3af455cb5..993a4471694 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -29,7 +29,7 @@ public class GTShaders { public static final Minecraft mc = Minecraft.getInstance(); public static PostChain BLOOM_CHAIN; - public static BloomType BLOOM_TYPE; + public static BloomType BLOOM_TYPE = ConfigHolder.INSTANCE.client.shader.bloomAlgorithm; public static RenderTarget BLOOM_TARGET; public static Map BLOOM_BUFFERS = new HashMap<>(); @@ -51,21 +51,18 @@ private static void initPostShaders() { ResourceLocation id; - switch (ConfigHolder.INSTANCE.client.shader.bloomStyle) { - case 0 -> { + switch (BLOOM_TYPE) { + case GAUSSIAN -> { id = GTCEu.id("shaders/post/bloom_gaussian.json"); - BLOOM_TYPE = BloomType.GAUSSIAN; } - case 1 -> { + case UNITY -> { id = GTCEu.id("shaders/post/bloom_unity.json"); - BLOOM_TYPE = BloomType.UNITY; } - case 2 -> { + case UNREAL -> { id = GTCEu.id("shaders/post/bloom_unreal.json"); - BLOOM_TYPE = BloomType.UNREAL; } default -> { - GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomStyle); + GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomAlgorithm); BLOOM_TYPE = BloomType.DISABLED; BLOOM_CHAIN = null; BLOOM_TARGET = null; diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index eeb2b480cc8..cd709d0b8cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.client.bloom.shader.BloomType; import net.minecraft.commands.Commands; @@ -248,11 +249,11 @@ public static class MinimapCompatConfig { public String borderColor = "#00000000"; @Configurable - @Configurable.Comment({ "Which part of the screen to anchor buttons to", "Default: \"BOTTOM_LEFT\"" }) + @Configurable.Comment({ "Which part of the screen to anchor buttons to", "Default: BOTTOM_LEFT" }) public Anchor buttonAnchor = Anchor.BOTTOM_LEFT; @Configurable - @Configurable.Comment({ "Which direction the buttons will go", "Default: \"VERTICAL\"" }) + @Configurable.Comment({ "Which direction the buttons will go", "Default: VERTICAL" }) public Direction direction = Direction.VERTICAL; @Configurable @@ -747,24 +748,13 @@ public static class ClientConfigs { public int animationTime = 300; @Configurable public ArmorHud armorHud = new ArmorHud(); - @Configurable - public RendererConfigs renderer = new RendererConfigs(); - - public int getDefaultPaintingColor() { - // OR with full alpha to differentiate from a machine that's painted white (map color 0xffffff) - return Long.decode(defaultPaintingColor).intValue() | 0xff000000; - } + @Configurable + public RendererOptions renderer = new RendererOptions(); @Configurable @Configurable.Comment("Config options for Shaders and Post-processing Effects") public ShaderOptions shader = new ShaderOptions(); - @Configurable - @Configurable.Comment({ - "Whether to hook depth texture. Has no effect on performance, but if there is a problem with rendering, try disabling it.", - "Default: true" }) - public boolean hookDepthTexture = true; - public static class ArmorHud { @Configurable @@ -784,36 +774,29 @@ public static class ArmorHud { public static class ShaderOptions { - @Configurable - @Configurable.Comment("Bloom config options for the fusion reactor.") - public FusionBloom fusionBloom = new FusionBloom(); - @Configurable @Configurable.Comment("Particle config option for the Assembly Line") public boolean assemblyLineParticles = true; @Configurable - @Configurable.Comment("Bloom config options for the heat effect (cable burning).") - public HeatEffectBloom heatEffectBloom = new HeatEffectBloom(); - - @Configurable - @Configurable.Comment({ "Whether to use shader programs.", "Default: true" }) + @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) public boolean useShader = true; @Configurable - @Configurable.Comment({ "Whether or not to enable Emissive Textures with bloom effect.", "Default: true" }) + @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) public boolean emissiveTexturesBloom = true; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", - "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) - @Configurable.Range(min = 0, max = 2) - public int bloomStyle = 2; + @Configurable.Comment({ "Bloom Algorithm", + "GAUSSIAN - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", + "UNITY - Unity-like Bloom", + "UNREAL - Unreal-like Bloom", + "Default: UNREAL" }) + public BloomType bloomAlgorithm = BloomType.UNREAL; @Configurable @Configurable.Comment({ - "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights " + - "(e.g., daytime).", + "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) @Configurable.DecimalRange(min = 0) @@ -821,8 +804,7 @@ public static class ShaderOptions { @Configurable @Configurable.Comment({ - "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts " + - "(e.g., night/caves).", + "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts (e.g., night/caves)", "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) @Configurable.DecimalRange(min = 0) @@ -839,7 +821,7 @@ public static class ShaderOptions { @Configurable @Configurable.Comment({ "Bloom Strength", "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", - "Default: 2" }) + "Default: 1.5" }) @Configurable.DecimalRange(min = 0) public float strength = 1.5f; @@ -848,40 +830,48 @@ public static class ShaderOptions { @Configurable.DecimalRange(min = 0) public float step = 1.0f; + @Configurable + @Configurable.Comment("Bloom config options for the fusion reactor.") + public FusionBloom fusionBloom = new FusionBloom(); + + @Configurable + @Configurable.Comment("Bloom config options for the cable burning effect") + public HeatEffectBloom heatEffectBloom = new HeatEffectBloom(); + public static class FusionBloom { @Configurable - @Configurable.Comment({ "Whether to use shader programs.", "Default: true" }) + @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) public boolean useShader = true; @Configurable @Configurable.Comment({ "Bloom Strength", "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", - "Default: 2" }) + "Default: 1.5" }) @Configurable.DecimalRange(min = 0) public float strength = 1.5f; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", - "1 - Unity Bloom", "2 - Unreal Bloom", "Default: 2" }) - @Configurable.Range(min = 0, max = 2) - public int bloomStyle = 1; + @Configurable.Comment({ "Bloom Algorithm", + "GAUSSIAN - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", + "UNITY - Unity-like Bloom", + "UNREAL - Unreal-like Bloom", + "Default: UNREAL" }) + public BloomType bloomAlgorithm = BloomType.UNREAL; @Configurable @Configurable.Comment({ - "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights " + - "(e.g., daytime).", + "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", - "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) + "This value should be greater than lowBrightnessThreshold.", "Default: 1.3" }) @Configurable.DecimalRange(min = 0) public float highBrightnessThreshold = 1.3f; @Configurable @Configurable.Comment({ - "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts " + - "(e.g., night/caves).", + "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts (e.g., night/caves)", "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", - "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) + "This value should be smaller than highBrightnessThreshold.", "Default: 0.3" }) @Configurable.DecimalRange(min = 0) public float lowBrightnessThreshold = 0.3f; @@ -891,13 +881,13 @@ public static class FusionBloom { "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", "Default: 0.1" }) @Configurable.DecimalRange(min = 0) - public float baseBrightness = 0.0f; + public float baseBrightness = 0.1f; } public static class HeatEffectBloom { @Configurable - @Configurable.Comment({ "Whether to use shader programs.", "Default: true" }) + @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) public boolean useShader = true; @Configurable @@ -905,32 +895,31 @@ public static class HeatEffectBloom { "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", "Default: 2" }) @Configurable.DecimalRange(min = 0) - public double strength = 1.1; + public float strength = 2.0f; @Configurable - @Configurable.Comment({ "Bloom Algorithm", "0 - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", - "1 - Unity Bloom", - "2 - Unreal Bloom", "Default: 2" }) - @Configurable.Range(min = 0, max = 2) - public int bloomStyle = 2; + @Configurable.Comment({ "Bloom Algorithm", + "GAUSSIAN - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", + "UNITY - Unity-like Bloom", + "UNREAL - Unreal-like Bloom", + "Default: UNREAL" }) + public BloomType bloomAlgorithm = BloomType.UNREAL; @Configurable @Configurable.Comment({ - "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights " + - "(e.g., daytime).", + "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", - "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) + "This value should be greater than lowBrightnessThreshold.", "Default: 1.4" }) @Configurable.DecimalRange(min = 0) - public double highBrightnessThreshold = 1.4; + public float highBrightnessThreshold = 1.4f; @Configurable @Configurable.Comment({ - "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts " + - "(e.g., night/caves).", + "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts (e.g., night/caves)", "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", - "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) + "This value should be smaller than highBrightnessThreshold.", "Default: 0.6" }) @Configurable.DecimalRange(min = 0) - public double lowBrightnessThreshold = 0.6; + public float lowBrightnessThreshold = 0.6f; @Configurable @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", @@ -938,9 +927,31 @@ public static class HeatEffectBloom { "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", "Default: 0.1" }) @Configurable.DecimalRange(min = 0) - public double baseBrightness = 0; + public float baseBrightness = 0.1f; } } + + public static class RendererOptions { + + @Configurable + @Configurable.Comment({ "Render fluids in multiblocks that support them?", "Default: true" }) + public boolean renderFluids = true; + + @Configurable + @Configurable.Comment({ "Whether or not to color tiered machine highlights in the tier color", + "Default: true" }) + public boolean coloredTieredMachineOutline = true; + + @Configurable + @Configurable.Comment({ "Whether or not to color wire/cable highlights based on voltage tier", + "Default: true" }) + public boolean coloredWireOutline = true; + } + + public int getDefaultPaintingColor() { + // OR with full alpha to differentiate from a machine that's painted white (map color 0xffffff) + return Long.decode(defaultPaintingColor).intValue() | 0xff000000; + } } public static class DeveloperConfigs { @@ -964,20 +975,4 @@ public static class DeveloperConfigs { public boolean dumpAssets = false; } - public static class RendererConfigs { - - @Configurable - @Configurable.Comment({ "Render fluids in multiblocks that support them?", "Default: true" }) - public boolean renderFluids = true; - - @Configurable - @Configurable.Comment({ "Whether or not to color tiered machine highlights in the tier color", - "Default: true" }) - public boolean coloredTieredMachineOutline = true; - - @Configurable - @Configurable.Comment({ "Whether or not to color wire/cable highlights based on voltage tier", - "Default: true" }) - public boolean coloredWireOutline = true; - } } From a52e1b4b940fb6e4135fe97ba58c8c0c8e9043cc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:19:05 +0300 Subject: [PATCH 034/269] fix shader files' formatting --- .../gtceu/shaders/post/bloom_unity.json | 10 ++--- .../gtceu/shaders/post/bloom_unreal.json | 10 ++--- .../assets/gtceu/shaders/program/blit.fsh | 2 +- .../assets/gtceu/shaders/program/blit.json | 28 ++++++------- .../assets/gtceu/shaders/program/blit.vsh | 6 +-- .../gtceu/shaders/program/down_sampling.fsh | 2 +- .../gtceu/shaders/program/down_sampling.json | 12 +++--- .../shaders/program/filter_bloom_color.fsh | 4 +- .../shaders/program/filter_bloom_color.json | 4 +- .../gtceu/shaders/program/seperable_blur.fsh | 2 +- .../gtceu/shaders/program/seperable_blur.json | 34 +++++++-------- .../gtceu/shaders/program/unity_composite.fsh | 32 +++++++------- .../shaders/program/unity_composite.json | 22 +++++----- .../shaders/program/unreal_composite.fsh | 4 +- .../shaders/program/unreal_composite.json | 42 +++++++++---------- .../gtceu/shaders/program/up_sampling.fsh | 2 +- .../gtceu/shaders/program/up_sampling.json | 12 +++--- .../shaders/program/vanilla_composite.json | 22 +++++----- 18 files changed, 125 insertions(+), 125 deletions(-) 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 8f62f9d191a..1e02999d507 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -84,7 +84,7 @@ "intarget": "swap16a", "outtarget": "swap8b", "auxtargets": [ - {"id":"swap8a", "name":"DownTexture"} + { "id":"swap8a", "name":"DownTexture" } ] }, { @@ -92,7 +92,7 @@ "intarget": "swap8b", "outtarget": "swap4b", "auxtargets": [ - {"id":"swap4a", "name":"DownTexture"} + { "id":"swap4a", "name":"DownTexture" } ] }, { @@ -100,7 +100,7 @@ "intarget": "swap4b", "outtarget": "swap2b", "auxtargets": [ - {"id":"swap2a", "name":"DownTexture"} + { "id":"swap2a", "name":"DownTexture" } ] }, { @@ -108,8 +108,8 @@ "intarget": "swap2b", "outtarget": "final", "auxtargets": [ - {"id":"minecraft:main", "name":"DownTexture"}, - {"id":"minecraft:main", "name":"Background"} + { "id":"minecraft:main", "name":"DownTexture" }, + { "id":"minecraft:main", "name":"Background" } ] }, { 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 111405b9026..8c2a2bdf115 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -208,11 +208,11 @@ "intarget": "minecraft:main", "outtarget": "final", "auxtargets": [ - {"id":"gtceu:filter_temp", "name":"HighLight"}, - {"id":"swap2b", "name":"BlurTexture1"}, - {"id":"swap4b", "name":"BlurTexture2"}, - {"id":"swap8b", "name":"BlurTexture3"}, - {"id":"swap16b", "name":"BlurTexture4"} + { "id":"gtceu:filter_temp", "name":"HighLight" }, + { "id":"swap2b", "name":"BlurTexture1" }, + { "id":"swap4b", "name":"BlurTexture2" }, + { "id":"swap8b", "name":"BlurTexture3" }, + { "id":"swap16b", "name":"BlurTexture4" } ], "uniforms": [ { diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.fsh b/src/main/resources/assets/gtceu/shaders/program/blit.fsh index 282a9d7deb4..b750ae82147 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blit.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/blit.fsh @@ -6,6 +6,6 @@ in vec2 texCoord; out vec4 fragColor; -void main(){ +void main() { fragColor = texture(DiffuseSampler, texCoord); } diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.json b/src/main/resources/assets/gtceu/shaders/program/blit.json index dce11ef4dc4..9ace4e54d97 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blit.json +++ b/src/main/resources/assets/gtceu/shaders/program/blit.json @@ -1,16 +1,16 @@ { - "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" - }, - "vertex": "gtceu:blit", - "fragment": "gtceu:blit", - "attributes": [ "Position" ], - "samplers": [ - { "name": "DiffuseSampler" } - ], - "uniforms": [ - { "name": "OutSize", "type": "float","count": 2, "values": [ 1.0, 1.0 ] } - ] + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:blit", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + { "name": "OutSize", "type": "float","count": 2, "values": [ 1.0, 1.0 ] } + ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.vsh b/src/main/resources/assets/gtceu/shaders/program/blit.vsh index f5ee1128912..bfa0b730de8 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blit.vsh +++ b/src/main/resources/assets/gtceu/shaders/program/blit.vsh @@ -6,13 +6,13 @@ uniform vec2 OutSize; out vec2 texCoord; -void main(){ +void main() { float x = -1.0; float y = -1.0; - if (Position.x > 0.001){ + if (Position.x > 0.001) { x = 1.0; } - if (Position.y > 0.001){ + if (Position.y > 0.001) { y = 1.0; } gl_Position = vec4(x, y, 0.2, 1.0); diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh index ba28dae9bc5..e371054f810 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh @@ -14,7 +14,7 @@ vec4 four_k(vec3 textel, vec2 uv) { + texture(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 } -void main(){ +void main() { vec3 textel1 = vec3(1., -1., 0.) / InSize.xyx; vec3 textel2 = vec3(1., -1., 0.) / OutSize.xyx; diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json index 76f5eb3a64f..4a429e90c25 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json @@ -1,17 +1,17 @@ { "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" }, "vertex": "gtceu:blit", "fragment": "gtceu:down_sampling", "attributes": [ "Position" ], "samplers": [ - { "name": "DiffuseSampler" } + { "name": "DiffuseSampler" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.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": "InSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] } ] } 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 3ce28090828..041aa14be7b 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 @@ -8,9 +8,9 @@ in vec2 texCoord; out vec4 fragColor; -void main(){ +void main() { fragColor = texture(DiffuseSampler, texCoord); - if (EnableFilter){ + if (EnableFilter) { vec4 mainColor = texture(MainSampler, texCoord); if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.01){ fragColor = vec4(0.0); diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 736f5f855b1..be5f41dc9f3 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -12,7 +12,7 @@ { "name": "MainSampler"} ], "uniforms": [ - {"name": "OutSize", "type": "float", "count": 2, "values": [1.0, 1.0]}, - {"name": "EnableFilter", "type": "int", "count": 1, "values": [1.0]} + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh index c70659dd855..48119fee553 100644 --- a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh @@ -12,7 +12,7 @@ float gaussianPdf(in float x, in float sigma) { return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma; } -void main(){ +void main() { vec2 invSize = 1.0 / OutSize; float fSigma = Radius; float weightSum = gaussianPdf(0.0, fSigma); diff --git a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json index 11e24caac94..c12df249200 100644 --- a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json +++ b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json @@ -1,20 +1,18 @@ { - "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" - }, - "vertex": "gtceu:blit", - "fragment": "gtceu:seperable_blur", - "attributes": [ - "Position" - ], - "samplers": [ - {"name": "DiffuseSampler"} - ], - "uniforms": [ - {"name": "OutSize", "type": "float", "count": 2, "values": [1.0, 1.0]}, - {"name": "BlurDir", "type": "float", "count": 2, "values": [0.0, 0.0]}, - {"name": "Radius", "type": "float", "count": 1, "values": [5]} - ] + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:seperable_blur", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" } + ], + "uniforms": [ + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BlurDir", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "Radius", "type": "float", "count": 1, "values": [ 5 ] } + ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh index fdf48500ef4..8b4bab244ca 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh @@ -13,32 +13,34 @@ in vec2 texCoord; out vec4 fragColor; vec4 four_k(vec3 textel, vec2 uv) { - return (texture(DiffuseSampler, uv + textel.xx) //1 1 - + texture(DiffuseSampler, uv + textel.xy) // 1 -1 - + texture(DiffuseSampler, uv + textel.yx) // -1 1 - + texture(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 + return 0.25 * ( + texture(DiffuseSampler, uv + textel.xx) // 1 1 + + texture(DiffuseSampler, uv + textel.xy) // 1 -1 + + texture(DiffuseSampler, uv + textel.yx) // -1 1 + + texture(DiffuseSampler, uv + textel.yy) // -1 -1 + ); } vec4 up_sampling(vec3 textel, vec2 uv) { return vec4(four_k(textel, uv).rgb + texture(DownTexture, uv).rgb, 1.); } -void main(){ +void main() { vec3 textel = vec3(1., -1., 0.) / OutSize.xyx; // out_colour = up_sampling(textel, texCoord); - vec4 out_colour = texture(DiffuseSampler, texCoord + textel.xx); - out_colour += texture(DiffuseSampler, texCoord + textel.xz) * 2.0; - out_colour += texture(DiffuseSampler, texCoord + textel.xy); - out_colour += texture(DiffuseSampler, texCoord + textel.yz) * 2.0; - out_colour += texture(DiffuseSampler, texCoord) * 4.0; - out_colour += texture(DiffuseSampler, texCoord + textel.zx) * 2.0; - out_colour += texture(DiffuseSampler, texCoord + textel.yy); - out_colour += texture(DiffuseSampler, texCoord + textel.zy) * 2.0; - out_colour += texture(DiffuseSampler, texCoord + textel.yx); + vec4 out_color = texture(DiffuseSampler, texCoord + textel.xx); + out_color += texture(DiffuseSampler, texCoord + textel.xz) * 2.0; + out_color += texture(DiffuseSampler, texCoord + textel.xy); + out_color += texture(DiffuseSampler, texCoord + textel.yz) * 2.0; + out_color += texture(DiffuseSampler, texCoord) * 4.0; + out_color += texture(DiffuseSampler, texCoord + textel.zx) * 2.0; + out_color += texture(DiffuseSampler, texCoord + textel.yy); + out_color += texture(DiffuseSampler, texCoord + textel.zy) * 2.0; + out_color += texture(DiffuseSampler, texCoord + textel.yx); vec4 highLight = texture(DownTexture, texCoord); - vec4 bloom = BloomIntensive * vec4(out_colour.rgb * 0.8 / 16. + highLight.rgb * 0.8, 1.); + vec4 bloom = BloomIntensive * vec4(out_color.rgb * 0.8 / 16. + highLight.rgb * 0.8, 1.); vec4 background = texture(Background, texCoord); background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json index b5ea58a6d24..45692b1c164 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -1,22 +1,22 @@ { "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" }, "vertex": "gtceu:blit", "fragment": "gtceu:unity_composite", "attributes": [ "Position" ], "samplers": [ - { "name": "DiffuseSampler" }, - { "name": "DownTexture" }, - { "name": "Background" } + { "name": "DiffuseSampler" }, + { "name": "DownTexture" }, + { "name": "Background" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, - { "name": "BloomBase","type": "float","count": 1, "values": [ 0.0 ] }, - { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 1.3 ] }, - { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.3 ] } + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, + { "name": "BloomBase","type": "float","count": 1, "values": [ 0.0 ] }, + { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 1.3 ] }, + { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.3 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh index 275d18e3a37..09da3a4602a 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -29,7 +29,7 @@ vec3 aces(vec3 x) { return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0); } -vec3 aces_tonemap(vec3 color){ +vec3 aces_tonemap(vec3 color) { mat3 m1 = mat3( 0.59719, 0.07600, 0.02840, 0.35458, 0.90834, 0.13383, @@ -46,7 +46,7 @@ vec3 aces_tonemap(vec3 color){ return pow(clamp(m2 * (a / b), 0.0, 1.0), vec3(1.0 / 2.2)); } -vec3 jodieReinhardTonemap(vec3 c){ +vec3 jodieReinhardTonemap(vec3 c) { float l = dot(c, vec3(0.2126, 0.7152, 0.0722)); vec3 tc = c / (c + 1.0); diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index ffebf1270cf..7f9d3a53dad 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -1,23 +1,23 @@ { - "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" - }, - "vertex": "gtceu:blit", - "fragment": "gtceu:unreal_composite", - "attributes": [ "Position" ], - "samplers": [ - { "name": "DiffuseSampler" }, - { "name": "HighLight" }, - { "name": "BlurTexture1" }, - { "name": "BlurTexture2" }, - { "name": "BlurTexture3" }, - { "name": "BlurTexture4" } - ], - "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BloomRadius","type": "float","count": 1, "values": [ 1.0 ] }, - { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] } - ] + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "gtceu:blit", + "fragment": "gtceu:unreal_composite", + "attributes": [ "Position" ], + "samplers": [ + { "name": "DiffuseSampler" }, + { "name": "HighLight" }, + { "name": "BlurTexture1" }, + { "name": "BlurTexture2" }, + { "name": "BlurTexture3" }, + { "name": "BlurTexture4" } + ], + "uniforms": [ + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomRadius","type": "float","count": 1, "values": [ 1.0 ] }, + { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] } + ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh index 7500b29e3e3..44d0c35b3f3 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh @@ -18,7 +18,7 @@ vec4 up_sampling(vec3 textel, vec2 uv) { return vec4(four_k(textel, uv).rgb + texture(DownTexture, uv).rgb, 1.); } -void main(){ +void main() { vec3 textel = vec3(1., -1., 0.) / OutSize.xyx; // out_colour = up_sampling(textel, texCoord); diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json index 95ca43d7c10..69d6f94e306 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -1,17 +1,17 @@ { "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" }, "vertex": "gtceu:blit", "fragment": "gtceu:up_sampling", "attributes": [ "Position" ], "samplers": [ - { "name": "DiffuseSampler" }, - { "name": "DownTexture" } + { "name": "DiffuseSampler" }, + { "name": "DownTexture" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] } + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json index be846baf58c..33a8032c006 100644 --- a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json @@ -1,22 +1,22 @@ { "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" }, "vertex": "gtceu:blit", "fragment": "gtceu:vanilla_composite", "attributes": [ "Position" ], "samplers": [ - { "name": "DiffuseSampler" }, - { "name": "HighLight" }, - { "name": "BlurTexture" } + { "name": "DiffuseSampler" }, + { "name": "HighLight" }, + { "name": "BlurTexture" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, - { "name": "BloomBase","type": "float","count": 1, "values": [ 0.1 ] }, - { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 0.7 ] }, - { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.2 ] } + { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, + { "name": "BloomBase","type": "float","count": 1, "values": [ 0.1 ] }, + { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 0.7 ] }, + { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.2 ] } ] } From f006fab83940a76aa532cdbf43c9e48dd9571c5d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:22:46 +0300 Subject: [PATCH 035/269] rename BloomType -> BloomAlgorithm --- .../gtceu/client/bloom/BloomEffectUtil.java | 52 +++++++++---------- .../gtceu/client/bloom/IBloomEffect.java | 4 +- .../bloom/particle/GTBloomParticle.java | 4 +- .../{BloomType.java => BloomAlgorithm.java} | 2 +- .../client/particle/GTOverheatParticle.java | 6 +-- .../machine/impl/FusionRingRender.java | 6 +-- .../gtceu/client/shader/GTShaders.java | 18 ++++--- .../gtceu/config/ConfigHolder.java | 8 +-- 8 files changed, 51 insertions(+), 49 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/bloom/shader/{BloomType.java => BloomAlgorithm.java} (89%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index 6a1332ea192..1495fce3813 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; -import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; @@ -59,7 +59,7 @@ public class BloomEffectUtil { *

* * @param setup Render setup, if exists - * @param bloomType Type of the bloom + * @param algorithm Type of the bloom * @param render Rendering callback * @param blockEntity Meta tile entity instance * @return Ticket for the registered bloom render callback @@ -67,11 +67,11 @@ public class BloomEffectUtil { */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomType bloomType, + @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @NotNull BlockEntity blockEntity) { Objects.requireNonNull(blockEntity, "blockEntity == null"); - return registerBloomRender(setup, bloomType, + return registerBloomRender(setup, algorithm, new IBloomEffect() { @Override @@ -102,7 +102,7 @@ public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { *

* * @param setup Render setup, if exists - * @param bloomType Type of the bloom + * @param algorithm Type of the bloom * @param render Rendering callback * @param particle Particle instance * @return Ticket for the registered bloom render callback @@ -110,11 +110,11 @@ public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomType bloomType, + @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @NotNull GTParticle particle) { Objects.requireNonNull(particle, "particle == null"); - return registerBloomRender(setup, bloomType, render, t -> particle.isAlive()); + return registerBloomRender(setup, algorithm, render, t -> particle.isAlive()); } /** @@ -128,22 +128,22 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup *

* * @param setup Render setup, if exists - * @param bloomType Type of the bloom + * @param algorithm Type of the bloom * @param render Rendering callback * @param validityChecker Optional validity checker; returning {@code false} causes the ticket to be invalidated. * Checked on both pre-/post-render each frame. * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null} - * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, BlockEntity) - * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, GTParticle) - * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, Predicate, Supplier) + * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity) + * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, GTParticle) + * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, Predicate, Supplier) */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomType bloomType, + @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @Nullable Predicate validityChecker) { - return registerBloomRender(setup, bloomType, render, validityChecker, null); + return registerBloomRender(setup, algorithm, render, validityChecker, null); } /** @@ -157,7 +157,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup *

* * @param setup Render setup, if exists - * @param bloomType Type of the bloom + * @param algorithm Type of the bloom * @param render Rendering callback * @param validityChecker Optional validity checker; returning {@code false} causes the ticket to be invalidated. * Checked on both pre/post render each frame. @@ -166,18 +166,18 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup * it will not be affected by aforementioned automatic invalidation. * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null} - * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, BlockEntity) - * @see #registerBloomRender(IRenderSetup, BloomType, IBloomEffect, GTParticle) + * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity) + * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, GTParticle) */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomType bloomType, + @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; - if (bloomType == BloomType.DISABLED) return BloomRenderTicket.INVALID; - BloomRenderTicket ticket = new BloomRenderTicket(setup, bloomType, render, validityChecker, worldContext); + if (algorithm == BloomAlgorithm.DISABLED) return BloomRenderTicket.INVALID; + BloomRenderTicket ticket = new BloomRenderTicket(setup, algorithm, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.lock(); try { SCHEDULED_BLOOM_RENDERS.add(ticket); @@ -285,7 +285,7 @@ public static void renderBloom(Vec3 camPos, @NotNull Entity entity, PoseStack po private static void preDraw() { for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { if (!ticket.isValid()) continue; - BLOOM_RENDERS.computeIfAbsent(new BloomRenderKey(ticket.renderSetup, ticket.bloomType), + BLOOM_RENDERS.computeIfAbsent(new BloomRenderKey(ticket.renderSetup, ticket.algorithm), k -> new ArrayList<>()).add(ticket); } SCHEDULED_BLOOM_RENDERS.clear(); @@ -410,7 +410,7 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro shader.safeGetUniform("EnableFilter").set(BloomEffectUtil.isDrawingBlockBloom.get() ? 1 : 0); - if (GTShaders.BLOOM_TYPE == BloomType.UNREAL && name.equals(SEPERABLE_BLUR_SHADER_NAME)) { + if (GTShaders.BLOOM_TYPE == BloomAlgorithm.UNREAL && name.equals(SEPERABLE_BLUR_SHADER_NAME)) { int index = passes.indexOf(pass); switch (index) { case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); @@ -461,7 +461,7 @@ public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pos combinedLights, combinedOverlay, mulColor); } - private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType) { + private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomAlgorithm algorithm) { } @@ -471,7 +471,7 @@ public static final class BloomRenderTicket { @Nullable private final IRenderSetup renderSetup; - private final BloomType bloomType; + private final BloomAlgorithm algorithm; private final IBloomEffect render; @Nullable private final Predicate validityChecker; @@ -481,15 +481,15 @@ public static final class BloomRenderTicket { private boolean invalidated; BloomRenderTicket() { - this(null, BloomType.DISABLED, (p, b, c) -> {}, null, null); + this(null, BloomAlgorithm.DISABLED, (p, b, c) -> {}, null, null); this.invalidated = true; } - BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomType bloomType, + BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { this.renderSetup = renderSetup; - this.bloomType = Objects.requireNonNull(bloomType, "bloomType == null"); + this.algorithm = Objects.requireNonNull(algorithm, "algorithm == null"); this.render = Objects.requireNonNull(render, "render == null"); this.validityChecker = validityChecker; this.worldContext = worldContext; diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java index 9c817626e5a..a30e75939d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.bloom; -import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; @@ -12,7 +12,7 @@ /** * Render callback interface for - * {@link BloomEffectUtil#registerBloomRender(IRenderSetup, BloomType, IBloomEffect, BlockEntity)}. + * {@link BloomEffectUtil#registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity)}. */ @FunctionalInterface public interface IBloomEffect { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java index 51eb717a9e8..ebc03f09644 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; -import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.client.bloom.IBloomEffect; @@ -20,5 +20,5 @@ public GTBloomParticle(double posX, double posY, double posZ) { protected abstract IRenderSetup getBloomRenderSetup(); @NotNull - protected abstract BloomType getBloomType(); + protected abstract BloomAlgorithm getBloomType(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomAlgorithm.java similarity index 89% rename from src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomAlgorithm.java index a90d8b0c152..37c9056d579 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomType.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomAlgorithm.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.bloom.shader; -public enum BloomType { +public enum BloomAlgorithm { /** * Simple Gaussian Blur diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 8b3658a6507..f98d36befcb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; -import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.client.util.RenderUtil; @@ -265,9 +265,9 @@ protected IRenderSetup getBloomRenderSetup() { @NotNull @Override - protected BloomType getBloomType() { + protected BloomAlgorithm getBloomType() { var config = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; - return config.useShader ? config.bloomAlgorithm : BloomType.DISABLED; + return config.useShader ? config.bloomAlgorithm : BloomAlgorithm.DISABLED; } public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index f68dcf06679..771137cdb2f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; -import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.bloom.IBloomEffect; @@ -116,9 +116,9 @@ public AABB getRenderBoundingBox(FusionReactorMachine machine) { return new AABB(machine.getPos()).inflate(getViewDistance() / 2.0D); } - private static BloomType getBloomType() { + private static BloomAlgorithm getBloomType() { var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; - return config.useShader ? config.bloomAlgorithm : BloomType.DISABLED; + return config.useShader ? config.bloomAlgorithm : BloomAlgorithm.DISABLED; } @RequiredArgsConstructor diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 993a4471694..37be942070e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; import net.irisshaders.iris.api.v0.IrisApi; @@ -28,13 +28,13 @@ public class GTShaders { public static final Minecraft mc = Minecraft.getInstance(); - public static PostChain BLOOM_CHAIN; - public static BloomType BLOOM_TYPE = ConfigHolder.INSTANCE.client.shader.bloomAlgorithm; - public static RenderTarget BLOOM_TARGET; + public static PostChain BLOOM_CHAIN = null; + public static BloomAlgorithm BLOOM_TYPE = ConfigHolder.INSTANCE.client.shader.bloomAlgorithm; + public static RenderTarget BLOOM_TARGET = null; public static Map BLOOM_BUFFERS = new HashMap<>(); public static Map BLOOM_BUFFER_BUILDERS = new HashMap<>(); - public static Map RENDERED_BLOOM_BUFFERS = new HashMap<>(); + public static Map BLOOM_BUFFER_SORT_STATES = new HashMap<>(); public static void onRegisterShaders(RegisterShadersEvent event) { if (!allowedShader()) { @@ -61,11 +61,13 @@ private static void initPostShaders() { case UNREAL -> { id = GTCEu.id("shaders/post/bloom_unreal.json"); } + case DISABLED -> { + return; + } default -> { GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomAlgorithm); - BLOOM_TYPE = BloomType.DISABLED; - BLOOM_CHAIN = null; - BLOOM_TARGET = null; + ConfigHolder.INSTANCE.client.shader.bloomAlgorithm = BloomAlgorithm.DISABLED; + BLOOM_TYPE = BloomAlgorithm.DISABLED; return; } } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index cd709d0b8cc..259f9c47f4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.client.bloom.shader.BloomType; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import net.minecraft.commands.Commands; @@ -792,7 +792,7 @@ public static class ShaderOptions { "UNITY - Unity-like Bloom", "UNREAL - Unreal-like Bloom", "Default: UNREAL" }) - public BloomType bloomAlgorithm = BloomType.UNREAL; + public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; @Configurable @Configurable.Comment({ @@ -857,7 +857,7 @@ public static class FusionBloom { "UNITY - Unity-like Bloom", "UNREAL - Unreal-like Bloom", "Default: UNREAL" }) - public BloomType bloomAlgorithm = BloomType.UNREAL; + public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; @Configurable @Configurable.Comment({ @@ -903,7 +903,7 @@ public static class HeatEffectBloom { "UNITY - Unity-like Bloom", "UNREAL - Unreal-like Bloom", "Default: UNREAL" }) - public BloomType bloomAlgorithm = BloomType.UNREAL; + public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; @Configurable @Configurable.Comment({ From 34081c0d253d0a877db01332b8be801f9eb4d985 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:23:17 +0300 Subject: [PATCH 036/269] fix shaders not loading --- .../gtceu/client/shader/GTShaders.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 37be942070e..47f52bbe32a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -37,7 +37,7 @@ public class GTShaders { public static Map BLOOM_BUFFER_SORT_STATES = new HashMap<>(); public static void onRegisterShaders(RegisterShadersEvent event) { - if (!allowedShader()) { + if (!innerAllowedShader()) { return; } @@ -88,17 +88,13 @@ private static void initPostShaders() { } public static boolean allowedShader() { - return ConfigHolder.INSTANCE.client.shader.useShader && - GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && - !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); + return BLOOM_CHAIN != null && innerAllowedShader(); } - public static float getITime(float pPartialTicks) { - if (mc.level == null) { - return System.currentTimeMillis() % 1200000 / 1000f; - } else { - return ((mc.level.getGameTime() % 24000) + pPartialTicks) / 20f; - } + private static boolean innerAllowedShader() { + return ConfigHolder.INSTANCE.client.shader.useShader && + !GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && + !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); } private static class IrisCallWrapper { From 23d20cc818e58415220301ed24f35e0cce933fae Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:23:38 +0300 Subject: [PATCH 037/269] enable vertex sorting on the bloom render type --- .../com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c7d49c2cc3e..df1e6423f3d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -37,7 +37,7 @@ public class GTRenderTypes extends RenderType { private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, - 2097152, false, false, + 2097152, false, true, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) .setShaderState(RenderStateShard.RENDERTYPE_TRANSLUCENT_SHADER) From 89091c4dc09702648fab1e02b3d8faaa2add2dc5 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:25:01 +0300 Subject: [PATCH 038/269] fix vertices not being sorted --- .../gtceu/client/bloom/BloomEffectUtil.java | 158 ++++++++++++++---- .../forge/ForgeClientEventListener.java | 23 ++- .../gtceu/client/util/RenderBufferHelper.java | 4 +- 3 files changed, 142 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index 1495fce3813..bf28a401620 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.client.bloom; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; @@ -7,15 +8,18 @@ import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.client.LevelRendererAccessor; import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; +import net.minecraft.Util; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.EffectInstance; -import net.minecraft.client.renderer.PostPass; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -23,6 +27,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.ForgeHooksClient; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.mojang.blaze3d.platform.GlStateManager; @@ -218,11 +223,13 @@ public static void init() {} public static final AtomicBoolean isDrawingBlockBloom = new AtomicBoolean(false); - public static void renderBloom(Vec3 camPos, @NotNull Entity entity, PoseStack poseStack, - Matrix4f projectionMatrix, Frustum frustum, float partialTicks) { + public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRenderer levelRenderer, + PoseStack poseStack, Matrix4f projectionMatrix, Frustum frustum, + float partialTicks) { if (!GTShaders.allowedShader()) { return; } + Vec3 camPos = camera.getPosition(); Minecraft.getInstance().getProfiler().popPush("gtceu_block_bloom"); BLOOM_RENDER_LOCK.lock(); @@ -250,6 +257,16 @@ public static void renderBloom(Vec3 camPos, @NotNull Entity entity, PoseStack po postDraw(); render(partialTicks, poseStack, projectionMatrix, camPos); + + postDraw(); + VertexBuffer.unbind(); + Minecraft.getInstance().getProfiler().pop(); + + //noinspection UnstableApiUsage + ForgeHooksClient.dispatchRenderStage(GTRenderTypes.getBloom(), levelRenderer, + poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); + + GTRenderTypes.getBloom().clearRenderState(); return; } @@ -276,6 +293,13 @@ public static void renderBloom(Vec3 camPos, @NotNull Entity entity, PoseStack po isDrawingBlockBloom.set(false); postDraw(); + VertexBuffer.unbind(); + Minecraft.getInstance().getProfiler().pop(); + + //noinspection UnstableApiUsage + ForgeHooksClient.dispatchRenderStage(GTRenderTypes.getBloom(), levelRenderer, + poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); + GTRenderTypes.getBloom().clearRenderState(); } finally { BLOOM_RENDER_LOCK.unlock(); @@ -332,6 +356,23 @@ private static void postDraw() { } } + public static void finishBloomBuffer(BlockPos pos, BufferBuilder builder) { + BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); + if (buffer != null) { + if (RenderSystem.isOnRenderThread()) { + VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, + $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); + BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); + } else { + RenderSystem.recordRenderCall(() -> { + VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, + $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); + BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); + }); + } + } + } + public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, VertexBuffer buffer) { if (!buffer.isInvalid()) { buffer.bind(); @@ -350,7 +391,6 @@ public static void removeBloomChunk(BlockPos origin) { buffer.close(); } } - GTShaders.RENDERED_BLOOM_BUFFERS.remove(origin); } public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { @@ -362,8 +402,8 @@ public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { return builder; } - public static void bakeBloomChunkBuffers(BlockPos pos) { - if (!GTShaders.allowedShader()) { + public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { + if (!GTShaders.allowedShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { return; } @@ -371,21 +411,11 @@ public static void bakeBloomChunkBuffers(BlockPos pos) { if (builder == null || !builder.building()) { return; } - BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); - if (buffer != null) { - GTShaders.RENDERED_BLOOM_BUFFERS.put(pos, buffer); - if (RenderSystem.isOnRenderThread()) { - VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, - $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); - } else { - RenderSystem.recordRenderCall(() -> { - VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, - $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); - }); - } - } + GTShaders.BLOOM_BUFFER_BUILDERS.remove(pos, builder); + builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); + + GTShaders.BLOOM_BUFFER_SORT_STATES.put(pos, builder.getSortState()); + finishBloomBuffer(pos, builder); } public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); @@ -402,6 +432,7 @@ public static void bakeBloomChunkBuffers(BlockPos pos) { private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.enableDepthTest(); // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { @@ -412,9 +443,10 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro if (GTShaders.BLOOM_TYPE == BloomAlgorithm.UNREAL && name.equals(SEPERABLE_BLUR_SHADER_NAME)) { int index = passes.indexOf(pass); - switch (index) { - case 1, 3, 5, 7 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); - case 2, 4, 6, 8 -> shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); + if (index % 2 == 0) { + shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); + } else { + shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); } } if (name.equals(UNITY_COMPOSITE_SHADER_NAME) || name.equals(UNREAL_COMPOSITE_SHADER_NAME)) { @@ -435,30 +467,92 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro poseStack.pushPose(); poseStack.translate(entry.getKey().getX(), entry.getKey().getY(), entry.getKey().getZ()); poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); - entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, RenderSystem.getShader()); + + entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, GameRenderer.getRendertypeTranslucentShader()); + poseStack.popPose(); } - GTShaders.BLOOM_CHAIN.process(partialTicks); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); - VertexBuffer.unbind(); + RenderSystem.disableDepthTest(); + RenderSystem.resetTextureMatrix(); + GTShaders.BLOOM_CHAIN.process(partialTicks); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } + private static double xBloomOld; + private static double yBloomOld; + private static double zBloomOld; + + public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) { + if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { + return; + } + + Minecraft.getInstance().getProfiler().push("translucent_sort"); + + double camX = camPos.x; + double camY = camPos.y; + double camZ = camPos.z; + + double distX = camX - xBloomOld; + double distY = camY - yBloomOld; + double distZ = camZ - zBloomOld; + if (distX * distX + distY * distY + distZ * distZ > 1.0D) { + int sectionX = SectionPos.posToSectionCoord(camX); + int sectionZ = SectionPos.posToSectionCoord(camY); + int sectionY = SectionPos.posToSectionCoord(camZ); + boolean posChanged = sectionX != SectionPos.posToSectionCoord(xBloomOld) || + sectionY != SectionPos.posToSectionCoord(zBloomOld) || + sectionZ != SectionPos.posToSectionCoord(yBloomOld); + xBloomOld = camX; + yBloomOld = camY; + zBloomOld = camZ; + int amount = 0; + + LevelRendererAccessor accessor = (LevelRendererAccessor) renderer; + for(LevelRenderer.RenderChunkInfo info : accessor.gtceu$getRenderChunksInFrustum()) { + BlockPos pos = SectionPos.of(sectionX, sectionY, sectionZ).origin(); + if (!GTShaders.BLOOM_BUFFERS.containsKey(pos) || !GTShaders.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { + continue; + } + + if (amount < 15 && (posChanged || info.isAxisAlignedWith(sectionX, sectionY, sectionZ))) { + Util.backgroundExecutor().submit(() -> BloomEffectUtil.resortTransparencyInner(pos, camPos)); + ++amount; + } + } + } + + Minecraft.getInstance().getProfiler().pop(); + } + + private static void resortTransparencyInner(BlockPos pos, Vec3 camPos) { + BufferBuilder builder = getOrStartBloomBuffer(pos); + builder.restoreSortState(GTShaders.BLOOM_BUFFER_SORT_STATES.get(pos)); + builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); + finishBloomBuffer(pos, builder); + } + public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { + original.call(consumer, pose, quad, + colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + if (!GTShaders.allowedShader()) { + return; + } + BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); - if (GTShaders.allowedShader() && chunkOrigin != null && BloomMetadataSection.hasBloom(quad, combinedLights)) { + if (chunkOrigin != null && BloomMetadataSection.hasBloom(quad, combinedLights)) { original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); } - original.call(consumer, pose, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); } private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomAlgorithm algorithm) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 06b7e02669d..b4a23fb1fde 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -20,6 +20,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.resources.ResourceLocation; @@ -58,16 +59,20 @@ public class ForgeClientEventListener { @SubscribeEvent public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { - if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) { - Camera camera = event.getCamera(); - PoseStack poseStack = event.getPoseStack(); - float partialTick = event.getPartialTick(); - // to render the preview after block entities, before the translucent. so it can be seen through the - // transparent blocks. + LevelRenderer levelRenderer = event.getLevelRenderer(); + Camera camera = event.getCamera(); + PoseStack poseStack = event.getPoseStack(); + float partialTick = event.getPartialTick(); + + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SKY) { + BloomEffectUtil.resortBloomTransparency(camera.getPosition(), levelRenderer); + } else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_BLOCK_ENTITIES) { + // to render the preview after block entities, before the translucent. + // so it can be seen through the transparent blocks. MultiblockInWorldPreviewRenderer.renderInWorldPreview(poseStack, camera, partialTick); - - BloomEffectUtil.renderBloom(camera.getPosition(), camera.getEntity(), poseStack, - event.getProjectionMatrix(), event.getFrustum(), partialTick); + } else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { + BloomEffectUtil.renderBloom(camera, camera.getEntity(), levelRenderer, + poseStack, event.getProjectionMatrix(), event.getFrustum(), partialTick); } } 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 478c41487ae..100e5727df8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java @@ -40,8 +40,8 @@ public class RenderBufferHelper { * @param alpha transparency * @param axis The axial direction of the "ring pipe" determines which axis the "ring pipe" rotates around. */ - public static void renderRing(PoseStack poseStack, VertexConsumer buffer, float x, float y, float z, float r, - float tubeRadius, + public static void renderRing(PoseStack poseStack, VertexConsumer buffer, float x, float y, float z, + float r, float tubeRadius, int sides, int segments, float red, float green, float blue, float alpha, Direction.Axis axis) { Matrix4f mat = poseStack.last().pose(); From 57b0a9bcbb56e49ff03ce1bd4bb3afa39f013dc2 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:28:41 +0300 Subject: [PATCH 039/269] try to make embeddium handle the bloom as a chunk layer --- .../gtceu/core/mixins/GTMixinPlugin.java | 2 +- .../mixins/embeddium/BlockRendererMixin.java | 119 +++++++----------- .../DefaultTerrainRenderPassesMixin.java | 38 ++++++ .../embeddium/GTEmbeddiumCompat.java | 9 +- src/main/resources/gtceu.mixins.json | 1 + 5 files changed, 90 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index cdafb919444..8b95fe39c5c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -31,7 +31,7 @@ public String getRefMapperConfig() { addModCompatMixin("jei"); addModCompatMixin("top"); addModCompatMixin("embeddium"); - MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); + //MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); addModCompatMixin("ftbchunks"); addModCompatMixin("xaerominimap"); addModCompatMixin("xaeroworldmap"); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 94899a9f5ed..0b0207570d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -2,108 +2,73 @@ import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; -import net.caffeinemc.mods.sodium.api.util.ColorARGB; -import net.caffeinemc.mods.sodium.api.util.NormI8; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import me.jellysquid.mods.sodium.client.model.color.ColorProvider; +import me.jellysquid.mods.sodium.client.model.light.LightMode; +import me.jellysquid.mods.sodium.client.model.light.LightPipeline; +import me.jellysquid.mods.sodium.client.model.light.LightPipelineProvider; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadOrientation; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; -import me.jellysquid.mods.sodium.client.util.ModelQuadUtil; -import org.embeddedt.embeddium.render.chunk.ChunkColorWriter; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import java.util.LinkedList; +import java.util.List; + @Mixin(value = BlockRenderer.class, remap = false) -public class BlockRendererMixin { +public abstract class BlockRendererMixin { - @Shadow - private boolean useReorienting; + @Shadow protected abstract QuadLightData getVertexLight(BlockRenderContext ctx, LightPipeline lighter, + Direction cullFace, BakedQuadView quad); - @Shadow - @Final - private ChunkVertexEncoder.Vertex[] vertices; + @Shadow @Final private LightPipelineProvider lighters; - @Shadow - @Final - private ChunkColorWriter colorEncoder; + @WrapOperation(method = "renderModel", + at = @At(value = "INVOKE", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;renderQuadList(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/light/LightPipeline;Lme/jellysquid/mods/sodium/client/model/color/ColorProvider;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Ljava/util/List;Lnet/minecraft/core/Direction;)V")) + private void gtceu$copyBloomQuads(BlockRenderer instance, BlockRenderContext ctx, Material material, + LightPipeline lighter, ColorProvider colorizer, + Vec3 offset, ChunkModelBuilder meshBuilder, + List quads, Direction cullFace, + Operation original, + BlockRenderContext _ctx, ChunkBuildBuffers buffers) { + original.call(instance, ctx, material, lighter, colorizer, offset, meshBuilder, quads, cullFace); + if (!GTShaders.allowedShader()) { + return; + } - @WrapOperation(method = "renderQuadList", - at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) - private void gtceu$captureBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder builder, - Vec3 offset, Material material, BakedQuadView quad, - int[] colors, QuadLightData light, Operation original) { - BlockPos chunkOrigin = SectionPos.of(ctx.pos()).origin(); // Check if quad is full brightness OR we have bloom enabled for the quad - // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though - if (GTShaders.allowedShader() && gtceu$isEmissive(quad, light)) { - ModelQuadOrientation orientation = this.useReorienting ? - ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; - for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { - int srcIndex = orientation.getVertexIndex(dstIndex); - int color = this.colorEncoder.writeColor( - ModelQuadUtil.mixARGBColors(colors[srcIndex], quad.getColor(srcIndex)), light.br[srcIndex]); - float u = quad.getTexU(srcIndex); - float v = quad.getTexV(srcIndex); - int lightUv = ModelQuadUtil.mergeBakedLight(quad.getLight(srcIndex), light.lm[srcIndex]); - int normal = quad.getForgeNormal(dstIndex); - - BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin) - .vertex(ctx.origin().x() + quad.getX(srcIndex) + (float) offset.x(), - ctx.origin().y() + quad.getY(srcIndex) + (float) offset.y(), - ctx.origin().z() + quad.getZ(srcIndex) + (float) offset.z(), - ColorARGB.unpackRed(color) / 255.0f, - ColorARGB.unpackGreen(color) / 255.0f, - ColorARGB.unpackBlue(color) / 255.0f, - ColorARGB.unpackAlpha(color) / 255.0f, - u, v, - OverlayTexture.NO_OVERLAY, - lightUv, - NormI8.unpackX(normal), - NormI8.unpackY(normal), - NormI8.unpackZ(normal)); + List emissiveQuads = new LinkedList<>(); + //noinspection ForLoopReplaceableByForEach + for (int i = 0; i < quads.size(); i++) { + BakedQuad quad = quads.get(i); + QuadLightData light = this.getVertexLight(ctx, + quad.hasAmbientOcclusion() ? lighter : this.lighters.getLighter(LightMode.FLAT), + cullFace, (BakedQuadView) quad); + if (BloomMetadataSection.isEmissive(quad, light.lm)) { + emissiveQuads.add(quad); } } - original.call(instance, ctx, builder, offset, material, quad, colors, light); - } - - @Unique - private static boolean gtceu$isEmissive(BakedQuadView quad, QuadLightData light) { - if (!quad.hasShade() || !quad.hasAmbientOcclusion()) { - return true; - } - if (BloomMetadataSection.hasBloom(quad.getSprite())) { - return true; - } - - for (int i = 0; i < 4; i++) { - int quadLight = quad.getLight(i); - int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); - int ambientLight = light.lm[i]; - int aBlock = LightTexture.block(ambientLight), aSky = LightTexture.sky(ambientLight); - - if (qBlock > aBlock || qSky > aSky) { - return true; - } + if (!emissiveQuads.isEmpty()) { + // copy the emissive quads' vertex data to the bloom buffer + ChunkModelBuilder bloomBuilder = buffers.get(GTEmbeddiumCompat.BLOOM_PASS); + original.call(instance, ctx, material, lighter, colorizer, offset, bloomBuilder, emissiveQuads, cullFace); } - return false; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java new file mode 100644 index 00000000000..b4f1ccb98fd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java @@ -0,0 +1,38 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import org.apache.commons.lang3.ArrayUtils; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = DefaultTerrainRenderPasses.class, remap = false) +public class DefaultTerrainRenderPassesMixin { + + @Shadow + @Final + @Mutable + public static TerrainRenderPass[] ALL; + + /** + * Very evil mixin to not have a million other mixins for enabling sorting on the bloom pass + * @author screret + * @reason AFAIK there's no way to actually add render passes to be processed automatically except this + */ + @WrapOperation(method = "", + at = @At(value = "FIELD", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;ALL:[Lme/jellysquid/mods/sodium/client/render/chunk/terrain/TerrainRenderPass;", + opcode = Opcodes.PUTSTATIC)) + private static void gtceu$addBloomRenderPass(TerrainRenderPass[] value, Operation setter) { + value = ArrayUtils.add(value, GTEmbeddiumCompat.BLOOM_PASS); + setter.call((Object) value); + } +} 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 185238ad760..1ee197c8c3b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,15 +1,22 @@ package com.gregtechceu.gtceu.integration.embeddium; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; import net.minecraftforge.eventbus.api.SubscribeEvent; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { + public static final TerrainRenderPass BLOOM_PASS = new TerrainRenderPass(GTRenderTypes.getBloom(), true, false); + public static final Material BLOOM_MATERIAL = new Material(BLOOM_PASS, AlphaCutoffParameter.ZERO, true); + @SubscribeEvent public static void registerExtraChunkMeshers(ChunkMeshEvent event) { - event.addMeshAppender(BloomMeshAppender.INSTANCE); + //event.addMeshAppender(BloomMeshAppender.INSTANCE); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 467a25471bc..c4e0aa9ce6a 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -27,6 +27,7 @@ "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "embeddium.BlockRendererMixin", + "embeddium.DefaultTerrainRenderPassesMixin", "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", From 7821f13a5a9e5b1063528cfcbb3346668520a24a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:29:17 +0300 Subject: [PATCH 040/269] it didn't work. This reverts commit 57b0a9bcbb56e49ff03ce1bd4bb3afa39f013dc2. --- .../gtceu/core/mixins/GTMixinPlugin.java | 2 +- .../mixins/embeddium/BlockRendererMixin.java | 119 +++++++++++------- .../DefaultTerrainRenderPassesMixin.java | 38 ------ .../embeddium/GTEmbeddiumCompat.java | 9 +- src/main/resources/gtceu.mixins.json | 1 - 5 files changed, 79 insertions(+), 90 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 8b95fe39c5c..cdafb919444 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -31,7 +31,7 @@ public String getRefMapperConfig() { addModCompatMixin("jei"); addModCompatMixin("top"); addModCompatMixin("embeddium"); - //MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); + MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); addModCompatMixin("ftbchunks"); addModCompatMixin("xaerominimap"); addModCompatMixin("xaeroworldmap"); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 0b0207570d9..94899a9f5ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -2,73 +2,108 @@ import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; +import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; +import net.caffeinemc.mods.sodium.api.util.ColorARGB; +import net.caffeinemc.mods.sodium.api.util.NormI8; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.world.phys.Vec3; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import me.jellysquid.mods.sodium.client.model.color.ColorProvider; -import me.jellysquid.mods.sodium.client.model.light.LightMode; -import me.jellysquid.mods.sodium.client.model.light.LightPipeline; -import me.jellysquid.mods.sodium.client.model.light.LightPipelineProvider; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; +import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadOrientation; import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; +import me.jellysquid.mods.sodium.client.util.ModelQuadUtil; +import org.embeddedt.embeddium.render.chunk.ChunkColorWriter; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import java.util.LinkedList; -import java.util.List; - @Mixin(value = BlockRenderer.class, remap = false) -public abstract class BlockRendererMixin { +public class BlockRendererMixin { - @Shadow protected abstract QuadLightData getVertexLight(BlockRenderContext ctx, LightPipeline lighter, - Direction cullFace, BakedQuadView quad); + @Shadow + private boolean useReorienting; - @Shadow @Final private LightPipelineProvider lighters; + @Shadow + @Final + private ChunkVertexEncoder.Vertex[] vertices; - @WrapOperation(method = "renderModel", - at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;renderQuadList(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/light/LightPipeline;Lme/jellysquid/mods/sodium/client/model/color/ColorProvider;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Ljava/util/List;Lnet/minecraft/core/Direction;)V")) - private void gtceu$copyBloomQuads(BlockRenderer instance, BlockRenderContext ctx, Material material, - LightPipeline lighter, ColorProvider colorizer, - Vec3 offset, ChunkModelBuilder meshBuilder, - List quads, Direction cullFace, - Operation original, - BlockRenderContext _ctx, ChunkBuildBuffers buffers) { - original.call(instance, ctx, material, lighter, colorizer, offset, meshBuilder, quads, cullFace); - if (!GTShaders.allowedShader()) { - return; - } + @Shadow + @Final + private ChunkColorWriter colorEncoder; + @WrapOperation(method = "renderQuadList", + at = @At(value = "INVOKE", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) + private void gtceu$captureBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder builder, + Vec3 offset, Material material, BakedQuadView quad, + int[] colors, QuadLightData light, Operation original) { + BlockPos chunkOrigin = SectionPos.of(ctx.pos()).origin(); // Check if quad is full brightness OR we have bloom enabled for the quad - List emissiveQuads = new LinkedList<>(); - //noinspection ForLoopReplaceableByForEach - for (int i = 0; i < quads.size(); i++) { - BakedQuad quad = quads.get(i); - QuadLightData light = this.getVertexLight(ctx, - quad.hasAmbientOcclusion() ? lighter : this.lighters.getLighter(LightMode.FLAT), - cullFace, (BakedQuadView) quad); - if (BloomMetadataSection.isEmissive(quad, light.lm)) { - emissiveQuads.add(quad); + // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though + if (GTShaders.allowedShader() && gtceu$isEmissive(quad, light)) { + ModelQuadOrientation orientation = this.useReorienting ? + ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; + for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { + int srcIndex = orientation.getVertexIndex(dstIndex); + int color = this.colorEncoder.writeColor( + ModelQuadUtil.mixARGBColors(colors[srcIndex], quad.getColor(srcIndex)), light.br[srcIndex]); + float u = quad.getTexU(srcIndex); + float v = quad.getTexV(srcIndex); + int lightUv = ModelQuadUtil.mergeBakedLight(quad.getLight(srcIndex), light.lm[srcIndex]); + int normal = quad.getForgeNormal(dstIndex); + + BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin) + .vertex(ctx.origin().x() + quad.getX(srcIndex) + (float) offset.x(), + ctx.origin().y() + quad.getY(srcIndex) + (float) offset.y(), + ctx.origin().z() + quad.getZ(srcIndex) + (float) offset.z(), + ColorARGB.unpackRed(color) / 255.0f, + ColorARGB.unpackGreen(color) / 255.0f, + ColorARGB.unpackBlue(color) / 255.0f, + ColorARGB.unpackAlpha(color) / 255.0f, + u, v, + OverlayTexture.NO_OVERLAY, + lightUv, + NormI8.unpackX(normal), + NormI8.unpackY(normal), + NormI8.unpackZ(normal)); } } + original.call(instance, ctx, builder, offset, material, quad, colors, light); + } + + @Unique + private static boolean gtceu$isEmissive(BakedQuadView quad, QuadLightData light) { + if (!quad.hasShade() || !quad.hasAmbientOcclusion()) { + return true; + } + if (BloomMetadataSection.hasBloom(quad.getSprite())) { + return true; + } + + for (int i = 0; i < 4; i++) { + int quadLight = quad.getLight(i); + int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); - if (!emissiveQuads.isEmpty()) { - // copy the emissive quads' vertex data to the bloom buffer - ChunkModelBuilder bloomBuilder = buffers.get(GTEmbeddiumCompat.BLOOM_PASS); - original.call(instance, ctx, material, lighter, colorizer, offset, bloomBuilder, emissiveQuads, cullFace); + int ambientLight = light.lm[i]; + int aBlock = LightTexture.block(ambientLight), aSky = LightTexture.sky(ambientLight); + + if (qBlock > aBlock || qSky > aSky) { + return true; + } } + return false; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java deleted file mode 100644 index b4f1ccb98fd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import org.apache.commons.lang3.ArrayUtils; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(value = DefaultTerrainRenderPasses.class, remap = false) -public class DefaultTerrainRenderPassesMixin { - - @Shadow - @Final - @Mutable - public static TerrainRenderPass[] ALL; - - /** - * Very evil mixin to not have a million other mixins for enabling sorting on the bloom pass - * @author screret - * @reason AFAIK there's no way to actually add render passes to be processed automatically except this - */ - @WrapOperation(method = "", - at = @At(value = "FIELD", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;ALL:[Lme/jellysquid/mods/sodium/client/render/chunk/terrain/TerrainRenderPass;", - opcode = Opcodes.PUTSTATIC)) - private static void gtceu$addBloomRenderPass(TerrainRenderPass[] value, Operation setter) { - value = ArrayUtils.add(value, GTEmbeddiumCompat.BLOOM_PASS); - setter.call((Object) value); - } -} 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 1ee197c8c3b..185238ad760 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,22 +1,15 @@ package com.gregtechceu.gtceu.integration.embeddium; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; import net.minecraftforge.eventbus.api.SubscribeEvent; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { - public static final TerrainRenderPass BLOOM_PASS = new TerrainRenderPass(GTRenderTypes.getBloom(), true, false); - public static final Material BLOOM_MATERIAL = new Material(BLOOM_PASS, AlphaCutoffParameter.ZERO, true); - @SubscribeEvent public static void registerExtraChunkMeshers(ChunkMeshEvent event) { - //event.addMeshAppender(BloomMeshAppender.INSTANCE); + event.addMeshAppender(BloomMeshAppender.INSTANCE); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index c4e0aa9ce6a..467a25471bc 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -27,7 +27,6 @@ "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "embeddium.BlockRendererMixin", - "embeddium.DefaultTerrainRenderPassesMixin", "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", From a3296cb6a7814823eaeaccf932c2a07da33a8f5c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:47:59 +0300 Subject: [PATCH 041/269] but maybe this will? --- .../mixins/client/BufferBuilderAccessor.java | 17 + .../DefaultedVertexConsumerAccessor.java | 24 ++ .../embeddium/ChunkBuildBuffersMixin.java | 36 ++ .../embeddium/CopyingVertexConsumer.java | 317 ++++++++++++++++++ .../embeddium/GTEmbeddiumCompat.java | 7 + .../embeddium/renderer/BloomMeshAppender.java | 11 + src/main/resources/gtceu.mixins.json | 3 + 7 files changed, 415 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java new file mode 100644 index 00000000000..af2efc4a081 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java @@ -0,0 +1,17 @@ +package com.gregtechceu.gtceu.core.mixins.client; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.nio.ByteBuffer; + +@Mixin(BufferBuilder.class) +public interface BufferBuilderAccessor { + + @Accessor("buffer") + ByteBuffer gtceu$getBuffer(); + + @Accessor("vertices") + int gtceu$getVertices(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java new file mode 100644 index 00000000000..70ef121cb40 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java @@ -0,0 +1,24 @@ +package com.gregtechceu.gtceu.core.mixins.client; + +import com.mojang.blaze3d.vertex.DefaultedVertexConsumer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(DefaultedVertexConsumer.class) +public interface DefaultedVertexConsumerAccessor { + + @Accessor("defaultColorSet") + boolean gtceu$isDefaultColorSet(); + + @Accessor("defaultA") + int gtceu$getDefaultA(); + + @Accessor("defaultR") + int gtceu$getDefaultR(); + + @Accessor("defaultG") + int gtceu$getDefaultG(); + + @Accessor("defaultB") + int gtceu$getDefaultB(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java new file mode 100644 index 00000000000..2ba0ff0baf0 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java @@ -0,0 +1,36 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; + +import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; +import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; +import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.BakedChunkModelBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexType; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ChunkBuildBuffers.class, remap = false) +public class ChunkBuildBuffersMixin { + + @Shadow @Final private Reference2ReferenceOpenHashMap builders; + + @Inject(method = "", at = @At("RETURN")) + private void gtceu$addBloomChunkBuffer(ChunkVertexType vertexType, CallbackInfo ci) { + TerrainRenderPass pass = GTEmbeddiumCompat.BLOOM_PASS; + + ChunkMeshBufferBuilder[] vertexBuffers = new ChunkMeshBufferBuilder[ModelQuadFacing.COUNT]; + for (int facing = 0; facing < ModelQuadFacing.COUNT; facing++) { + vertexBuffers[facing] = new ChunkMeshBufferBuilder(vertexType, 128 * 1024, + pass.isSorted() && facing == ModelQuadFacing.UNASSIGNED.ordinal()); + } + + this.builders.put(pass, new BakedChunkModelBuilder(vertexBuffers, !pass.isSorted())); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java new file mode 100644 index 00000000000..755805e632e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java @@ -0,0 +1,317 @@ +package com.gregtechceu.gtceu.integration.embeddium; + +import com.gregtechceu.gtceu.core.mixins.client.BufferBuilderAccessor; +import com.gregtechceu.gtceu.core.mixins.client.DefaultedVertexConsumerAccessor; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.VertexConsumer; +import lombok.Getter; +import lombok.Setter; +import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; +import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; +import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; +import me.jellysquid.mods.sodium.client.util.ModelQuadUtil; +import org.embeddedt.embeddium.render.frapi.SpriteFinderCache; +import org.joml.Vector3fc; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import javax.annotation.Nonnull; + +public final class CopyingVertexConsumer implements VertexConsumer { + private static final int VERTEX_SIZE_BYTES = 32; + private static final int INITIAL_CAPACITY = 16384; // Seems to generally be enough for your average subchunk + private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocate(0); + @Getter + @Setter + private ByteBuffer buffer = EMPTY_BUFFER; + + private int currentVertex; + + private float x; + private float y; + private float z; + private float u; + private float v; + private int color; + private int light; + + private int fixedColor; + private boolean hasFixedColor = false; + + private final ChunkVertexEncoder.Vertex[] sodiumVertexArray = ChunkVertexEncoder.Vertex.uninitializedQuad(); + private final ModelQuadView previousQuad = new ModelQuadView() { + + /** + * @param idx the index of the desired vertex + * @param offset the offset into that vertex, as an integer + * @return appropriate byte offset + */ + private int getBaseIndex(int idx, int offset) { + return (currentVertex - 4 + idx) * VERTEX_SIZE_BYTES + (offset * 4); + } + + @Override + public float getX(int idx) { + return buffer.getFloat(getBaseIndex(idx, 1)); + } + + @Override + public float getY(int idx) { + return buffer.getFloat(getBaseIndex(idx, 2)); + } + + @Override + public float getZ(int idx) { + return buffer.getFloat(getBaseIndex(idx, 3)); + } + + @Override + public int getColor(int idx) { + return buffer.getInt(getBaseIndex(idx, 4)); + } + + @Override + public float getTexU(int idx) { + return buffer.getFloat(getBaseIndex(idx, 5)); + } + + @Override + public float getTexV(int idx) { + return buffer.getFloat(getBaseIndex(idx, 6)); + } + + @Override + public int getLight(int idx) { + return buffer.getInt(getBaseIndex(idx, 7)); + } + + @Override + public int getFlags() { + return 0; + } + + @Override + public int getColorIndex() { + return 0; + } + + @Override + public TextureAtlasSprite getSprite() { + return null; + } + + @Override + public Direction getLightFace() { + return null; + } + + @Override + public int getForgeNormal(int idx) { + return 0; + } + + @Override + public int getComputedFaceNormal() { + return 0; + } + }; + + private static ByteBuffer reallocateDirect(ByteBuffer old, int capacity) { + ByteBuffer newBuf = ByteBuffer.allocateDirect(capacity).order(ByteOrder.nativeOrder()); + int oldPos = old.position(); + old.rewind(); + newBuf.put(old); + newBuf.position(Math.min(capacity, oldPos)); + old.position(oldPos); + return newBuf; + } + + @Nonnull + @Override + public VertexConsumer vertex(double x, double y, double z) { + this.x = (float) x; + this.y = (float) y; + this.z = (float) z; + return this; + } + + @Nonnull + @Override + public VertexConsumer color(int r, int g, int b, int a) { + color = ((a & 255) << 24) | ((b & 255) << 16) | ((g & 255) << 8) | (r & 255); + // Colour.flipABGR(Colour.packRGBA(r, g, b, a)); // We need ABGR so we compose it on the fly + return this; + } + + @Override + public void defaultColor(int r, int g, int b, int a) { + fixedColor = ((a & 255) << 24) | ((b & 255) << 16) | ((g & 255) << 8) | (r & 255); + hasFixedColor = true; + } + + @Override + public void unsetDefaultColor() { + hasFixedColor = false; + } + + @Nonnull + @Override + public VertexConsumer uv(float u, float v) { + this.u = u; + this.v = v; + return this; + } + + @Nonnull + @Override + public VertexConsumer overlayCoords(int u, int v) { + return this; + } + + @Nonnull + @Override + public VertexConsumer uv2(int u, int v) { + light = (v << 16) | u; // Compose lightmap coords into raw light value 0xVVVV_UUUU + return this; + } + + @Nonnull + @Override + public VertexConsumer normal(float x, float y, float z) { + return this; + } + + @Override + public void endVertex() { + // Make sure there is enough space for a new vertex + if ((this.buffer.capacity() - this.buffer.position()) < VERTEX_SIZE_BYTES) { + int newCapacity = this.buffer.capacity() * 2; + if (newCapacity == 0) { + newCapacity = INITIAL_CAPACITY; + } + this.buffer = reallocateDirect(this.buffer, newCapacity); + } + + ByteBuffer buffer = this.buffer; + + // Write the current quad vertex's normal, position, UVs, color and raw light values + buffer.putInt(-1); + buffer.putFloat(x); + buffer.putFloat(y); + buffer.putFloat(z); + buffer.putFloat(u); + buffer.putFloat(v); + buffer.putInt(hasFixedColor ? fixedColor : color); + buffer.putInt(light); + // We store 32 bytes per vertex + + resetCurrentVertex(); // Reset the current vertex values + currentVertex++; + if((currentVertex % 4) == 0) { + recalculateNormals(); + } + } + + private void recalculateNormals() { + // Look through the last 4 vertex positions, and compute a proper normal + ModelQuadFacing normal = ModelQuadUtil.findNormalFace(ModelQuadUtil.calculateNormal(this.previousQuad)); + // Store this in the position for the first vertex of the quad + buffer.putInt((currentVertex - 4) * VERTEX_SIZE_BYTES, normal.ordinal()); + } + + public void reset() { + if(currentVertex != 0) { + buffer.rewind(); + currentVertex = 0; + } + resetCurrentVertex(); + } + + public boolean isEmpty() { + return currentVertex == 0; + } + + public boolean flush(@Nonnull ChunkModelBuilder buffers, Material material, Vector3fc origin) { + return flush(buffers, material, origin.x(), origin.y(), origin.z()); + } + + public boolean flush(@Nonnull ChunkModelBuilder buffers, Material material, float oX, float oY, float oZ) { + if(currentVertex == 0) { + return false; + } + final int byteSize = currentVertex << 5; + + buffer.rewind(); + + while (buffer.position() < byteSize) { + final int normal = buffer.getInt(); // Fetch first normal for pre-selecting the vertex sink + final ModelQuadFacing facing = ModelQuadFacing.VALUES[normal]; + + final ChunkMeshBufferBuilder sink = buffers.getVertexBuffer(facing); + + ChunkVertexEncoder.Vertex[] sodiumQuad = sodiumVertexArray; + + float midU = 0, midV = 0; + + for(int i = 0; i < 4; i++) { + if(i != 0) + buffer.getInt(); // read normal + + ChunkVertexEncoder.Vertex sodiumVertex = sodiumQuad[i]; + sodiumVertex.x = oX + buffer.getFloat(); + sodiumVertex.y = oY + buffer.getFloat(); + sodiumVertex.z = oZ + buffer.getFloat(); + sodiumVertex.u = buffer.getFloat(); + sodiumVertex.v = buffer.getFloat(); + midU += sodiumVertex.u; + midV += sodiumVertex.v; + sodiumVertex.color = buffer.getInt(); + sodiumVertex.light = buffer.getInt(); + } + + // Detect sprite + TextureAtlasSprite sprite = SpriteFinderCache.forBlockAtlas().findNearestSprite(midU / 4, midV / 4); + if(sprite != null) { + buffers.addSprite(sprite); + } + + sink.push(sodiumQuad, material); + } + + return true; + } + + public static CopyingVertexConsumer copyFrom(BufferBuilder builder) { + CopyingVertexConsumer consumer = new CopyingVertexConsumer(); + + if (builder instanceof BufferBuilderAccessor accessor) { + consumer.buffer = accessor.gtceu$getBuffer(); + consumer.currentVertex = accessor.gtceu$getVertices(); + } + if (builder instanceof DefaultedVertexConsumerAccessor accessor) { + consumer.hasFixedColor = accessor.gtceu$isDefaultColorSet(); + + int a = accessor.gtceu$getDefaultA(); + int r = accessor.gtceu$getDefaultR(); + int g = accessor.gtceu$getDefaultG(); + int b = accessor.gtceu$getDefaultB(); + consumer.fixedColor = ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((g & 0xFF) << 8) | (r & 0xFF); + } + return consumer; + } + + private void resetCurrentVertex() { + x = y = z = 0F; + u = v = 0F; + color = 0xFFFF_FFFF; + light = 0; + } +} 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 185238ad760..cf723fc1956 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,13 +1,20 @@ package com.gregtechceu.gtceu.integration.embeddium; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; import net.minecraftforge.eventbus.api.SubscribeEvent; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { + public static final TerrainRenderPass BLOOM_PASS = new TerrainRenderPass(GTRenderTypes.getBloom(), true, false); + public static final Material BLOOM_MATERIAL = new Material(BLOOM_PASS, AlphaCutoffParameter.ZERO, true); + @SubscribeEvent public static void registerExtraChunkMeshers(ChunkMeshEvent event) { event.addMeshAppender(BloomMeshAppender.INSTANCE); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 7b3b8f3730c..679806d334e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -2,10 +2,15 @@ import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.integration.embeddium.CopyingVertexConsumer; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.core.BlockPos; +import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import org.embeddedt.embeddium.api.MeshAppender; +import org.joml.Vector3f; +import org.joml.Vector3fc; public class BloomMeshAppender implements MeshAppender { @@ -18,7 +23,13 @@ public void render(Context context) { } BlockPos chunkOrigin = context.sectionOrigin().origin(); + Vector3fc originVec = new Vector3f(chunkOrigin.getX(), chunkOrigin.getY(), chunkOrigin.getZ()); + BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); BloomEffectUtil.bakeBloomChunkBuffers(chunkOrigin); + + var consumer = CopyingVertexConsumer.copyFrom(GTShaders.BLOOM_BUFFER_BUILDERS.get(chunkOrigin)); + ChunkModelBuilder chunkBuilder = context.sodiumBuildBuffers().get(GTEmbeddiumCompat.BLOOM_PASS); + consumer.flush(chunkBuilder, GTEmbeddiumCompat.BLOOM_MATERIAL, originVec); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 467a25471bc..fd331732cae 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -10,7 +10,9 @@ "client.BakedQuadMixin", "client.BiomeColorsMixin", "client.BlockModelMixin", + "client.BufferBuilderAccessor", "client.ClientLevelAccessor", + "client.DefaultedVertexConsumerAccessor", "client.FaceBakeryMixin", "client.GuiGraphicsAccessor", "client.GuiGraphicsMixin", @@ -27,6 +29,7 @@ "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "embeddium.BlockRendererMixin", + "embeddium.ChunkBuildBuffersMixin", "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", From 3a0c61ca03377579d4b7f6ca1eb6fac7b3bdee01 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:48:08 +0300 Subject: [PATCH 042/269] nope. This reverts commit a3296cb6a7814823eaeaccf932c2a07da33a8f5c. --- .../mixins/client/BufferBuilderAccessor.java | 17 - .../DefaultedVertexConsumerAccessor.java | 24 -- .../embeddium/ChunkBuildBuffersMixin.java | 36 -- .../embeddium/CopyingVertexConsumer.java | 317 ------------------ .../embeddium/GTEmbeddiumCompat.java | 7 - .../embeddium/renderer/BloomMeshAppender.java | 11 - src/main/resources/gtceu.mixins.json | 3 - 7 files changed, 415 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java deleted file mode 100644 index af2efc4a081..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BufferBuilderAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client; - -import com.mojang.blaze3d.vertex.BufferBuilder; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.nio.ByteBuffer; - -@Mixin(BufferBuilder.class) -public interface BufferBuilderAccessor { - - @Accessor("buffer") - ByteBuffer gtceu$getBuffer(); - - @Accessor("vertices") - int gtceu$getVertices(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java deleted file mode 100644 index 70ef121cb40..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/DefaultedVertexConsumerAccessor.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client; - -import com.mojang.blaze3d.vertex.DefaultedVertexConsumer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(DefaultedVertexConsumer.class) -public interface DefaultedVertexConsumerAccessor { - - @Accessor("defaultColorSet") - boolean gtceu$isDefaultColorSet(); - - @Accessor("defaultA") - int gtceu$getDefaultA(); - - @Accessor("defaultR") - int gtceu$getDefaultR(); - - @Accessor("defaultG") - int gtceu$getDefaultG(); - - @Accessor("defaultB") - int gtceu$getDefaultB(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java deleted file mode 100644 index 2ba0ff0baf0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/ChunkBuildBuffersMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; - -import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; -import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.BakedChunkModelBuilder; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexType; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = ChunkBuildBuffers.class, remap = false) -public class ChunkBuildBuffersMixin { - - @Shadow @Final private Reference2ReferenceOpenHashMap builders; - - @Inject(method = "", at = @At("RETURN")) - private void gtceu$addBloomChunkBuffer(ChunkVertexType vertexType, CallbackInfo ci) { - TerrainRenderPass pass = GTEmbeddiumCompat.BLOOM_PASS; - - ChunkMeshBufferBuilder[] vertexBuffers = new ChunkMeshBufferBuilder[ModelQuadFacing.COUNT]; - for (int facing = 0; facing < ModelQuadFacing.COUNT; facing++) { - vertexBuffers[facing] = new ChunkMeshBufferBuilder(vertexType, 128 * 1024, - pass.isSorted() && facing == ModelQuadFacing.UNASSIGNED.ordinal()); - } - - this.builders.put(pass, new BakedChunkModelBuilder(vertexBuffers, !pass.isSorted())); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java deleted file mode 100644 index 755805e632e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/CopyingVertexConsumer.java +++ /dev/null @@ -1,317 +0,0 @@ -package com.gregtechceu.gtceu.integration.embeddium; - -import com.gregtechceu.gtceu.core.mixins.client.BufferBuilderAccessor; -import com.gregtechceu.gtceu.core.mixins.client.DefaultedVertexConsumerAccessor; - -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.Direction; - -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.VertexConsumer; -import lombok.Getter; -import lombok.Setter; -import me.jellysquid.mods.sodium.client.model.quad.ModelQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; -import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; -import me.jellysquid.mods.sodium.client.util.ModelQuadUtil; -import org.embeddedt.embeddium.render.frapi.SpriteFinderCache; -import org.joml.Vector3fc; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -import javax.annotation.Nonnull; - -public final class CopyingVertexConsumer implements VertexConsumer { - private static final int VERTEX_SIZE_BYTES = 32; - private static final int INITIAL_CAPACITY = 16384; // Seems to generally be enough for your average subchunk - private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocate(0); - @Getter - @Setter - private ByteBuffer buffer = EMPTY_BUFFER; - - private int currentVertex; - - private float x; - private float y; - private float z; - private float u; - private float v; - private int color; - private int light; - - private int fixedColor; - private boolean hasFixedColor = false; - - private final ChunkVertexEncoder.Vertex[] sodiumVertexArray = ChunkVertexEncoder.Vertex.uninitializedQuad(); - private final ModelQuadView previousQuad = new ModelQuadView() { - - /** - * @param idx the index of the desired vertex - * @param offset the offset into that vertex, as an integer - * @return appropriate byte offset - */ - private int getBaseIndex(int idx, int offset) { - return (currentVertex - 4 + idx) * VERTEX_SIZE_BYTES + (offset * 4); - } - - @Override - public float getX(int idx) { - return buffer.getFloat(getBaseIndex(idx, 1)); - } - - @Override - public float getY(int idx) { - return buffer.getFloat(getBaseIndex(idx, 2)); - } - - @Override - public float getZ(int idx) { - return buffer.getFloat(getBaseIndex(idx, 3)); - } - - @Override - public int getColor(int idx) { - return buffer.getInt(getBaseIndex(idx, 4)); - } - - @Override - public float getTexU(int idx) { - return buffer.getFloat(getBaseIndex(idx, 5)); - } - - @Override - public float getTexV(int idx) { - return buffer.getFloat(getBaseIndex(idx, 6)); - } - - @Override - public int getLight(int idx) { - return buffer.getInt(getBaseIndex(idx, 7)); - } - - @Override - public int getFlags() { - return 0; - } - - @Override - public int getColorIndex() { - return 0; - } - - @Override - public TextureAtlasSprite getSprite() { - return null; - } - - @Override - public Direction getLightFace() { - return null; - } - - @Override - public int getForgeNormal(int idx) { - return 0; - } - - @Override - public int getComputedFaceNormal() { - return 0; - } - }; - - private static ByteBuffer reallocateDirect(ByteBuffer old, int capacity) { - ByteBuffer newBuf = ByteBuffer.allocateDirect(capacity).order(ByteOrder.nativeOrder()); - int oldPos = old.position(); - old.rewind(); - newBuf.put(old); - newBuf.position(Math.min(capacity, oldPos)); - old.position(oldPos); - return newBuf; - } - - @Nonnull - @Override - public VertexConsumer vertex(double x, double y, double z) { - this.x = (float) x; - this.y = (float) y; - this.z = (float) z; - return this; - } - - @Nonnull - @Override - public VertexConsumer color(int r, int g, int b, int a) { - color = ((a & 255) << 24) | ((b & 255) << 16) | ((g & 255) << 8) | (r & 255); - // Colour.flipABGR(Colour.packRGBA(r, g, b, a)); // We need ABGR so we compose it on the fly - return this; - } - - @Override - public void defaultColor(int r, int g, int b, int a) { - fixedColor = ((a & 255) << 24) | ((b & 255) << 16) | ((g & 255) << 8) | (r & 255); - hasFixedColor = true; - } - - @Override - public void unsetDefaultColor() { - hasFixedColor = false; - } - - @Nonnull - @Override - public VertexConsumer uv(float u, float v) { - this.u = u; - this.v = v; - return this; - } - - @Nonnull - @Override - public VertexConsumer overlayCoords(int u, int v) { - return this; - } - - @Nonnull - @Override - public VertexConsumer uv2(int u, int v) { - light = (v << 16) | u; // Compose lightmap coords into raw light value 0xVVVV_UUUU - return this; - } - - @Nonnull - @Override - public VertexConsumer normal(float x, float y, float z) { - return this; - } - - @Override - public void endVertex() { - // Make sure there is enough space for a new vertex - if ((this.buffer.capacity() - this.buffer.position()) < VERTEX_SIZE_BYTES) { - int newCapacity = this.buffer.capacity() * 2; - if (newCapacity == 0) { - newCapacity = INITIAL_CAPACITY; - } - this.buffer = reallocateDirect(this.buffer, newCapacity); - } - - ByteBuffer buffer = this.buffer; - - // Write the current quad vertex's normal, position, UVs, color and raw light values - buffer.putInt(-1); - buffer.putFloat(x); - buffer.putFloat(y); - buffer.putFloat(z); - buffer.putFloat(u); - buffer.putFloat(v); - buffer.putInt(hasFixedColor ? fixedColor : color); - buffer.putInt(light); - // We store 32 bytes per vertex - - resetCurrentVertex(); // Reset the current vertex values - currentVertex++; - if((currentVertex % 4) == 0) { - recalculateNormals(); - } - } - - private void recalculateNormals() { - // Look through the last 4 vertex positions, and compute a proper normal - ModelQuadFacing normal = ModelQuadUtil.findNormalFace(ModelQuadUtil.calculateNormal(this.previousQuad)); - // Store this in the position for the first vertex of the quad - buffer.putInt((currentVertex - 4) * VERTEX_SIZE_BYTES, normal.ordinal()); - } - - public void reset() { - if(currentVertex != 0) { - buffer.rewind(); - currentVertex = 0; - } - resetCurrentVertex(); - } - - public boolean isEmpty() { - return currentVertex == 0; - } - - public boolean flush(@Nonnull ChunkModelBuilder buffers, Material material, Vector3fc origin) { - return flush(buffers, material, origin.x(), origin.y(), origin.z()); - } - - public boolean flush(@Nonnull ChunkModelBuilder buffers, Material material, float oX, float oY, float oZ) { - if(currentVertex == 0) { - return false; - } - final int byteSize = currentVertex << 5; - - buffer.rewind(); - - while (buffer.position() < byteSize) { - final int normal = buffer.getInt(); // Fetch first normal for pre-selecting the vertex sink - final ModelQuadFacing facing = ModelQuadFacing.VALUES[normal]; - - final ChunkMeshBufferBuilder sink = buffers.getVertexBuffer(facing); - - ChunkVertexEncoder.Vertex[] sodiumQuad = sodiumVertexArray; - - float midU = 0, midV = 0; - - for(int i = 0; i < 4; i++) { - if(i != 0) - buffer.getInt(); // read normal - - ChunkVertexEncoder.Vertex sodiumVertex = sodiumQuad[i]; - sodiumVertex.x = oX + buffer.getFloat(); - sodiumVertex.y = oY + buffer.getFloat(); - sodiumVertex.z = oZ + buffer.getFloat(); - sodiumVertex.u = buffer.getFloat(); - sodiumVertex.v = buffer.getFloat(); - midU += sodiumVertex.u; - midV += sodiumVertex.v; - sodiumVertex.color = buffer.getInt(); - sodiumVertex.light = buffer.getInt(); - } - - // Detect sprite - TextureAtlasSprite sprite = SpriteFinderCache.forBlockAtlas().findNearestSprite(midU / 4, midV / 4); - if(sprite != null) { - buffers.addSprite(sprite); - } - - sink.push(sodiumQuad, material); - } - - return true; - } - - public static CopyingVertexConsumer copyFrom(BufferBuilder builder) { - CopyingVertexConsumer consumer = new CopyingVertexConsumer(); - - if (builder instanceof BufferBuilderAccessor accessor) { - consumer.buffer = accessor.gtceu$getBuffer(); - consumer.currentVertex = accessor.gtceu$getVertices(); - } - if (builder instanceof DefaultedVertexConsumerAccessor accessor) { - consumer.hasFixedColor = accessor.gtceu$isDefaultColorSet(); - - int a = accessor.gtceu$getDefaultA(); - int r = accessor.gtceu$getDefaultR(); - int g = accessor.gtceu$getDefaultG(); - int b = accessor.gtceu$getDefaultB(); - consumer.fixedColor = ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((g & 0xFF) << 8) | (r & 0xFF); - } - return consumer; - } - - private void resetCurrentVertex() { - x = y = z = 0F; - u = v = 0F; - color = 0xFFFF_FFFF; - light = 0; - } -} 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 cf723fc1956..185238ad760 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,20 +1,13 @@ package com.gregtechceu.gtceu.integration.embeddium; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; import net.minecraftforge.eventbus.api.SubscribeEvent; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { - public static final TerrainRenderPass BLOOM_PASS = new TerrainRenderPass(GTRenderTypes.getBloom(), true, false); - public static final Material BLOOM_MATERIAL = new Material(BLOOM_PASS, AlphaCutoffParameter.ZERO, true); - @SubscribeEvent public static void registerExtraChunkMeshers(ChunkMeshEvent event) { event.addMeshAppender(BloomMeshAppender.INSTANCE); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 679806d334e..7b3b8f3730c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -2,15 +2,10 @@ import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.integration.embeddium.CopyingVertexConsumer; -import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.core.BlockPos; -import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import org.embeddedt.embeddium.api.MeshAppender; -import org.joml.Vector3f; -import org.joml.Vector3fc; public class BloomMeshAppender implements MeshAppender { @@ -23,13 +18,7 @@ public void render(Context context) { } BlockPos chunkOrigin = context.sectionOrigin().origin(); - Vector3fc originVec = new Vector3f(chunkOrigin.getX(), chunkOrigin.getY(), chunkOrigin.getZ()); - BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); BloomEffectUtil.bakeBloomChunkBuffers(chunkOrigin); - - var consumer = CopyingVertexConsumer.copyFrom(GTShaders.BLOOM_BUFFER_BUILDERS.get(chunkOrigin)); - ChunkModelBuilder chunkBuilder = context.sodiumBuildBuffers().get(GTEmbeddiumCompat.BLOOM_PASS); - consumer.flush(chunkBuilder, GTEmbeddiumCompat.BLOOM_MATERIAL, originVec); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index fd331732cae..467a25471bc 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -10,9 +10,7 @@ "client.BakedQuadMixin", "client.BiomeColorsMixin", "client.BlockModelMixin", - "client.BufferBuilderAccessor", "client.ClientLevelAccessor", - "client.DefaultedVertexConsumerAccessor", "client.FaceBakeryMixin", "client.GuiGraphicsAccessor", "client.GuiGraphicsMixin", @@ -29,7 +27,6 @@ "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "embeddium.BlockRendererMixin", - "embeddium.ChunkBuildBuffersMixin", "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", From 4dd68d4ef8080396a8d6e7a7c6e6c56363f55613 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 22:49:15 +0300 Subject: [PATCH 043/269] missed these from other commits --- .../core/mixins/client/LevelRendererAccessor.java | 14 ++++++++++++++ .../core/mixins/client/LevelRendererMixin.java | 5 ++++- .../embeddium/renderer/BloomMeshAppender.java | 5 ++++- src/main/resources/gtceu.mixins.json | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java new file mode 100644 index 00000000000..a258129fe6c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java @@ -0,0 +1,14 @@ +package com.gregtechceu.gtceu.core.mixins.client; + +import net.minecraft.client.renderer.LevelRenderer; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(LevelRenderer.class) +public interface LevelRendererAccessor { + + @Accessor("renderChunksInFrustum") + ObjectArrayList gtceu$getRenderChunksInFrustum(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index 2ef1081b208..3d8540593ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -20,6 +20,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; @@ -82,13 +83,15 @@ public abstract class LevelRendererMixin { @Unique private final RandomSource gtceu$modelRandom = RandomSource.create(); + @Shadow public abstract ChunkRenderDispatcher getChunkRenderDispatcher(); + @Inject(method = "applyFrustum", at = @At(value = "INVOKE", target = "Lit/unimi/dsi/fastutil/objects/ObjectArrayList;add(Ljava/lang/Object;)Z", remap = false)) private void gtceu$compileBloomBuffers(Frustum frustum, CallbackInfo ci, @Local LevelRenderer.RenderChunkInfo chunkInfo) { - BloomEffectUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin()); + BloomEffectUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin(), this.getChunkRenderDispatcher().getCameraPosition()); } @Inject(method = "resize", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 7b3b8f3730c..82074c0eeff 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -3,7 +3,9 @@ import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; import org.embeddedt.embeddium.api.MeshAppender; @@ -17,8 +19,9 @@ public void render(Context context) { return; } + Vec3 camPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); BlockPos chunkOrigin = context.sectionOrigin().origin(); BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); - BloomEffectUtil.bakeBloomChunkBuffers(chunkOrigin); + BloomEffectUtil.bakeBloomChunkBuffers(chunkOrigin, camPos); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 467a25471bc..4e81bf166d6 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -16,6 +16,7 @@ "client.GuiGraphicsMixin", "client.GuiHeartTypeMixin", "client.HumanoidArmorLayerMixin", + "client.LevelRendererAccessor", "client.LevelRendererMixin", "client.ModelBlockRendererMixin", "client.ModelManagerMixin", @@ -23,7 +24,6 @@ "client.PlayerInfoAccessor", "client.PostChainAccessor", "client.RebuildTaskMixin", - "client.RenderChunkMixin", "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "embeddium.BlockRendererMixin", From fc2e32229d92e6a38166642717641c3a032126a4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 19 Jul 2025 23:39:38 +0300 Subject: [PATCH 044/269] it's now broken in a slightly different way. and randomly the JVM crashes if I use a debug stick too much? --- .../gtceu/client/bloom/BloomEffectUtil.java | 96 +++++++++++-------- .../gtceu/core/mixins/GTMixinPlugin.java | 2 +- .../SodiumWorldRendererAccessor.java | 13 +++ .../embeddium/GTEmbeddiumCompat.java | 72 +++++++++++++- src/main/resources/gtceu.mixins.json | 1 + 5 files changed, 144 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java index bf28a401620..d67a6c46266 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java @@ -11,6 +11,7 @@ import com.gregtechceu.gtceu.core.mixins.client.LevelRendererAccessor; import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.Util; import net.minecraft.client.Camera; @@ -34,6 +35,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; @@ -359,6 +361,9 @@ private static void postDraw() { public static void finishBloomBuffer(BlockPos pos, BufferBuilder builder) { BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); if (buffer != null) { + GTShaders.BLOOM_BUFFER_BUILDERS.remove(pos, builder); + GTShaders.BLOOM_BUFFER_SORT_STATES.put(pos, builder.getSortState()); + if (RenderSystem.isOnRenderThread()) { VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); @@ -403,7 +408,7 @@ public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { } public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { - if (!GTShaders.allowedShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { + if (!GTShaders.allowedShader()) { return; } @@ -411,10 +416,8 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { if (builder == null || !builder.building()) { return; } - GTShaders.BLOOM_BUFFER_BUILDERS.remove(pos, builder); builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); - GTShaders.BLOOM_BUFFER_SORT_STATES.put(pos, builder.getSortState()); finishBloomBuffer(pos, builder); } @@ -487,43 +490,10 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro private static double zBloomOld; public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) { - if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { - return; - } - Minecraft.getInstance().getProfiler().push("translucent_sort"); - double camX = camPos.x; - double camY = camPos.y; - double camZ = camPos.z; - - double distX = camX - xBloomOld; - double distY = camY - yBloomOld; - double distZ = camZ - zBloomOld; - if (distX * distX + distY * distY + distZ * distZ > 1.0D) { - int sectionX = SectionPos.posToSectionCoord(camX); - int sectionZ = SectionPos.posToSectionCoord(camY); - int sectionY = SectionPos.posToSectionCoord(camZ); - boolean posChanged = sectionX != SectionPos.posToSectionCoord(xBloomOld) || - sectionY != SectionPos.posToSectionCoord(zBloomOld) || - sectionZ != SectionPos.posToSectionCoord(yBloomOld); - xBloomOld = camX; - yBloomOld = camY; - zBloomOld = camZ; - int amount = 0; - - LevelRendererAccessor accessor = (LevelRendererAccessor) renderer; - for(LevelRenderer.RenderChunkInfo info : accessor.gtceu$getRenderChunksInFrustum()) { - BlockPos pos = SectionPos.of(sectionX, sectionY, sectionZ).origin(); - if (!GTShaders.BLOOM_BUFFERS.containsKey(pos) || !GTShaders.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { - continue; - } - - if (amount < 15 && (posChanged || info.isAxisAlignedWith(sectionX, sectionY, sectionZ))) { - Util.backgroundExecutor().submit(() -> BloomEffectUtil.resortTransparencyInner(pos, camPos)); - ++amount; - } - } + for(BlockPos pos : getVisibleRenderRegions(camPos, renderer)) { + Util.backgroundExecutor().submit(() -> BloomEffectUtil.resortTransparencyInner(pos, camPos)); } Minecraft.getInstance().getProfiler().pop(); @@ -536,6 +506,49 @@ private static void resortTransparencyInner(BlockPos pos, Vec3 camPos) { finishBloomBuffer(pos, builder); } + private static List getVisibleRenderRegions(Vec3 camPos, LevelRenderer renderer) { + if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { + return GTEmbeddiumCompat.getVisibleRenderSections(camPos); + } else { + List result = new ArrayList<>(); + + for (var chunkInfo : ((LevelRendererAccessor) renderer).gtceu$getRenderChunksInFrustum()) { + double dx = camPos.x - xBloomOld; + double dy = camPos.y - yBloomOld; + double dz = camPos.z - zBloomOld; + + double camDelta = (dx * dx) + (dy * dy) + (dz * dz); + + if (camDelta < 1) { + // Didn't move enough, ignore + continue; + } + + int camSectionX = SectionPos.posToSectionCoord(camPos.x); + int camSectionY = SectionPos.posToSectionCoord(camPos.y); + int camSectionZ = SectionPos.posToSectionCoord(camPos.z); + + boolean posChanged = camSectionX != SectionPos.posToSectionCoord(xBloomOld) || + camSectionY != SectionPos.posToSectionCoord(yBloomOld) || + camSectionZ != SectionPos.posToSectionCoord(zBloomOld); + xBloomOld = camPos.x; + yBloomOld = camPos.y; + zBloomOld = camPos.z; + + BlockPos pos = SectionPos.of(camSectionX, camSectionY, camSectionZ).origin(); + if (!GTShaders.BLOOM_BUFFERS.containsKey(pos) || !GTShaders.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { + continue; + } + + if (posChanged || chunkInfo.isAxisAlignedWith(camSectionX, camSectionY, camSectionZ)) { + result.add(pos); + } + } + + return result; + } + } + public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, @@ -603,4 +616,11 @@ private void checkValidity() { } } } + + @ApiStatus.Internal + @FunctionalInterface + public interface RegionVisibilityTest { + + boolean isAxisAlignedWith(int x, int y, int z); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index cdafb919444..8b95fe39c5c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -31,7 +31,7 @@ public String getRefMapperConfig() { addModCompatMixin("jei"); addModCompatMixin("top"); addModCompatMixin("embeddium"); - MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); + //MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); addModCompatMixin("ftbchunks"); addModCompatMixin("xaerominimap"); addModCompatMixin("xaeroworldmap"); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java new file mode 100644 index 00000000000..f5974c57fbb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java @@ -0,0 +1,13 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = SodiumWorldRenderer.class, remap = false) +public interface SodiumWorldRendererAccessor { + + @Accessor("renderSectionManager") + RenderSectionManager gtceu$getRenderSectionManager(); +} 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 185238ad760..aeaccd4e0d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,15 +1,85 @@ package com.gregtechceu.gtceu.integration.embeddium; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.core.mixins.embeddium.SodiumWorldRendererAccessor; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.eventbus.api.SubscribeEvent; +import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; +import me.jellysquid.mods.sodium.client.render.chunk.lists.ChunkRenderList; +import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; +import me.jellysquid.mods.sodium.client.util.iterator.ByteIterator; import org.embeddedt.embeddium.api.ChunkMeshEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + public class GTEmbeddiumCompat { + public static List getVisibleRenderSections(Vec3 camPos) { + SodiumWorldRenderer renderer = SodiumWorldRenderer.instanceNullable(); + if (renderer == null) { + return Collections.emptyList(); + } + List list = new ArrayList<>(); + + int camSectionX = SectionPos.blockToSectionCoord(camPos.x); + int camSectionY = SectionPos.blockToSectionCoord(camPos.y); + int camSectionZ = SectionPos.blockToSectionCoord(camPos.z); + + RenderSectionManager sectionManager = ((SodiumWorldRendererAccessor) renderer).gtceu$getRenderSectionManager(); + + for (Iterator it = sectionManager.getRenderLists().iterator(); it.hasNext();) { + ChunkRenderList entry = it.next(); + RenderRegion region = entry.getRegion(); + ByteIterator sectionIterator = entry.sectionsWithGeometryIterator(false); + if (sectionIterator == null) { + continue; + } + while (sectionIterator.hasNext()) { + var section = region.getSection(sectionIterator.nextByteAsInt()); + + if (section == null || !section.isBuilt()) { + // Nonexistent/unbuilt sections are not relevant + continue; + } + + double dx = camPos.x - section.lastCameraX; + double dy = camPos.y - section.lastCameraY; + double dz = camPos.z - section.lastCameraZ; + double camDelta = (dx * dx) + (dy * dy) + (dz * dz); + + if (camDelta < 1) { + // Didn't move enough, ignore + continue; + } + + boolean cameraChangedSection = camSectionX != SectionPos.blockToSectionCoord(section.lastCameraX) || + camSectionY != SectionPos.blockToSectionCoord(section.lastCameraY) || + camSectionZ != SectionPos.blockToSectionCoord(section.lastCameraZ); + + BlockPos pos = SectionPos.of(camSectionX, camSectionY, camSectionZ).origin(); + if (!GTShaders.BLOOM_BUFFERS.containsKey(pos) || !GTShaders.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { + continue; + } + + if (cameraChangedSection || section.isAlignedWithSectionOnGrid(camSectionX, camSectionY, camSectionZ)) { + list.add(pos); + } + } + } + return list; + } + @SubscribeEvent - public static void registerExtraChunkMeshers(ChunkMeshEvent event) { + public static void registerChunkMeshAppenders(ChunkMeshEvent event) { event.addMeshAppender(BloomMeshAppender.INSTANCE); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 4e81bf166d6..16d10332788 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -27,6 +27,7 @@ "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "embeddium.BlockRendererMixin", + "embeddium.SodiumWorldRendererAccessor", "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", From 33697e3d9b959b5515b466069927631c840f1e5a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 23 Jul 2025 10:44:13 +0300 Subject: [PATCH 045/269] rename BloomEffectUtil to BloomUtil --- .../gregtechceu/gtceu/client/ClientProxy.java | 4 ++-- .../{BloomEffectUtil.java => BloomUtil.java} | 16 ++++++++-------- .../gtceu/client/bloom/IBloomEffect.java | 2 +- .../client/bloom/particle/GTBloomParticle.java | 8 ++++---- .../client/forge/ForgeClientEventListener.java | 12 ++++++------ .../client/particle/GTOverheatParticle.java | 6 +++--- .../gtceu/client/particle/GTParticle.java | 2 +- .../gtceu/client/particle/GTParticleManager.java | 2 +- .../renderer/machine/impl/FusionRingRender.java | 14 +++++++------- .../core/mixins/client/LevelRendererMixin.java | 4 ++-- .../mixins/client/ModelBlockRendererMixin.java | 4 ++-- .../core/mixins/client/RebuildTaskMixin.java | 4 ++-- .../core/mixins/client/RenderChunkMixin.java | 4 ++-- .../mixins/embeddium/BlockRendererMixin.java | 4 ++-- .../core/mixins/forge/QuadLighterMixin.java | 4 ++-- .../embeddium/renderer/BloomMeshAppender.java | 6 +++--- 16 files changed, 48 insertions(+), 48 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/bloom/{BloomEffectUtil.java => BloomUtil.java} (98%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 18b44424964..7adad6c510c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.api.item.LampBlockItem; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; import com.gregtechceu.gtceu.client.particle.HazardParticle; @@ -21,7 +22,6 @@ import com.gregtechceu.gtceu.client.renderer.machine.impl.*; import com.gregtechceu.gtceu.client.renderer.machine.impl.BoilerMultiPartRender; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTEntityTypes; @@ -70,7 +70,7 @@ public static void init() { ClientCacheManager.registerClientCache(GTClientCache.instance, "gtceu"); Layers.registerLayer(OreRenderLayer::new, "ore_veins"); Layers.registerLayer(FluidRenderLayer::new, "bedrock_fluids"); - BloomEffectUtil.init(); + BloomUtil.init(); if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index a3e44bd44bd..8df5bc520ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEffectUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -1,12 +1,12 @@ package com.gregtechceu.gtceu.client.bloom; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; +import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.LevelRendererAccessor; import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; @@ -46,7 +46,7 @@ import java.util.function.Supplier; @OnlyIn(Dist.CLIENT) -public class BloomEffectUtil { +public class BloomUtil { private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); @@ -352,12 +352,12 @@ public static void finishBloomBuffer(BlockPos pos, BufferBuilder builder) { if (RenderSystem.isOnRenderThread()) { VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); + BloomUtil.uploadBloomBuffer(buffer, vertexBuffer); } else { RenderSystem.recordRenderCall(() -> { VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - BloomEffectUtil.uploadBloomBuffer(buffer, vertexBuffer); + BloomUtil.uploadBloomBuffer(buffer, vertexBuffer); }); } } @@ -503,7 +503,7 @@ public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) Minecraft.getInstance().getProfiler().push("translucent_sort"); for(BlockPos pos : getVisibleRenderRegions(camPos, renderer)) { - Util.backgroundExecutor().submit(() -> BloomEffectUtil.resortTransparencyInner(pos, camPos)); + Util.backgroundExecutor().submit(() -> BloomUtil.resortTransparencyInner(pos, camPos)); } Minecraft.getInstance().getProfiler().pop(); @@ -570,9 +570,9 @@ public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pos return; } - BlockPos chunkOrigin = BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.get(); + BlockPos chunkOrigin = BloomUtil.CURRENT_RENDERING_CHUNK_POS.get(); if (chunkOrigin != null && BloomMetadataSection.hasBloom(quad, combinedLights)) { - original.call(BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin), pose, quad, + original.call(BloomUtil.getOrStartBloomBuffer(chunkOrigin), pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java index a30e75939d6..8c201923c81 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java @@ -12,7 +12,7 @@ /** * Render callback interface for - * {@link BloomEffectUtil#registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity)}. + * {@link BloomUtil#registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity)}. */ @FunctionalInterface public interface IBloomEffect { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java index ebc03f09644..723f23254d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.client.bloom.particle; -import com.gregtechceu.gtceu.client.particle.GTParticle; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; -import com.gregtechceu.gtceu.client.bloom.IBloomEffect; +import com.gregtechceu.gtceu.client.particle.GTParticle; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -13,7 +13,7 @@ public abstract class GTBloomParticle extends GTParticle implements IBloomEffect public GTBloomParticle(double posX, double posY, double posZ) { super(posX, posY, posZ); - BloomEffectUtil.registerBloomRender(getBloomRenderSetup(), getBloomType(), this, this); + BloomUtil.registerBloomRender(getBloomRenderSetup(), getBloomType(), this, this); } @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 9f90c755896..759dce5f7e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -7,11 +7,11 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.client.EnvironmentalHazardClientHandler; import com.gregtechceu.gtceu.client.TooltipsHandler; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.renderer.BlockHighlightRenderer; import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; import com.gregtechceu.gtceu.client.renderer.cover.FacadeCoverRenderer; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.commands.GTClientCommands; import com.gregtechceu.gtceu.core.mixins.client.AbstractClientPlayerAccessor; @@ -19,6 +19,7 @@ import com.gregtechceu.gtceu.integration.map.ClientCacheManager; import net.minecraft.ChatFormatting; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.BlockPos; @@ -31,7 +32,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; -import net.minecraft.client.Camera; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.*; @@ -69,9 +69,9 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { // so it can be seen through the transparent blocks. MultiblockInWorldPreviewRenderer.renderInWorldPreview(poseStack, camera, partialTick); } else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { - BloomEffectUtil.resortBloomTransparency(camera.getPosition(), levelRenderer); + BloomUtil.resortBloomTransparency(camera.getPosition(), levelRenderer); - BloomEffectUtil.renderBloom(camera, camera.getEntity(), levelRenderer, + BloomUtil.renderBloom(camera, camera.getEntity(), levelRenderer, poseStack, event.getProjectionMatrix(), event.getFrustum(), partialTick); } } @@ -89,7 +89,7 @@ public static void onChunkUnloadEvent(ChunkEvent.Unload event) { BlockPos.MutableBlockPos chunkPos = chunk.getPos().getWorldPosition().mutable(); for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { - BloomEffectUtil.removeBloomChunk(chunkPos.setY(SectionPos.sectionToBlockCoord(y))); + BloomUtil.removeBloomChunk(chunkPos.setY(SectionPos.sectionToBlockCoord(y))); } } @@ -105,7 +105,7 @@ public static void onRenderTick(TickEvent.RenderTickEvent event) { @SubscribeEvent public static void onLevelUnload(LevelEvent.Unload event) { - BloomEffectUtil.invalidateLevelTickets(event.getLevel()); + BloomUtil.invalidateLevelTickets(event.getLevel()); } private static final Map DEFAULT_CAPES = new Object2ObjectOpenHashMap<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index f98d36befcb..9328f0fb0e5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.client.particle; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; +import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; -import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; +import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; -import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index e94b6b91cb5..da4662913b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.particle; -import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 0606ae88001..844a321e98a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.client.particle; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import net.minecraft.ChatFormatting; import net.minecraft.client.Camera; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index 771137cdb2f..523da8b3d6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -1,15 +1,15 @@ package com.gregtechceu.gtceu.client.renderer.machine.impl; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; +import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; +import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; +import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; -import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; -import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; -import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -69,7 +69,7 @@ public void render(FusionReactorMachine machine, float partialTick, if (!machine.isRegisteredBloomTicket()) { machine.setRegisteredBloomTicket(true); - BloomEffectUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), + BloomUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), new FusionBloomEffect(machine), machine.getHolder().self()); } // TODO fix bloom on fusion reactor light diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index 3d8540593ac..d7717d1cd07 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -10,8 +10,8 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; @@ -91,7 +91,7 @@ public abstract class LevelRendererMixin { remap = false)) private void gtceu$compileBloomBuffers(Frustum frustum, CallbackInfo ci, @Local LevelRenderer.RenderChunkInfo chunkInfo) { - BloomEffectUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin(), this.getChunkRenderDispatcher().getCameraPosition()); + BloomUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin(), this.getChunkRenderDispatcher().getCameraPosition()); } @Inject(method = "resize", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java index e70fa9d61ea..0f1b8cf66fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -21,7 +21,7 @@ public class ModelBlockRendererMixin { float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { - BloomEffectUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, + BloomUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor, original); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java index 3f8a18b5609..a166f057090 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; @@ -25,6 +25,6 @@ public class RebuildTaskMixin { ChunkBufferBuilderPack chunkBufferBuilderPack, CallbackInfoReturnable cir) { BlockPos pos = this.this$1.getOrigin(); - BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(pos); + BloomUtil.CURRENT_RENDERING_CHUNK_POS.set(pos); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java index d19502f3a02..b5ed3677d4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.core.BlockPos; @@ -21,6 +21,6 @@ public class RenderChunkMixin { @Inject(method = "reset", at = @At("HEAD")) private void gtceu$resetBloomBuffers(CallbackInfo ci) { - BloomEffectUtil.removeBloomChunk(this.origin); + BloomUtil.removeBloomChunk(this.origin); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 94899a9f5ed..e499153d143 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; @@ -65,7 +65,7 @@ public class BlockRendererMixin { int lightUv = ModelQuadUtil.mergeBakedLight(quad.getLight(srcIndex), light.lm[srcIndex]); int normal = quad.getForgeNormal(dstIndex); - BloomEffectUtil.getOrStartBloomBuffer(chunkOrigin) + BloomUtil.getOrStartBloomBuffer(chunkOrigin) .vertex(ctx.origin().x() + quad.getX(srcIndex) + (float) offset.x(), ctx.origin().y() + quad.getY(srcIndex) + (float) offset.y(), ctx.origin().z() + quad.getZ(srcIndex) + (float) offset.z(), diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java index ae43b280120..b16d068ff7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.forge; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraftforge.client.model.lighting.QuadLighter; @@ -22,7 +22,7 @@ public class QuadLighterMixin { float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { - BloomEffectUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, + BloomUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor, original); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 82074c0eeff..6c83b67d038 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.embeddium.renderer; -import com.gregtechceu.gtceu.client.bloom.BloomEffectUtil; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; import net.minecraft.client.Minecraft; @@ -21,7 +21,7 @@ public void render(Context context) { Vec3 camPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); BlockPos chunkOrigin = context.sectionOrigin().origin(); - BloomEffectUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); - BloomEffectUtil.bakeBloomChunkBuffers(chunkOrigin, camPos); + BloomUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); + BloomUtil.bakeBloomChunkBuffers(chunkOrigin, camPos); } } From 46e2276748f776d4085e57287aa702fdfab94c85 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 23 Jul 2025 10:44:46 +0300 Subject: [PATCH 046/269] move BloomEffect fields to BloomUtil --- .../gtceu/client/bloom/BloomUtil.java | 28 +++++++++++-------- .../client/bloom/shader/BloomEffect.java | 12 -------- .../client/particle/GTOverheatParticle.java | 12 ++++---- .../machine/impl/FusionRingRender.java | 11 ++++---- 4 files changed, 28 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomEffect.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 8df5bc520ef..17d85c33652 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -48,6 +48,12 @@ @OnlyIn(Dist.CLIENT) public class BloomUtil { + public static float strength = ConfigHolder.INSTANCE.client.shader.strength; + public static float baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; + public static float highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; + public static float lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + public static float step = ConfigHolder.INSTANCE.client.shader.step; + private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); @@ -267,11 +273,11 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende return; } - BloomEffect.strength = ConfigHolder.INSTANCE.client.shader.strength; - BloomEffect.baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - BloomEffect.highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; - BloomEffect.lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; - BloomEffect.step = ConfigHolder.INSTANCE.client.shader.step; + strength = ConfigHolder.INSTANCE.client.shader.strength; + baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; + highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; + lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + step = ConfigHolder.INSTANCE.client.shader.step; // ********** render custom bloom ************ @@ -432,16 +438,16 @@ private static void setupRenderState(boolean drawBlockBloom) { if (GTShaders.BLOOM_TYPE == BloomAlgorithm.UNREAL && name.equals(SEPERABLE_BLUR_SHADER_NAME)) { int index = passes.indexOf(pass); if (index % 2 == 0) { - shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, BloomEffect.step); + shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, step); } else { - shader.safeGetUniform(BLUR_DIR_UNIFORM).set(BloomEffect.step, 0.0f); + shader.safeGetUniform(BLUR_DIR_UNIFORM).set(step, 0.0f); } } if (name.equals(UNITY_COMPOSITE_SHADER_NAME) || name.equals(UNREAL_COMPOSITE_SHADER_NAME)) { - shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(BloomEffect.strength); - shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(BloomEffect.baseBrightness); - shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(BloomEffect.highBrightnessThreshold); - shader.safeGetUniform(BLOOM_THRESHOLD_DOWN_UNIFORM).set(BloomEffect.lowBrightnessThreshold); + shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(strength); + shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(baseBrightness); + shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(highBrightnessThreshold); + shader.safeGetUniform(BLOOM_THRESHOLD_DOWN_UNIFORM).set(lowBrightnessThreshold); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomEffect.java deleted file mode 100644 index dc166abe9a6..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomEffect.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.client.bloom.shader; - -import com.gregtechceu.gtceu.config.ConfigHolder; - -public class BloomEffect { - - public static float strength = ConfigHolder.INSTANCE.client.shader.strength; - public static float baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - public static float highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; - public static float lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; - public static float step = ConfigHolder.INSTANCE.client.shader.step; -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 9328f0fb0e5..75dd4c8feac 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.client.particle; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; -import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; @@ -291,11 +291,11 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild public void preDraw(@NotNull BufferBuilder buffer) { var config = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; - BloomEffect.strength = config.strength; - BloomEffect.baseBrightness = config.baseBrightness; - BloomEffect.highBrightnessThreshold = config.highBrightnessThreshold; - BloomEffect.lowBrightnessThreshold = config.lowBrightnessThreshold; - BloomEffect.step = 1; + BloomUtil.strength = config.strength; + BloomUtil.baseBrightness = config.baseBrightness; + BloomUtil.highBrightnessThreshold = config.highBrightnessThreshold; + BloomUtil.lowBrightnessThreshold = config.lowBrightnessThreshold; + BloomUtil.step = 1; RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.enableBlend(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index 523da8b3d6e..5edb8a7ab03 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; -import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; @@ -160,11 +159,11 @@ private static final class FusionBloomSetup implements IRenderSetup { public void preDraw(@NotNull BufferBuilder buffer) { var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; - BloomEffect.strength = config.strength; - BloomEffect.baseBrightness = config.baseBrightness; - BloomEffect.highBrightnessThreshold = config.highBrightnessThreshold; - BloomEffect.lowBrightnessThreshold = config.lowBrightnessThreshold; - BloomEffect.step = 1; + BloomUtil.strength = config.strength; + BloomUtil.baseBrightness = config.baseBrightness; + BloomUtil.highBrightnessThreshold = config.highBrightnessThreshold; + BloomUtil.lowBrightnessThreshold = config.lowBrightnessThreshold; + BloomUtil.step = 1; RenderSystem.setShaderColor(1, 1, 1, 1); } From b98781d60f25cffa63fb14a681bb7deae95b2aa0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 23 Jul 2025 10:46:11 +0300 Subject: [PATCH 047/269] move bloom buffer maps from GTShaders to BloomUtil --- .../gtceu/client/bloom/BloomUtil.java | 31 +++++++++++-------- .../gtceu/client/shader/GTShaders.java | 14 ++------- .../embeddium/GTEmbeddiumCompat.java | 4 +-- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 17d85c33652..83d5374ce1a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -40,6 +40,7 @@ import org.joml.Matrix4f; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Predicate; @@ -59,6 +60,10 @@ public class BloomUtil { private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); + public static Map BLOOM_BUFFERS = new HashMap<>(); + public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFER_SORT_STATES = new HashMap<>(); + /** *

* Register a custom bloom render callback for subsequent world render. The render call persists until the @@ -352,16 +357,16 @@ private static void postDraw() { public static void finishBloomBuffer(BlockPos pos, BufferBuilder builder) { BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); if (buffer != null) { - GTShaders.BLOOM_BUFFER_BUILDERS.remove(pos, builder); - GTShaders.BLOOM_BUFFER_SORT_STATES.put(pos, builder.getSortState()); + BLOOM_BUFFER_BUILDERS.remove(pos, builder); + BLOOM_BUFFER_SORT_STATES.put(pos, builder.getSortState()); if (RenderSystem.isOnRenderThread()) { - VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, + VertexBuffer vertexBuffer = BLOOM_BUFFERS.computeIfAbsent(pos, $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); BloomUtil.uploadBloomBuffer(buffer, vertexBuffer); } else { RenderSystem.recordRenderCall(() -> { - VertexBuffer vertexBuffer = GTShaders.BLOOM_BUFFERS.computeIfAbsent(pos, + VertexBuffer vertexBuffer = BLOOM_BUFFERS.computeIfAbsent(pos, $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); BloomUtil.uploadBloomBuffer(buffer, vertexBuffer); }); @@ -378,8 +383,8 @@ public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, Verte } public static void removeBloomChunk(BlockPos origin) { - GTShaders.BLOOM_BUFFER_BUILDERS.remove(origin); - VertexBuffer buffer = GTShaders.BLOOM_BUFFERS.remove(origin); + BLOOM_BUFFER_BUILDERS.remove(origin); + VertexBuffer buffer = BLOOM_BUFFERS.remove(origin); if (buffer != null) { if (!RenderSystem.isOnRenderThread()) { RenderSystem.recordRenderCall(buffer::close); @@ -390,7 +395,7 @@ public static void removeBloomChunk(BlockPos origin) { } public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { - BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.computeIfAbsent(pos, + BufferBuilder builder = BLOOM_BUFFER_BUILDERS.computeIfAbsent(pos, $ -> new BufferBuilder(GTRenderTypes.getBloom().bufferSize())); if (!builder.building()) { builder.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); @@ -403,7 +408,7 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { return; } - BufferBuilder builder = GTShaders.BLOOM_BUFFER_BUILDERS.get(pos); + BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(pos); if (builder == null || !builder.building()) { return; } @@ -453,7 +458,7 @@ private static void setupRenderState(boolean drawBlockBloom) { } private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { - for (var it = GTShaders.BLOOM_BUFFERS.entrySet().iterator(); it.hasNext();) { + for (var it = BLOOM_BUFFERS.entrySet().iterator(); it.hasNext();) { var entry = it.next(); BlockPos pos = entry.getKey(); @@ -474,8 +479,8 @@ private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatri poseStack.popPose(); } finally { entry.getValue().close(); - GTShaders.BLOOM_BUFFER_BUILDERS.remove(pos); - GTShaders.BLOOM_BUFFER_SORT_STATES.remove(pos); + BLOOM_BUFFER_BUILDERS.remove(pos); + BLOOM_BUFFER_SORT_STATES.remove(pos); it.remove(); } } @@ -517,7 +522,7 @@ public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) private static void resortTransparencyInner(BlockPos pos, Vec3 camPos) { BufferBuilder builder = getOrStartBloomBuffer(pos); - builder.restoreSortState(GTShaders.BLOOM_BUFFER_SORT_STATES.get(pos)); + builder.restoreSortState(BLOOM_BUFFER_SORT_STATES.get(pos)); builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); finishBloomBuffer(pos, builder); } @@ -552,7 +557,7 @@ private static List getVisibleRenderRegions(Vec3 camPos, LevelRenderer zBloomOld = camPos.z; BlockPos pos = SectionPos.of(camSectionX, camSectionY, camSectionZ).origin(); - if (!GTShaders.BLOOM_BUFFERS.containsKey(pos) || !GTShaders.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { + if (!BLOOM_BUFFERS.containsKey(pos) || !BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { continue; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 813c249274e..938c201b04d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -8,7 +8,6 @@ import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.PostChain; -import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -16,27 +15,16 @@ import com.google.gson.JsonSyntaxException; import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.VertexBuffer; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; @OnlyIn(Dist.CLIENT) public class GTShaders { - public static final Minecraft mc = Minecraft.getInstance(); - public static PostChain BLOOM_CHAIN = null; public static BloomAlgorithm BLOOM_TYPE = ConfigHolder.INSTANCE.client.shader.bloomAlgorithm; public static RenderTarget BLOOM_TARGET = null; - public static Map BLOOM_BUFFERS = new HashMap<>(); - public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_SORT_STATES = new HashMap<>(); - public static void onRegisterShaders(RegisterShadersEvent event) { if (!innerAllowedShader()) { return; @@ -74,6 +62,8 @@ private static void initPostShaders() { } try { + Minecraft mc = Minecraft.getInstance(); + BLOOM_CHAIN = new PostChain(mc.getTextureManager(), mc.getResourceManager(), mc.getMainRenderTarget(), id); BLOOM_CHAIN.resize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); BLOOM_TARGET = BLOOM_CHAIN.getTempTarget("final"); 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 aeaccd4e0d7..0d30e5fdd43 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.embeddium; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.core.mixins.embeddium.SodiumWorldRendererAccessor; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; @@ -66,7 +66,7 @@ public static List getVisibleRenderSections(Vec3 camPos) { camSectionZ != SectionPos.blockToSectionCoord(section.lastCameraZ); BlockPos pos = SectionPos.of(camSectionX, camSectionY, camSectionZ).origin(); - if (!GTShaders.BLOOM_BUFFERS.containsKey(pos) || !GTShaders.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { + if (!BloomUtil.BLOOM_BUFFERS.containsKey(pos) || !BloomUtil.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { continue; } From 363f42ab44bc8759dc1732cc3936d0e0338ffc90 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 23 Jul 2025 10:46:40 +0300 Subject: [PATCH 048/269] move BloomAlgorithm up a package --- .../gtceu/client/bloom/{shader => }/BloomAlgorithm.java | 2 +- .../java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java | 2 -- .../java/com/gregtechceu/gtceu/client/shader/GTShaders.java | 2 +- src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/bloom/{shader => }/BloomAlgorithm.java (82%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomAlgorithm.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java similarity index 82% rename from src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomAlgorithm.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java index 37c9056d579..fd29d12455f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/shader/BloomAlgorithm.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.bloom.shader; +package com.gregtechceu.gtceu.client.bloom; public enum BloomAlgorithm { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java index 8c201923c81..8420a54b077 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.client.bloom; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; - import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 938c201b04d..c879e7ef438 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; +import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; import net.irisshaders.iris.api.v0.IrisApi; diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 259f9c47f4c..e7abbe8d8df 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; +import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import net.minecraft.commands.Commands; From 35a60be1338e6263d4fd84eb2680d56476ebb9bc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 23 Jul 2025 11:29:48 +0300 Subject: [PATCH 049/269] clean up GTParticleManager's event listeners --- .../gtceu/client/bloom/BloomUtil.java | 2 - .../bloom/particle/GTBloomParticle.java | 2 +- .../forge/ForgeClientEventListener.java | 6 +- .../client/particle/GTOverheatParticle.java | 2 +- .../client/particle/GTParticleManager.java | 59 ++++++++++--------- .../machine/impl/FusionRingRender.java | 2 +- 6 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 83d5374ce1a..a7de83abfc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.client.bloom; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; -import com.gregtechceu.gtceu.client.bloom.shader.BloomEffect; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java index 723f23254d3..1911a499cbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.client.bloom.particle; +import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.client.particle.GTParticle; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 759dce5f7e9..625b377451e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -106,6 +106,7 @@ public static void onRenderTick(TickEvent.RenderTickEvent event) { @SubscribeEvent public static void onLevelUnload(LevelEvent.Unload event) { BloomUtil.invalidateLevelTickets(event.getLevel()); + FacadeCoverRenderer.clearItemModelCache(); } private static final Map DEFAULT_CAPES = new Object2ObjectOpenHashMap<>(); @@ -153,11 +154,6 @@ public static void onClientTickEvent(TickEvent.ClientTickEvent event) { } } - @SubscribeEvent - public static void onLevelUnloadEvent(LevelEvent.Unload event) { - FacadeCoverRenderer.clearItemModelCache(); - } - private static final String BLOCK_INFO_LINE_START = ChatFormatting.UNDERLINE + "Targeted Block: "; @SubscribeEvent diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 75dd4c8feac..9c6ac1b569a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.client.particle; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 844a321e98a..8e25d884cfb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -10,11 +10,11 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.ClientPlayerNetworkEvent; import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; import net.minecraftforge.client.event.RenderLevelStageEvent; -import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -32,14 +32,11 @@ /** * Singleton class responsible for managing, updating and rendering {@link GTParticle} instances. */ -@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = GTCEu.MOD_ID) +@Mod.EventBusSubscriber(modid = GTCEu.MOD_ID, value = Dist.CLIENT) public class GTParticleManager { public static final GTParticleManager INSTANCE = new GTParticleManager(); - @Nullable - private static Level currentWorld = null; - private final Map<@Nullable IRenderSetup, ArrayDeque> depthEnabledParticles = new Object2ObjectLinkedOpenHashMap<>(); private final Map<@Nullable IRenderSetup, ArrayDeque> depthDisabledParticles = new Object2ObjectLinkedOpenHashMap<>(); @@ -131,24 +128,20 @@ public void renderParticles(@NotNull PoseStack poseStack, @NotNull Entity render if (!depthDisabledParticles.isEmpty()) { RenderSystem.depthMask(false); - - renderGlParticlesInLayer(poseStack, depthDisabledParticles, instance); - + renderParticlesInLayer(poseStack, depthDisabledParticles, instance); RenderSystem.depthMask(true); } - - renderGlParticlesInLayer(poseStack, depthEnabledParticles, instance); + renderParticlesInLayer(poseStack, depthEnabledParticles, instance); RenderSystem.disableBlend(); } - private static void renderGlParticlesInLayer(@NotNull PoseStack poseStack, - @NotNull Map<@Nullable IRenderSetup, ArrayDeque> renderQueue, - @NotNull EffectRenderContext context) { - for (var e : renderQueue.entrySet()) { - @Nullable - IRenderSetup handler = e.getKey(); - ArrayDeque particles = e.getValue(); + private static void renderParticlesInLayer(@NotNull PoseStack poseStack, + @NotNull Map<@Nullable IRenderSetup, ArrayDeque> renderQueue, + @NotNull EffectRenderContext context) { + for (var entry : renderQueue.entrySet()) { + IRenderSetup handler = entry.getKey(); + ArrayDeque particles = entry.getValue(); if (particles.isEmpty()) continue; boolean initialized = false; @@ -176,28 +169,38 @@ private static void renderGlParticlesInLayer(@NotNull PoseStack poseStack, } @SubscribeEvent - public static void clientTick(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.END || Minecraft.getInstance().isPaused()) { + public static void onClientLevelLoad(LevelEvent.Load event) { + if (!(event.getLevel() instanceof ClientLevel newLevel)) { return; } - - ClientLevel world = Minecraft.getInstance().level; - if (currentWorld != world) { - INSTANCE.clearAllEffects(currentWorld != null); - currentWorld = world; + ClientLevel oldLevel = Minecraft.getInstance().level; + if (oldLevel != newLevel) { + INSTANCE.clearAllEffects(oldLevel != null); } - if (currentWorld != null) { + if (oldLevel != null) { INSTANCE.updateEffects(); } } + @SubscribeEvent + public static void onClientLevelUnload(ClientPlayerNetworkEvent.LoggingOut event) { + if (event.getPlayer() != null) { + INSTANCE.clearAllEffects(true); + } + } + @SubscribeEvent public static void renderWorld(RenderLevelStageEvent event) { if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_CUTOUT_BLOCKS) { Entity entity = Minecraft.getInstance().getCameraEntity(); - INSTANCE.renderParticles(event.getPoseStack(), entity == null ? Minecraft.getInstance().player : entity, - event.getCamera(), event.getFrustum(), event.getPartialTick()); + if (entity == null) { + entity = Minecraft.getInstance().player; + } + if (entity != null) { + INSTANCE.renderParticles(event.getPoseStack(), entity, + event.getCamera(), event.getFrustum(), event.getPartialTick()); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index 5edb8a7ab03..db6cdc430be 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.client.renderer.machine.impl; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; -import com.gregtechceu.gtceu.client.bloom.shader.BloomAlgorithm; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; From 901325dca68f3bf2d4e04d1abadb45348c7b2469 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:22:23 +0300 Subject: [PATCH 050/269] spotless --- .../gregtechceu/gtceu/client/bloom/BloomUtil.java | 14 ++++++++------ .../client/renderer/block/FluidBlockRenderer.java | 10 ++++++---- .../gtceu/core/mixins/GTMixinPlugin.java | 2 +- .../core/mixins/client/LevelRendererMixin.java | 10 ++++++---- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index a7de83abfc8..664b606e402 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -268,7 +268,7 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende VertexBuffer.unbind(); Minecraft.getInstance().getProfiler().pop(); - //noinspection UnstableApiUsage + // noinspection UnstableApiUsage ForgeHooksClient.dispatchRenderStage(GTRenderTypes.getBloom(), levelRenderer, poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); @@ -410,7 +410,8 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { if (builder == null || !builder.building()) { return; } - builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); + builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), + (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); finishBloomBuffer(pos, builder); } @@ -485,7 +486,7 @@ private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatri } private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, - LevelRenderer levelRenderer, Camera camera, Frustum frustum) { + LevelRenderer levelRenderer, Camera camera, Frustum frustum) { // RenderSystem.disableDepthTest(); // RenderSystem.disableBlend(); // RenderSystem.defaultBlendFunc(); @@ -497,7 +498,7 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro VertexBuffer.unbind(); Minecraft.getInstance().getProfiler().pop(); - //noinspection UnstableApiUsage + // noinspection UnstableApiUsage ForgeHooksClient.dispatchRenderStage(GTRenderTypes.getBloom(), levelRenderer, poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); @@ -511,7 +512,7 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) { Minecraft.getInstance().getProfiler().push("translucent_sort"); - for(BlockPos pos : getVisibleRenderRegions(camPos, renderer)) { + for (BlockPos pos : getVisibleRenderRegions(camPos, renderer)) { Util.backgroundExecutor().submit(() -> BloomUtil.resortTransparencyInner(pos, camPos)); } @@ -521,7 +522,8 @@ public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) private static void resortTransparencyInner(BlockPos pos, Vec3 camPos) { BufferBuilder builder = getOrStartBloomBuffer(pos); builder.restoreSortState(BLOOM_BUFFER_SORT_STATES.get(pos)); - builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); + builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), + (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); finishBloomBuffer(pos, builder); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java index 5a3d52df0a0..843915dab27 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java @@ -79,9 +79,9 @@ public void drawBlocks(Set offsets, PoseStack poseStack, VertexConsume } } - public void drawPlanes(Direction[] faces, Map> directionalOffsets, PoseStack poseStack, - VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, - int combinedOverlay, int combinedLight) { + public void drawPlanes(Direction[] faces, Map> directionalOffsets, + PoseStack poseStack, VertexConsumer consumer, Fluid fluid, + RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { for (var face : faces) { if (!directionalOffsets.containsKey(face)) continue; drawPlane(face, directionalOffsets.get(face), poseStack, consumer, fluid, texture, combinedOverlay, @@ -121,7 +121,9 @@ public void drawPlane(Direction face, Collection offsets, PoseStack po for (var offset : offsets) { poseStack.pushPose(); poseStack.translate(offset.getX(), offset.getY(), offset.getZ()); - drawFace(poseStack.last(), consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, combinedLight); + drawFace(poseStack.last(), consumer, vertices, normal, + u0, u1, v0, v1, r, g, b, a, + combinedOverlay, combinedLight); poseStack.popPose(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 8b95fe39c5c..618a1b13782 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -31,7 +31,7 @@ public String getRefMapperConfig() { addModCompatMixin("jei"); addModCompatMixin("top"); addModCompatMixin("embeddium"); - //MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); + // MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); addModCompatMixin("ftbchunks"); addModCompatMixin("xaerominimap"); addModCompatMixin("xaeroworldmap"); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index d7717d1cd07..9577ace3726 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -83,15 +83,17 @@ public abstract class LevelRendererMixin { @Unique private final RandomSource gtceu$modelRandom = RandomSource.create(); - @Shadow public abstract ChunkRenderDispatcher getChunkRenderDispatcher(); + @Shadow + public abstract ChunkRenderDispatcher getChunkRenderDispatcher(); @Inject(method = "applyFrustum", at = @At(value = "INVOKE", - target = "Lit/unimi/dsi/fastutil/objects/ObjectArrayList;add(Ljava/lang/Object;)Z", - remap = false)) + target = "Lit/unimi/dsi/fastutil/objects/ObjectArrayList;add(Ljava/lang/Object;)Z", + remap = false)) private void gtceu$compileBloomBuffers(Frustum frustum, CallbackInfo ci, @Local LevelRenderer.RenderChunkInfo chunkInfo) { - BloomUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin(), this.getChunkRenderDispatcher().getCameraPosition()); + BloomUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin(), + this.getChunkRenderDispatcher().getCameraPosition()); } @Inject(method = "resize", at = @At("TAIL")) From 5c1edbf5c42fb24595e118afdaa1d1cdaf82603d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:25:56 +0300 Subject: [PATCH 051/269] enable stencil on the bloom buffer --- .../java/com/gregtechceu/gtceu/client/shader/GTShaders.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index c879e7ef438..4b9112d9477 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -67,6 +67,9 @@ private static void initPostShaders() { BLOOM_CHAIN = new PostChain(mc.getTextureManager(), mc.getResourceManager(), mc.getMainRenderTarget(), id); BLOOM_CHAIN.resize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); BLOOM_TARGET = BLOOM_CHAIN.getTempTarget("final"); + if (!BLOOM_TARGET.isStencilEnabled()) { + BLOOM_TARGET.enableStencil(); + } } catch (IOException ioexception) { GTCEu.LOGGER.error("Failed to load shader: {}", id, ioexception); BLOOM_CHAIN = null; From 2f87b892a1c5d31a41daee7dc30d3fb0adf12b8e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 25 Jul 2025 20:33:21 +0300 Subject: [PATCH 052/269] clean up shaders and use better names for the uniforms --- .../gtceu/client/bloom/BloomUtil.java | 36 +++------ .../gtceu/client/renderer/GTRenderTypes.java | 9 +-- .../rendertarget/ScaledTextureTarget.java | 28 +++++++ .../core/mixins/client/PostChainMixin.java | 70 ++++++++++++++++ .../embeddium/renderer/BloomMeshAppender.java | 5 +- .../gtceu/shaders/post/bloom_unity.json | 61 ++++++++++---- .../gtceu/shaders/post/bloom_unreal.json | 69 ++++++++-------- .../assets/gtceu/shaders/program/blit.fsh | 11 --- .../assets/gtceu/shaders/program/blit.json | 16 ---- .../assets/gtceu/shaders/program/blit.vsh | 20 ----- .../gtceu/shaders/program/down_sampling.fsh | 81 +++++++++++-------- .../gtceu/shaders/program/down_sampling.json | 6 +- .../shaders/program/filter_bloom_color.fsh | 9 +++ .../shaders/program/filter_bloom_color.json | 12 +-- .../gtceu/shaders/program/separable_blur.fsh | 53 ++++++++++++ ...eperable_blur.json => separable_blur.json} | 6 +- .../gtceu/shaders/program/seperable_blur.fsh | 30 ------- .../gtceu/shaders/program/unity_composite.fsh | 51 +++--------- .../shaders/program/unity_composite.json | 16 ++-- .../shaders/program/unreal_composite.fsh | 53 ++++-------- .../shaders/program/unreal_composite.json | 10 +-- .../gtceu/shaders/program/up_sampling.fsh | 45 +++++------ .../gtceu/shaders/program/up_sampling.json | 4 +- .../shaders/program/vanilla_composite.fsh | 16 ++-- .../shaders/program/vanilla_composite.json | 14 ++-- src/main/resources/gtceu.mixins.json | 1 + 26 files changed, 399 insertions(+), 333 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java delete mode 100644 src/main/resources/assets/gtceu/shaders/program/blit.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/program/blit.json delete mode 100644 src/main/resources/assets/gtceu/shaders/program/blit.vsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh rename src/main/resources/assets/gtceu/shaders/program/{seperable_blur.json => separable_blur.json} (72%) delete mode 100644 src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 664b606e402..4047f1c3886 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -418,19 +418,14 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); - private static final String UNREAL_COMPOSITE_SHADER_NAME = "gtceu:unreal_composite"; - private static final String UNITY_COMPOSITE_SHADER_NAME = "gtceu:unity_composite"; - private static final String SEPERABLE_BLUR_SHADER_NAME = "gtceu:seperable_blur"; - private static final String BLOOM_INTENSIVE_UNIFORM = "BloomIntensive"; - private static final String BLOOM_BASE_UNIFORM = "BloomBase"; - private static final String BLOOM_THRESHOLD_UP_UNIFORM = "BloomThresholdUp"; - private static final String BLOOM_THRESHOLD_DOWN_UNIFORM = "BloomThresholdDown"; + private static final String BLUR_SHADER_NAME = "blur"; + private static final String BLOOM_STRENGTH_UNIFORM = "BloomStrength"; + private static final String BASE_BRIGHTNESS_UNIFORM = "BaseBrightness"; + private static final String MAX_BRIGHTNESS_UNIFORM = "MaxBrightness"; + private static final String MIN_BRIGHTNESS_UNIFORM = "MinBrightness"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void setupRenderState(boolean drawBlockBloom) { - // RenderSystem.enableDepthTest(); - // RenderSystem.enableBlend(); - // RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + private static void setupBloomUniforms(boolean drawBlockBloom) { // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { @@ -439,7 +434,7 @@ private static void setupRenderState(boolean drawBlockBloom) { shader.safeGetUniform("EnableFilter").set(drawBlockBloom ? 1 : 0); - if (GTShaders.BLOOM_TYPE == BloomAlgorithm.UNREAL && name.equals(SEPERABLE_BLUR_SHADER_NAME)) { + if (name.contains(BLUR_SHADER_NAME)) { int index = passes.indexOf(pass); if (index % 2 == 0) { shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, step); @@ -447,12 +442,10 @@ private static void setupRenderState(boolean drawBlockBloom) { shader.safeGetUniform(BLUR_DIR_UNIFORM).set(step, 0.0f); } } - if (name.equals(UNITY_COMPOSITE_SHADER_NAME) || name.equals(UNREAL_COMPOSITE_SHADER_NAME)) { - shader.safeGetUniform(BLOOM_INTENSIVE_UNIFORM).set(strength); - shader.safeGetUniform(BLOOM_BASE_UNIFORM).set(baseBrightness); - shader.safeGetUniform(BLOOM_THRESHOLD_UP_UNIFORM).set(highBrightnessThreshold); - shader.safeGetUniform(BLOOM_THRESHOLD_DOWN_UNIFORM).set(lowBrightnessThreshold); - } + shader.safeGetUniform(BLOOM_STRENGTH_UNIFORM).set(strength); + shader.safeGetUniform(BASE_BRIGHTNESS_UNIFORM).set(baseBrightness); + shader.safeGetUniform(MAX_BRIGHTNESS_UNIFORM).set(highBrightnessThreshold); + shader.safeGetUniform(MIN_BRIGHTNESS_UNIFORM).set(lowBrightnessThreshold); } } @@ -487,15 +480,10 @@ private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatri private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, LevelRenderer levelRenderer, Camera camera, Frustum frustum) { - // RenderSystem.disableDepthTest(); - // RenderSystem.disableBlend(); - // RenderSystem.defaultBlendFunc(); - RenderSystem.resetTextureMatrix(); - GTShaders.BLOOM_CHAIN.process(partialTicks); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); - VertexBuffer.unbind(); + Minecraft.getInstance().getProfiler().pop(); // noinspection UnstableApiUsage 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 b634875aeb5..98db29de183 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -27,8 +27,8 @@ public class GTRenderTypes extends RenderType { } }); - private static final RenderType LIGHT_RING = RenderType.create("light_ring", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, 131072, 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(RenderStateShard.NO_CULL) .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) @@ -36,11 +36,10 @@ public class GTRenderTypes extends RenderType { .createCompositeState(false)); private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, - VertexFormat.Mode.QUADS, - 2097152, false, true, + VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, false, true, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) - .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_MIPPED_SHADER) + .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) .setOutputState(BLOOM_TARGET) .createCompositeState(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java b/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java new file mode 100644 index 00000000000..a1a4a58440a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java @@ -0,0 +1,28 @@ +package com.gregtechceu.gtceu.client.shader.rendertarget; + +import com.mojang.blaze3d.pipeline.TextureTarget; + +public class ScaledTextureTarget extends TextureTarget { + + private final float widthScale; + private final float heightScale; + private final boolean isInit; + + public ScaledTextureTarget(float widthScale, float heightScale, int width, int height, + boolean useDepth, boolean clearError) { + super((int) (width * widthScale), (int) (height * heightScale), useDepth, clearError); + this.widthScale = widthScale; + this.heightScale = heightScale; + this.isInit = true; + this.resize(width, height, clearError); + } + + @Override + public void resize(int width, int height, boolean clearError) { + if (!isInit) { + super.resize(width, height, clearError); + return; + } + super.resize(Math.max((int) (width * widthScale), 1), Math.max((int) (height * heightScale), 1), clearError); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java new file mode 100644 index 00000000000..196cdf894b0 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java @@ -0,0 +1,70 @@ +package com.gregtechceu.gtceu.core.mixins.client; + +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.shader.rendertarget.ScaledTextureTarget; + +import net.minecraft.client.renderer.PostChain; +import net.minecraft.util.GsonHelper; + +import com.google.gson.JsonObject; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; +import com.mojang.blaze3d.pipeline.TextureTarget; +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(PostChain.class) +public class PostChainMixin { + + @Unique + private float gtceu$widthScale = -1; + @Unique + private float gtceu$heightScale = -1; + @Unique + private boolean gtceu$bilinear = false; + + @Inject(method = "parseTargetNode", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/PostChain;addTempTarget(Ljava/lang/String;II)V", + ordinal = 1)) + private void gtceu$scaleTargetSize(CallbackInfo ci, @Local JsonObject json, @Local String name) { + if (json.has("scale")) { + JsonObject scale = GsonHelper.getAsJsonObject(json, "scale"); + gtceu$widthScale = GsonHelper.getAsFloat(scale, "width", 1.0f); + gtceu$heightScale = GsonHelper.getAsFloat(scale, "height", 1.0f); + } + gtceu$bilinear = GsonHelper.getAsBoolean(json, "bilinear"); + } + + @WrapOperation(method = "addTempTarget", + at = @At(value = "NEW", target = "com/mojang/blaze3d/pipeline/TextureTarget")) + private TextureTarget gtceu$wrapScaledTextureTarget(int width, int height, boolean useDepth, boolean clearError, + Operation original, + @Local(ordinal = 0, argsOnly = true) LocalIntRef widthRef, + @Local(ordinal = 1, argsOnly = true) LocalIntRef heightRef) { + TextureTarget target; + + if (gtceu$widthScale > 0.0f && gtceu$heightScale > 0.0f) { + widthRef.set((int) (width * gtceu$widthScale)); + heightRef.set((int) (height * gtceu$heightScale)); + + target = new ScaledTextureTarget(gtceu$widthScale, gtceu$heightScale, width, height, useDepth, clearError); + gtceu$widthScale = -1; + gtceu$heightScale = -1; + } else { + target = original.call(width, height, useDepth, clearError); + } + if (gtceu$bilinear) { + target.setFilterMode(GL11.GL_NEAREST); + gtceu$bilinear = false; + } + + return target; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 6c83b67d038..7a1cc7b38f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -18,9 +18,12 @@ public void render(Context context) { if (!GTShaders.allowedShader()) { return; } + BlockPos chunkOrigin = context.sectionOrigin().origin(); + if (!BloomUtil.BLOOM_BUFFER_BUILDERS.containsKey(chunkOrigin)) { + return; + } Vec3 camPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); - BlockPos chunkOrigin = context.sectionOrigin().origin(); BloomUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); BloomUtil.bakeBloomChunkBuffers(chunkOrigin, camPos); } 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 1e02999d507..bb04c399766 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -1,9 +1,10 @@ { "targets": [ + "gtceu:filter_temp", { "name": "swap2a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.5, "height": 0.5 } @@ -11,7 +12,7 @@ { "name": "swap4a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.25, "height": 0.25 } @@ -19,7 +20,7 @@ { "name": "swap8a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.125, "height": 0.125 } @@ -27,7 +28,7 @@ { "name": "swap16a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.0625, "height": 0.0625 } @@ -35,7 +36,7 @@ { "name": "swap2b", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.5, "height": 0.5 } @@ -43,7 +44,7 @@ { "name": "swap4b", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.25, "height": 0.25 } @@ -51,16 +52,36 @@ { "name": "swap8b", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.125, "height": 0.125 } }, - "final" + "final", + "swap" ], "passes": [ { - "name": "gtceu:down_sampling", + "name": "gtceu:filter_bloom_color", + "intarget": "final", + "outtarget": "gtceu:filter_temp", + "auxtargets": [ + { + "name": "DiffuseDepthSampler", + "id": "final:depth" + }, + { + "name": "MainSampler", + "id": "minecraft:main" + }, + { + "name": "MainDepthSampler", + "id": "minecraft:main:depth" + } + ] + }, + { + "name": "blit", "intarget": "final", "outtarget": "swap2a" }, @@ -80,11 +101,11 @@ "outtarget": "swap16a" }, { - "name": "gtceu:blit", + "name": "blit", "intarget": "swap16a", "outtarget": "swap8b", "auxtargets": [ - { "id":"swap8a", "name":"DownTexture" } + { "id": "swap8a", "name": "DownTexture" } ] }, { @@ -92,7 +113,7 @@ "intarget": "swap8b", "outtarget": "swap4b", "auxtargets": [ - { "id":"swap4a", "name":"DownTexture" } + { "id": "swap4a", "name": "DownTexture" } ] }, { @@ -100,16 +121,24 @@ "intarget": "swap4b", "outtarget": "swap2b", "auxtargets": [ - { "id":"swap2a", "name":"DownTexture" } + { "id": "swap2a", "name": "DownTexture" } ] }, { - "name": "gtceu:unity_composite", + "name": "gtceu:up_sampling", "intarget": "swap2b", + "outtarget": "swap", + "auxtargets": [ + { "id": "gtceu:filter_temp", "name": "DownTexture" } + ] + }, + { + "name": "gtceu:unity_composite", + "intarget": "swap", "outtarget": "final", "auxtargets": [ - { "id":"minecraft:main", "name":"DownTexture" }, - { "id":"minecraft:main", "name":"Background" } + { "id": "gtceu:filter_temp", "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 8c2a2bdf115..4db9fdf8c32 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -1,17 +1,10 @@ { "targets": [ - { - "name": "gtceu:filter_temp", - "blit": true, - "scaleSize": { - "width": 1, - "height": 1 - } - }, + "gtceu:filter_temp", { "name": "swap2a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.5, "height": 0.5 } @@ -19,7 +12,7 @@ { "name": "swap4a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.25, "height": 0.25 } @@ -27,7 +20,7 @@ { "name": "swap8a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.125, "height": 0.125 } @@ -35,7 +28,7 @@ { "name": "swap16a", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.0625, "height": 0.0625 } @@ -43,7 +36,7 @@ { "name": "swap2b", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.5, "height": 0.5 } @@ -51,7 +44,7 @@ { "name": "swap4b", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.25, "height": 0.25 } @@ -59,7 +52,7 @@ { "name": "swap8b", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.125, "height": 0.125 } @@ -67,7 +60,7 @@ { "name": "swap16b", "bilinear": true, - "scaleSize": { + "scale": { "width": 0.0625, "height": 0.0625 } @@ -80,11 +73,22 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - {"id": "minecraft:main", "name": "MainSampler"} + { + "name": "DiffuseDepthSampler", + "id": "final:depth" + }, + { + "name": "MainSampler", + "id": "minecraft:main" + }, + { + "name": "MainDepthSampler", + "id": "minecraft:main:depth" + } ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "gtceu:filter_temp", "outtarget": "swap2a", "uniforms": [ @@ -99,7 +103,7 @@ ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "swap2a", "outtarget": "swap2b", "uniforms": [ @@ -114,7 +118,7 @@ ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "swap2b", "outtarget": "swap4a", "uniforms": [ @@ -129,7 +133,7 @@ ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "swap4a", "outtarget": "swap4b", "uniforms": [ @@ -144,7 +148,7 @@ ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "swap4b", "outtarget": "swap8a", "uniforms": [ @@ -159,7 +163,7 @@ ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "swap8a", "outtarget": "swap8b", "uniforms": [ @@ -174,7 +178,7 @@ ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "swap8b", "outtarget": "swap16a", "uniforms": [ @@ -189,7 +193,7 @@ ] }, { - "name": "gtceu:seperable_blur", + "name": "blur", "intarget": "swap16a", "outtarget": "swap16b", "uniforms": [ @@ -208,17 +212,14 @@ "intarget": "minecraft:main", "outtarget": "final", "auxtargets": [ - { "id":"gtceu:filter_temp", "name":"HighLight" }, - { "id":"swap2b", "name":"BlurTexture1" }, - { "id":"swap4b", "name":"BlurTexture2" }, - { "id":"swap8b", "name":"BlurTexture3" }, - { "id":"swap16b", "name":"BlurTexture4" } + { "id": "gtceu:filter_temp", "name": "HighlightSampler" }, + { "id": "swap2b", "name": "BlurTexture1" }, + { "id": "swap4b", "name": "BlurTexture2" }, + { "id": "swap8b", "name": "BlurTexture3" }, + { "id": "swap16b", "name": "BlurTexture4" } ], "uniforms": [ - { - "name": "BloomRadius", - "values": [1.0] - } + { "name": "BloomRadius", "values": [1.0] } ] }, { diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.fsh b/src/main/resources/assets/gtceu/shaders/program/blit.fsh deleted file mode 100644 index b750ae82147..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/blit.fsh +++ /dev/null @@ -1,11 +0,0 @@ -#version 150 - -uniform sampler2D DiffuseSampler; - -in vec2 texCoord; - -out vec4 fragColor; - -void main() { - fragColor = texture(DiffuseSampler, texCoord); -} diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.json b/src/main/resources/assets/gtceu/shaders/program/blit.json deleted file mode 100644 index 9ace4e54d97..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/blit.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" - }, - "vertex": "gtceu:blit", - "fragment": "gtceu:blit", - "attributes": [ "Position" ], - "samplers": [ - { "name": "DiffuseSampler" } - ], - "uniforms": [ - { "name": "OutSize", "type": "float","count": 2, "values": [ 1.0, 1.0 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/program/blit.vsh b/src/main/resources/assets/gtceu/shaders/program/blit.vsh deleted file mode 100644 index bfa0b730de8..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/blit.vsh +++ /dev/null @@ -1,20 +0,0 @@ -#version 150 - -in vec4 Position; - -uniform vec2 OutSize; - -out vec2 texCoord; - -void main() { - float x = -1.0; - float y = -1.0; - if (Position.x > 0.001) { - x = 1.0; - } - if (Position.y > 0.001) { - y = 1.0; - } - gl_Position = vec4(x, y, 0.2, 1.0); - texCoord = Position.xy / OutSize; -} diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh index e371054f810..9f505550bf6 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh @@ -5,43 +5,56 @@ uniform vec2 OutSize; uniform vec2 InSize; in vec2 texCoord; +in vec2 oneTexel; + out vec4 fragColor; -vec4 four_k(vec3 textel, vec2 uv) { - return (texture(DiffuseSampler, uv + textel.xx) //1 1 - + texture(DiffuseSampler, uv + textel.xy) // 1 -1 - + texture(DiffuseSampler, uv + textel.yx) // -1 1 - + texture(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 +vec2 inTexel = oneTexel; +vec2 inTexelNegX = vec2(-inTexel.x, inTexel.y); +vec2 inTexelNegY = vec2(inTexel.x, -inTexel.y); + +vec2 outTexel = 1.0 / OutSize; +vec2 outTexelX = vec2(outTexel.x, 0.0); +vec2 outTexelY = vec2(0.0, outTexel.y); +vec2 outTexelNegX = vec2(-outTexel.x, outTexel.y); +vec2 outTexelNegY = vec2(outTexel.x, -outTexel.y); + +vec4 four_k(vec2 uv) { + return 0.25 * ( + texture(DiffuseSampler, uv + inTexel) // 1 1 + + texture(DiffuseSampler, uv + inTexelNegX) // -1 1 + + texture(DiffuseSampler, uv + inTexelNegY) // 1 -1 + + texture(DiffuseSampler, uv - inTexel)); // -1 -1 } void main() { - vec3 textel1 = vec3(1., -1., 0.) / InSize.xyx; - vec3 textel2 = vec3(1., -1., 0.) / OutSize.xyx; - - vec4 out_colour = (four_k(textel1, texCoord + textel2.yy) // -1 -1 - + four_k(textel1, texCoord + textel2.zy) // 0 -1 - + four_k(textel1, texCoord + textel2.yz) // -1 0 - + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 - - out_colour += (four_k(textel1, texCoord + textel2.xy) // 1 -1 - + four_k(textel1, texCoord + textel2.zy) // 0 -1 - + four_k(textel1, texCoord + textel2.xz) // 1 0 - + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 - - out_colour += (four_k(textel1, texCoord + textel2.yx) // -1 1 - + four_k(textel1, texCoord + textel2.yz) // -1 0 - + four_k(textel1, texCoord + textel2.zx) // 0 1 - + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 - - out_colour += (four_k(textel1, texCoord + textel2.xx) // 1 1 - + four_k(textel1, texCoord + textel2.xz) // 1 0 - + four_k(textel1, texCoord + textel2.zx) // 0 1 - + four_k(textel1, texCoord)) * 0.25 * 0.125; // 0 0 - - out_colour += (four_k(textel1, texCoord + textel1.xx) // 1 1 - + four_k(textel1, texCoord + textel1.xy) // 1 -1 - + four_k(textel1, texCoord + textel1.yx) // -1 1 - + four_k(textel1, texCoord + textel1.yy)) * 0.25 * 0.5; // -1 -1 - - fragColor = vec4(out_colour.rgb, 1.); + fragColor = 0.25 * 0.125 * ( + four_k(texCoord - outTexel) // -1 -1 + + four_k(texCoord - outTexelX) // -1 0 + + four_k(texCoord - outTexelY) // 0 -1 + + four_k(texCoord)); // 0 0 + + fragColor += 0.25 * 0.125 * ( + four_k(texCoord + outTexelNegY) // 1 -1 + + four_k(texCoord - outTexelY) // 0 -1 + + four_k(texCoord + outTexelX) // 1 0 + + four_k(texCoord)); // 0 0 + + fragColor += 0.25 * 0.125 * ( + four_k(texCoord + outTexelNegX) // -1 1 + + four_k(texCoord - outTexelX) // -1 0 + + four_k(texCoord + outTexelY) // 0 1 + + four_k(texCoord)); // 0 0 + + fragColor += 0.25 * 0.125 * ( + four_k(texCoord + outTexel) // 1 1 + + four_k(texCoord + outTexelX) // 1 0 + + four_k(texCoord + outTexelY) // 0 1 + + four_k(texCoord)); // 0 0 + + fragColor += 0.25 * 0.125 * ( + four_k(texCoord + outTexel) // 1 1 + + four_k(texCoord + outTexelNegX) // -1 1 + + four_k(texCoord + outTexelNegY) // 1 -1 + + four_k(texCoord - outTexel)); // -1 -1 } diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json index 4a429e90c25..970a1338885 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json @@ -4,14 +4,14 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "gtceu:blit", + "vertex": "sobel", "fragment": "gtceu:down_sampling", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.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": "InSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } ] } 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 041aa14be7b..a6d02c0de3e 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,7 +1,9 @@ #version 150 uniform sampler2D DiffuseSampler; +uniform sampler2D DiffuseDepthSampler; uniform sampler2D MainSampler; +uniform sampler2D MainDepthSampler; uniform bool EnableFilter; in vec2 texCoord; @@ -11,9 +13,16 @@ out vec4 fragColor; void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { + float mainDepth = texture(MainDepthSampler, texCoord).r; + float bloomDepth = texture(DiffuseDepthSampler, texCoord).r; + if (mainDepth > bloomDepth) { + fragColor = vec4(0.0); + } + /* vec4 mainColor = texture(MainSampler, texCoord); if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.01){ fragColor = vec4(0.0); } + */ } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index be5f41dc9f3..a50bbbc12ce 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -4,15 +4,17 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "gtceu:blit", + "vertex": "blit", "fragment": "gtceu:filter_bloom_color", "attributes": [ "Position" ], "samplers": [ - { "name": "DiffuseSampler"}, - { "name": "MainSampler"} + { "name": "DiffuseSampler" }, + { "name": "DiffuseDepthSampler" }, + { "name": "MainSampler" }, + { "name": "MainDepthSampler" } ], "uniforms": [ - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh b/src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh new file mode 100644 index 00000000000..5ceca0deaaf --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh @@ -0,0 +1,53 @@ +#version 150 + +#define PI 3.1415926538 + +uniform sampler2D DiffuseSampler; +uniform vec2 OutSize; +uniform vec2 BlurDir; +uniform float Radius; + +in vec2 texCoord; + +out vec4 fragColor; + +vec2 outTexel = 1.0 / OutSize; + +float calcExpectedMean() { + float invRadius = 1.0 / Radius; + float result = 0.0; + for (float i = 1; i <= Radius; i += 1) { + result += i * invRadius; + } + return result; +} + +float variance = ((Radius * Radius) - 1) / 12; +float twoVariance = 2.0 * variance; +float expectedMean = calcExpectedMean(); + +// pdf stands for "Probability density function" +float gaussianPdf(float x) { + return 1.0 / sqrt(PI * twoVariance) * exp(-pow(x - expectedMean, 2.0) / twoVariance); +} + +void main() { + vec4 blurred = vec4(0.0); + float totalAlpha = 0.0; + float totalSamples = 1.0; + + for(float r = 0; r <= Radius; r += 1.0) { + vec2 uvOffset = outTexel * r * BlurDir; + vec4 sample1 = texture(DiffuseSampler, texCoord + uvOffset); + vec4 sample2 = texture(DiffuseSampler, texCoord - uvOffset); + + float weight = gaussianPdf(r); + vec4 sampleValue = (sample1 + sample2) * weight; + + // Accumulate average alpha & smoothed blur + totalAlpha += sampleValue.a; + totalSamples += 2.0 * weight; + blurred += sampleValue; + } + fragColor = vec4(blurred.rgb / totalSamples, totalAlpha); +} diff --git a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json b/src/main/resources/assets/gtceu/shaders/program/separable_blur.json similarity index 72% rename from src/main/resources/assets/gtceu/shaders/program/seperable_blur.json rename to src/main/resources/assets/gtceu/shaders/program/separable_blur.json index c12df249200..982a26975c3 100644 --- a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.json +++ b/src/main/resources/assets/gtceu/shaders/program/separable_blur.json @@ -4,8 +4,8 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "gtceu:blit", - "fragment": "gtceu:seperable_blur", + "vertex": "blit", + "fragment": "gtceu:separable_blur", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" } @@ -13,6 +13,6 @@ "uniforms": [ { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, { "name": "BlurDir", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "Radius", "type": "float", "count": 1, "values": [ 5 ] } + { "name": "Radius", "type": "float", "count": 1, "values": [ 5 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh b/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh deleted file mode 100644 index 48119fee553..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/seperable_blur.fsh +++ /dev/null @@ -1,30 +0,0 @@ -#version 150 - -uniform sampler2D DiffuseSampler; -uniform vec2 OutSize; -uniform vec2 BlurDir; -uniform float Radius; - -in vec2 texCoord; -out vec4 fragColor; - -float gaussianPdf(in float x, in float sigma) { - return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma; -} - -void main() { - vec2 invSize = 1.0 / OutSize; - float fSigma = Radius; - float weightSum = gaussianPdf(0.0, fSigma); - vec3 diffuseSum = texture(DiffuseSampler, texCoord).rgb * weightSum; - for( int i = 1; i < int(Radius); i ++) { - float x = float(i); - float w = gaussianPdf(x, fSigma); - vec2 uvOffset = BlurDir * invSize * x; - vec3 sample1 = texture(DiffuseSampler, texCoord + uvOffset).rgb; - vec3 sample2 = texture(DiffuseSampler, texCoord - uvOffset).rgb; - diffuseSum += (sample1 + sample2) * w; - weightSum += 2.0 * w; - } - fragColor = vec4(diffuseSum/weightSum, 1.0); -} diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh index 8b4bab244ca..81bced4d6de 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh @@ -1,50 +1,25 @@ #version 150 uniform sampler2D DiffuseSampler; -uniform sampler2D DownTexture; -uniform sampler2D Background; -uniform vec2 OutSize; -uniform float BloomIntensive; -uniform float BloomBase; -uniform float BloomThresholdUp; -uniform float BloomThresholdDown; +uniform sampler2D HighlightSampler; +uniform sampler2D MainSampler; +uniform float BloomStrength; +uniform float BaseBrightness; +uniform float MaxBrightness; +uniform float MinBrightness; in vec2 texCoord; out vec4 fragColor; -vec4 four_k(vec3 textel, vec2 uv) { - return 0.25 * ( - texture(DiffuseSampler, uv + textel.xx) // 1 1 - + texture(DiffuseSampler, uv + textel.xy) // 1 -1 - + texture(DiffuseSampler, uv + textel.yx) // -1 1 - + texture(DiffuseSampler, uv + textel.yy) // -1 -1 - ); -} - -vec4 up_sampling(vec3 textel, vec2 uv) { - return vec4(four_k(textel, uv).rgb + texture(DownTexture, uv).rgb, 1.); -} - void main() { - vec3 textel = vec3(1., -1., 0.) / OutSize.xyx; - // out_colour = up_sampling(textel, texCoord); + vec4 highlight = texture(HighlightSampler, texCoord); + vec4 bloom = BloomStrength * texture(DiffuseSampler, texCoord); - vec4 out_color = texture(DiffuseSampler, texCoord + textel.xx); - out_color += texture(DiffuseSampler, texCoord + textel.xz) * 2.0; - out_color += texture(DiffuseSampler, texCoord + textel.xy); - out_color += texture(DiffuseSampler, texCoord + textel.yz) * 2.0; - out_color += texture(DiffuseSampler, texCoord) * 4.0; - out_color += texture(DiffuseSampler, texCoord + textel.zx) * 2.0; - out_color += texture(DiffuseSampler, texCoord + textel.yy); - out_color += texture(DiffuseSampler, texCoord + textel.zy) * 2.0; - out_color += texture(DiffuseSampler, texCoord + textel.yx); + vec4 background = texture(MainSampler, texCoord); + background.rgb = background.rgb * (1 - highlight.a) + highlight.a * highlight.rgb; - vec4 highLight = texture(DownTexture, texCoord); - vec4 bloom = BloomIntensive * vec4(out_color.rgb * 0.8 / 16. + highLight.rgb * 0.8, 1.); + float min = min(background.r, min(background.g, background.b)); + float max = max(background.r, max(background.g, background.b)); - vec4 background = texture(Background, texCoord); - background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; - float max = max(background.b, max(background.r, background.g)); - float min = min(background.b, min(background.r, background.g)); - fragColor = vec4(background.rgb + bloom.rgb * ((1. - (max + min) / 2.) * (BloomThresholdUp - BloomThresholdDown) + BloomThresholdDown + BloomBase), 1.); + fragColor = vec4(background.rgb + bloom.rgb * ((1.0 - (max + min) / 2.0) * (MaxBrightness - MinBrightness) + MinBrightness + BaseBrightness), 1.0); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json index 45692b1c164..5c6ac7398ed 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -4,19 +4,19 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "gtceu:blit", + "vertex": "blit", "fragment": "gtceu:unity_composite", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" }, - { "name": "DownTexture" }, - { "name": "Background" } + { "name": "HighlightSampler" }, + { "name": "MainSampler" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, - { "name": "BloomBase","type": "float","count": 1, "values": [ 0.0 ] }, - { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 1.3 ] }, - { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.3 ] } + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, + { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "MaxBrightness", "type": "float", "count": 1, "values": [ 1.3 ] }, + { "name": "MinBrightness", "type": "float", "count": 1, "values": [ 0.3 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh index 09da3a4602a..8e49a73448e 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -1,51 +1,25 @@ #version 150 uniform sampler2D DiffuseSampler; -uniform sampler2D HighLight; +uniform sampler2D HighlightSampler; uniform sampler2D BlurTexture1; uniform sampler2D BlurTexture2; uniform sampler2D BlurTexture3; uniform sampler2D BlurTexture4; uniform float BloomRadius; -uniform float BloomIntensive; -//uniform float BloomBase; -//uniform float BloomThresholdUp; -//uniform float BloomThresholdDown; +uniform float BloomStrength; +//uniform float BaseBrightness; +//uniform float MaxBrightness; +//uniform float MinBrightness; in vec2 texCoord; out vec4 fragColor; -float lerpBloomFactor(const in float factor) { +float lerpBloomFactor(float factor) { float mirrorFactor = 1.2 - factor; return mix(factor, mirrorFactor, BloomRadius); } -vec3 aces(vec3 x) { - const float a = 2.51; - const float b = 0.03; - const float c = 2.43; - const float d = 0.59; - const float e = 0.14; - return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0); -} - -vec3 aces_tonemap(vec3 color) { - mat3 m1 = mat3( - 0.59719, 0.07600, 0.02840, - 0.35458, 0.90834, 0.13383, - 0.04823, 0.01566, 0.83777 - ); - mat3 m2 = mat3( - 1.60475, -0.10208, -0.00327, - -0.53108, 1.10813, -0.07276, - -0.07367, -0.00605, 1.07602 - ); - vec3 v = m1 * color; - vec3 a = v * (v + 0.0245786) - 0.000090537; - vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081; - return pow(clamp(m2 * (a / b), 0.0, 1.0), vec3(1.0 / 2.2)); -} - vec3 jodieReinhardTonemap(vec3 c) { float l = dot(c, vec3(0.2126, 0.7152, 0.0722)); vec3 tc = c / (c + 1.0); @@ -54,13 +28,14 @@ vec3 jodieReinhardTonemap(vec3 c) { } void main() { - vec4 bloom = BloomIntensive * (lerpBloomFactor(1.) * texture(BlurTexture1, texCoord) + - lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + - lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + - lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); + vec4 bloom = BloomStrength * ( + lerpBloomFactor(1.0) * texture(BlurTexture1, texCoord) + + lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + + lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + + lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); vec4 background = texture(DiffuseSampler, texCoord); - vec4 highLight = texture(HighLight, texCoord); - background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; - fragColor = vec4(background.rgb + jodieReinhardTonemap(bloom.rgb), 1.); + vec4 highlight = texture(HighlightSampler, texCoord); + background.rgb = background.rgb * (1 - highlight.a) + highlight.a * highlight.rgb; + fragColor = vec4(background.rgb + jodieReinhardTonemap(bloom.rgb), 1.0); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index 7f9d3a53dad..2062872b783 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -4,20 +4,20 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "gtceu:blit", + "vertex": "blit", "fragment": "gtceu:unreal_composite", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" }, - { "name": "HighLight" }, + { "name": "HighlightSampler" }, { "name": "BlurTexture1" }, { "name": "BlurTexture2" }, { "name": "BlurTexture3" }, { "name": "BlurTexture4" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BloomRadius","type": "float","count": 1, "values": [ 1.0 ] }, - { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] } + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomRadius", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh index 44d0c35b3f3..2e8606de50f 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh @@ -5,32 +5,29 @@ uniform sampler2D DownTexture; uniform vec2 OutSize; in vec2 texCoord; -out vec4 fragColor; -vec4 four_k(vec3 textel, vec2 uv) { - return (texture(DiffuseSampler, uv + textel.xx) //1 1 - + texture(DiffuseSampler, uv + textel.xy) // 1 -1 - + texture(DiffuseSampler, uv + textel.yx) // -1 1 - + texture(DiffuseSampler, uv + textel.yy)) * 0.25; // -1 -1 -} +out vec4 fragColor; -vec4 up_sampling(vec3 textel, vec2 uv) { - return vec4(four_k(textel, uv).rgb + texture(DownTexture, uv).rgb, 1.); -} +vec2 outTexel = 1.0 / OutSize; +vec2 outTexelX = vec2(outTexel.x, 0.0); +vec2 outTexelY = vec2(0.0, outTexel.y); +vec2 outTexelNegX = vec2(-outTexel.x, outTexel.y); +vec2 outTexelNegY = vec2(outTexel.x, -outTexel.y); void main() { - vec3 textel = vec3(1., -1., 0.) / OutSize.xyx; - // out_colour = up_sampling(textel, texCoord); - - vec4 out_colour = texture(DiffuseSampler, texCoord + textel.xx); // 1 1 - out_colour += texture(DiffuseSampler, texCoord + textel.xz) * 2.0; // 1 0 - out_colour += texture(DiffuseSampler, texCoord + textel.xy); // 1 -1 - out_colour += texture(DiffuseSampler, texCoord + textel.yz) * 2.0; // -1 0 - out_colour += texture(DiffuseSampler, texCoord) * 4.0; // 0 0 - out_colour += texture(DiffuseSampler, texCoord + textel.zx) * 2.0; // 0 1 - out_colour += texture(DiffuseSampler, texCoord + textel.yy); // -1 -1 - out_colour += texture(DiffuseSampler, texCoord + textel.zy) * 2.0; // 0 -1 - out_colour += texture(DiffuseSampler, texCoord + textel.yx); // -1 1 - - fragColor = vec4(out_colour.rgb * 0.8 / 16. + texture(DownTexture, texCoord).rgb * 0.8, 1.); + vec4 out_color = texture(DiffuseSampler, texCoord) * 4.0; // 0 0 + + out_color += texture(DiffuseSampler, texCoord + outTexel); // 1 1 + out_color += texture(DiffuseSampler, texCoord + outTexelNegX); // -1 1 + out_color += texture(DiffuseSampler, texCoord + outTexelNegY); // 1 -1 + out_color += texture(DiffuseSampler, texCoord - outTexel); // -1 -1 + + out_color += texture(DiffuseSampler, texCoord + outTexelX) * 2.0; // 1 0 + out_color += texture(DiffuseSampler, texCoord - outTexelX) * 2.0; // -1 0 + out_color += texture(DiffuseSampler, texCoord + outTexelY) * 2.0; // 0 1 + out_color += texture(DiffuseSampler, texCoord - outTexelY) * 2.0; // 0 -1 + + vec3 total = out_color.rgb * 0.8 / 16.0 + texture(DownTexture, texCoord).rgb * 0.8; + total = clamp(total, 0.0, 1.0); + fragColor = vec4(total, 1.0); } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json index 69d6f94e306..5de79da307d 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -4,7 +4,7 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "gtceu:blit", + "vertex": "blit", "fragment": "gtceu:up_sampling", "attributes": [ "Position" ], "samplers": [ @@ -12,6 +12,6 @@ { "name": "DownTexture" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] } + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh index 6758ebd8f25..d5adabfe220 100644 --- a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh @@ -1,22 +1,22 @@ #version 150 uniform sampler2D DiffuseSampler; -uniform sampler2D HighLight; +uniform sampler2D HighlightSampler; uniform sampler2D BlurTexture; -uniform float BloomIntensive; -uniform float BloomBase; -uniform float BloomThresholdUp; -uniform float BloomThresholdDown; +uniform float BloomStrength; +uniform float BaseBrightness; +uniform float MaxBrightness; +uniform float MinBrightness; in vec2 texCoord; out vec4 fragColor; void main() { - vec3 bloom = texture(BlurTexture, texCoord).rgb * BloomIntensive; + vec3 bloom = texture(BlurTexture, texCoord).rgb * BloomStrength; vec4 background = texture(DiffuseSampler, texCoord); - vec4 highLight = texture(HighLight, texCoord); + vec4 highLight = texture(HighlightSampler, texCoord); background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; float max = max(background.b, max(background.r, background.g)); float min = min(background.b, min(background.r, background.g)); - fragColor = vec4(background.rgb + bloom.rgb * ((1. - (max + min) / 2.) * (BloomThresholdUp - BloomThresholdDown) + BloomThresholdDown + BloomBase), 1.); + fragColor = vec4(background.rgb + bloom.rgb * ((1. - (max + min) / 2.) * (MaxBrightness - MinBrightness) + MinBrightness + BaseBrightness), 1.); } diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json index 33a8032c006..769c8536aaa 100644 --- a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json @@ -4,19 +4,19 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "gtceu:blit", + "vertex": "blit", "fragment": "gtceu:vanilla_composite", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" }, - { "name": "HighLight" }, + { "name": "HighlightSampler" }, { "name": "BlurTexture" } ], "uniforms": [ - { "name": "OutSize","type": "float","count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BloomIntensive","type": "float","count": 1, "values": [ 1.7 ] }, - { "name": "BloomBase","type": "float","count": 1, "values": [ 0.1 ] }, - { "name": "BloomThresholdUp","type": "float","count": 1, "values": [ 0.7 ] }, - { "name": "BloomThresholdDown","type": "float","count": 1, "values": [ 0.2 ] } + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, + { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.1 ] }, + { "name": "MaxBrightness", "type": "float", "count": 1, "values": [ 0.7 ] }, + { "name": "MinBrightness", "type": "float", "count": 1, "values": [ 0.2 ] } ] } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 16d10332788..5172137aa4a 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -23,6 +23,7 @@ "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", "client.PostChainAccessor", + "client.PostChainMixin", "client.RebuildTaskMixin", "client.VariantDeserializerMixin", "client.VertexBufferAccessor", From 451b352742eae54f4ccb349bb768aab34b7646e4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 25 Jul 2025 20:33:35 +0300 Subject: [PATCH 053/269] fix LWJGL sources not working --- gradle/scripts/repositories.gradle | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 6c814e051d3..12fad0d3077 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -2,6 +2,12 @@ repositories { mavenLocal() mavenCentral() + // exclude LWJGL from Minecraft's library maven so we can download its sources from mavenCentral + maven { + url = "https://libraries.minecraft.net/" + content { excludeGroup("org.lwjgl") } + } + maven { // JEI name = "Jared's Maven" url = "https://maven.blamejared.com/" @@ -19,7 +25,7 @@ repositories { exclusiveContent { // KubeJS and Rhino forRepository { maven { url = "https://maven.latvian.dev/releases" } } - filter { includeGroup("dev.latvian.mods")} + filter { includeGroup("dev.latvian.mods") } } exclusiveContent { // FTB mods forRepository { maven { url = "https://maven.ftb.dev/releases" } } From c0ff3b050dd4c72cfe739d5102f7c9f6b218c308 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 25 Jul 2025 20:34:36 +0300 Subject: [PATCH 054/269] clearer config field names --- .../gregtechceu/gtceu/client/bloom/BloomUtil.java | 8 ++++---- .../gtceu/client/model/BloomMetadataSection.java | 2 +- .../gregtechceu/gtceu/client/shader/GTShaders.java | 2 +- .../com/gregtechceu/gtceu/config/ConfigHolder.java | 12 ++++-------- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 4047f1c3886..cc08551c809 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -49,8 +49,8 @@ public class BloomUtil { public static float strength = ConfigHolder.INSTANCE.client.shader.strength; public static float baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - public static float highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; - public static float lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + public static float highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.maxBrightness; + public static float lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.minBrightness; public static float step = ConfigHolder.INSTANCE.client.shader.step; private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); @@ -278,8 +278,8 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende strength = ConfigHolder.INSTANCE.client.shader.strength; baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.highBrightnessThreshold; - lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.lowBrightnessThreshold; + highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.maxBrightness; + lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.minBrightness; step = ConfigHolder.INSTANCE.client.shader.step; // ********** render custom bloom ************ diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java index 690d33c89dc..c87f55079a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java @@ -48,7 +48,7 @@ public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { if (hasBloom(quad.getSprite())) { return true; } - return ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom && isEmissive(quad, ambientPackedLights); + return ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom && isEmissive(quad, ambientPackedLights); } public static boolean isEmissive(BakedQuad quad, int[] ambientPackedLights) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 4b9112d9477..9c5fd93c230 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -86,7 +86,7 @@ public static boolean allowedShader() { } private static boolean innerAllowedShader() { - return ConfigHolder.INSTANCE.client.shader.useShader && + return ConfigHolder.INSTANCE.client.shader.enableBloom && !GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index f6bccae6c96..562b9f09ad5 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -769,17 +769,13 @@ public static class ArmorHud { public static class ShaderOptions { - @Configurable - @Configurable.Comment("Particle config option for the Assembly Line") - public boolean assemblyLineParticles = true; - @Configurable @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) - public boolean useShader = true; + public boolean enableBloom = true; @Configurable @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) - public boolean emissiveTexturesBloom = true; + public boolean emissiveTexturesHaveBloom = true; @Configurable @Configurable.Comment({ "Bloom Algorithm", @@ -795,7 +791,7 @@ public static class ShaderOptions { "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) @Configurable.DecimalRange(min = 0) - public float highBrightnessThreshold = 0.5f; + public float maxBrightness = 0.5f; @Configurable @Configurable.Comment({ @@ -803,7 +799,7 @@ public static class ShaderOptions { "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) @Configurable.DecimalRange(min = 0) - public float lowBrightnessThreshold = 0.2f; + public float minBrightness = 0.2f; @Configurable @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", From 50aabb4be734e07aa35fbde3f2eb50d584cd63dc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:13:04 +0300 Subject: [PATCH 055/269] don't clear buffers after rendering --- .../gtceu/client/bloom/BloomUtil.java | 93 ++++++------------- 1 file changed, 30 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index cc08551c809..5a90e1ef4ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -38,6 +38,7 @@ import org.joml.Matrix4f; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -58,9 +59,9 @@ public class BloomUtil { private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); - public static Map BLOOM_BUFFERS = new HashMap<>(); + public static Map BLOOM_BUFFERS = new ConcurrentHashMap<>(); public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_SORT_STATES = new HashMap<>(); + public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); /** *

@@ -242,38 +243,18 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende BLOOM_RENDER_LOCK.writeLock().lock(); try { - preDraw(); - - GTShaders.BLOOM_TARGET.bindWrite(false); - - EffectRenderContext context = EffectRenderContext.getInstance() - .update(entity, camPos, frustum, partialTicks); - GTRenderTypes.getBloom().setupRenderState(); - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesBloom) { - RenderSystem.depthMask(true); + preDraw(); + if (!BLOOM_RENDERS.isEmpty()) { + EffectRenderContext context = EffectRenderContext.getInstance() + .update(entity, camPos, frustum, partialTicks); - if (!BLOOM_RENDERS.isEmpty()) { - for (List list : BLOOM_RENDERS.values()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - draw(poseStack, buffer, context, list); - } + for (List list : BLOOM_RENDERS.values()) { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + draw(poseStack, buffer, context, list); } - RenderSystem.depthMask(false); postDraw(); - - setupRenderState(false); - render(partialTicks, poseStack, projectionMatrix, levelRenderer, camera, frustum); - VertexBuffer.unbind(); - Minecraft.getInstance().getProfiler().pop(); - - // noinspection UnstableApiUsage - ForgeHooksClient.dispatchRenderStage(GTRenderTypes.getBloom(), levelRenderer, - poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); - - GTRenderTypes.getBloom().clearRenderState(); - return; } strength = ConfigHolder.INSTANCE.client.shader.strength; @@ -282,20 +263,13 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.minBrightness; step = ConfigHolder.INSTANCE.client.shader.step; - // ********** render custom bloom ************ - - RenderSystem.depthMask(true); - if (!BLOOM_RENDERS.isEmpty()) { - for (List list : BLOOM_RENDERS.values()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - draw(poseStack, buffer, context, list); - } + if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { + setupBloomUniforms(true); + drawBlockBloom(poseStack, projectionMatrix, camPos); + } else { + setupBloomUniforms(false); } - RenderSystem.depthMask(false); - postDraw(); - setupRenderState(true); - drawBlockBloom(poseStack, projectionMatrix, camPos); render(partialTicks, poseStack, projectionMatrix, levelRenderer, camera, frustum); } finally { BLOOM_RENDER_LOCK.writeLock().unlock(); @@ -382,6 +356,7 @@ public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, Verte public static void removeBloomChunk(BlockPos origin) { BLOOM_BUFFER_BUILDERS.remove(origin); + BLOOM_BUFFER_SORT_STATES.remove(origin); VertexBuffer buffer = BLOOM_BUFFERS.remove(origin); if (buffer != null) { if (!RenderSystem.isOnRenderThread()) { @@ -450,31 +425,23 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { } private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { - for (var it = BLOOM_BUFFERS.entrySet().iterator(); it.hasNext();) { - var entry = it.next(); + for (var entry : BLOOM_BUFFERS.entrySet()) { BlockPos pos = entry.getKey(); // return early if buffer is invalid or has no vertex data bound // VertexBuffer#mode's nullness is the easiest way to check this. - try { - if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { - continue; - } - entry.getValue().bind(); - - poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); - - entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, - GameRenderer.getRendertypeTranslucentShader()); - poseStack.popPose(); - } finally { - entry.getValue().close(); - BLOOM_BUFFER_BUILDERS.remove(pos); - BLOOM_BUFFER_SORT_STATES.remove(pos); - it.remove(); + if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { + continue; } + entry.getValue().bind(); + + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); + + entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, + GameRenderer.getRendertypeCutoutShader()); + poseStack.popPose(); } } @@ -498,10 +465,10 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro private static double zBloomOld; public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) { - Minecraft.getInstance().getProfiler().push("translucent_sort"); + Minecraft.getInstance().getProfiler().push("bloom_sort"); for (BlockPos pos : getVisibleRenderRegions(camPos, renderer)) { - Util.backgroundExecutor().submit(() -> BloomUtil.resortTransparencyInner(pos, camPos)); + CompletableFuture.runAsync(() -> BloomUtil.resortTransparencyInner(pos, camPos), Util.backgroundExecutor()); } Minecraft.getInstance().getProfiler().pop(); From 7768e9f4e15911f716a4c4ab0c06fdf763a773a0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:16:34 +0300 Subject: [PATCH 056/269] remove bloom transparency sorting --- .../gtceu/client/bloom/BloomUtil.java | 71 ------------------- .../forge/ForgeClientEventListener.java | 2 - .../gtceu/client/renderer/GTRenderTypes.java | 3 +- .../SodiumWorldRendererAccessor.java | 13 ---- .../embeddium/GTEmbeddiumCompat.java | 70 ------------------ 5 files changed, 1 insertion(+), 158 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 5a90e1ef4ab..4230631d776 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -1,24 +1,19 @@ package com.gregtechceu.gtceu.client.bloom; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.core.mixins.client.LevelRendererAccessor; import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; -import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; -import net.minecraft.Util; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -38,7 +33,6 @@ import org.joml.Matrix4f; import java.util.*; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -460,71 +454,6 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro GTRenderTypes.getBloom().clearRenderState(); } - private static double xBloomOld; - private static double yBloomOld; - private static double zBloomOld; - - public static void resortBloomTransparency(Vec3 camPos, LevelRenderer renderer) { - Minecraft.getInstance().getProfiler().push("bloom_sort"); - - for (BlockPos pos : getVisibleRenderRegions(camPos, renderer)) { - CompletableFuture.runAsync(() -> BloomUtil.resortTransparencyInner(pos, camPos), Util.backgroundExecutor()); - } - - Minecraft.getInstance().getProfiler().pop(); - } - - private static void resortTransparencyInner(BlockPos pos, Vec3 camPos) { - BufferBuilder builder = getOrStartBloomBuffer(pos); - builder.restoreSortState(BLOOM_BUFFER_SORT_STATES.get(pos)); - builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), - (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); - finishBloomBuffer(pos, builder); - } - - private static List getVisibleRenderRegions(Vec3 camPos, LevelRenderer renderer) { - if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { - return GTEmbeddiumCompat.getVisibleRenderSections(camPos); - } else { - List result = new ArrayList<>(); - - for (var chunkInfo : ((LevelRendererAccessor) renderer).gtceu$getRenderChunksInFrustum()) { - double dx = camPos.x - xBloomOld; - double dy = camPos.y - yBloomOld; - double dz = camPos.z - zBloomOld; - - double camDelta = (dx * dx) + (dy * dy) + (dz * dz); - - if (camDelta < 1) { - // Didn't move enough, ignore - continue; - } - - int camSectionX = SectionPos.posToSectionCoord(camPos.x); - int camSectionY = SectionPos.posToSectionCoord(camPos.y); - int camSectionZ = SectionPos.posToSectionCoord(camPos.z); - - boolean posChanged = camSectionX != SectionPos.posToSectionCoord(xBloomOld) || - camSectionY != SectionPos.posToSectionCoord(yBloomOld) || - camSectionZ != SectionPos.posToSectionCoord(zBloomOld); - xBloomOld = camPos.x; - yBloomOld = camPos.y; - zBloomOld = camPos.z; - - BlockPos pos = SectionPos.of(camSectionX, camSectionY, camSectionZ).origin(); - if (!BLOOM_BUFFERS.containsKey(pos) || !BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { - continue; - } - - if (posChanged || chunkInfo.isAxisAlignedWith(camSectionX, camSectionY, camSectionZ)) { - result.add(pos); - } - } - - return result; - } - } - public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index 625b377451e..cb6f97d11f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -69,8 +69,6 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { // so it can be seen through the transparent blocks. MultiblockInWorldPreviewRenderer.renderInWorldPreview(poseStack, camera, partialTick); } else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { - BloomUtil.resortBloomTransparency(camera.getPosition(), levelRenderer); - BloomUtil.renderBloom(camera, camera.getEntity(), levelRenderer, poseStack, event.getProjectionMatrix(), event.getFrustum(), partialTick); } 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 98db29de183..a45efeb17b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -32,11 +32,10 @@ public class GTRenderTypes extends RenderType { RenderType.CompositeState.builder() .setCullState(RenderStateShard.NO_CULL) .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) - .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) .createCompositeState(false)); private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, - VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, false, true, + VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, false, false, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java deleted file mode 100644 index f5974c57fbb..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/SodiumWorldRendererAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; - -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(value = SodiumWorldRenderer.class, remap = false) -public interface SodiumWorldRendererAccessor { - - @Accessor("renderSectionManager") - RenderSectionManager gtceu$getRenderSectionManager(); -} 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 0d30e5fdd43..4c7b094efe6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,83 +1,13 @@ package com.gregtechceu.gtceu.integration.embeddium; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.core.mixins.embeddium.SodiumWorldRendererAccessor; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; -import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.eventbus.api.SubscribeEvent; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; -import me.jellysquid.mods.sodium.client.render.chunk.lists.ChunkRenderList; -import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; -import me.jellysquid.mods.sodium.client.util.iterator.ByteIterator; import org.embeddedt.embeddium.api.ChunkMeshEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - public class GTEmbeddiumCompat { - public static List getVisibleRenderSections(Vec3 camPos) { - SodiumWorldRenderer renderer = SodiumWorldRenderer.instanceNullable(); - if (renderer == null) { - return Collections.emptyList(); - } - List list = new ArrayList<>(); - - int camSectionX = SectionPos.blockToSectionCoord(camPos.x); - int camSectionY = SectionPos.blockToSectionCoord(camPos.y); - int camSectionZ = SectionPos.blockToSectionCoord(camPos.z); - - RenderSectionManager sectionManager = ((SodiumWorldRendererAccessor) renderer).gtceu$getRenderSectionManager(); - - for (Iterator it = sectionManager.getRenderLists().iterator(); it.hasNext();) { - ChunkRenderList entry = it.next(); - RenderRegion region = entry.getRegion(); - ByteIterator sectionIterator = entry.sectionsWithGeometryIterator(false); - if (sectionIterator == null) { - continue; - } - while (sectionIterator.hasNext()) { - var section = region.getSection(sectionIterator.nextByteAsInt()); - - if (section == null || !section.isBuilt()) { - // Nonexistent/unbuilt sections are not relevant - continue; - } - - double dx = camPos.x - section.lastCameraX; - double dy = camPos.y - section.lastCameraY; - double dz = camPos.z - section.lastCameraZ; - double camDelta = (dx * dx) + (dy * dy) + (dz * dz); - - if (camDelta < 1) { - // Didn't move enough, ignore - continue; - } - - boolean cameraChangedSection = camSectionX != SectionPos.blockToSectionCoord(section.lastCameraX) || - camSectionY != SectionPos.blockToSectionCoord(section.lastCameraY) || - camSectionZ != SectionPos.blockToSectionCoord(section.lastCameraZ); - - BlockPos pos = SectionPos.of(camSectionX, camSectionY, camSectionZ).origin(); - if (!BloomUtil.BLOOM_BUFFERS.containsKey(pos) || !BloomUtil.BLOOM_BUFFER_SORT_STATES.containsKey(pos)) { - continue; - } - - if (cameraChangedSection || section.isAlignedWithSectionOnGrid(camSectionX, camSectionY, camSectionZ)) { - list.add(pos); - } - } - } - return list; - } - @SubscribeEvent public static void registerChunkMeshAppenders(ChunkMeshEvent event) { event.addMeshAppender(BloomMeshAppender.INSTANCE); From 49fcd771b8496ad20ba563de75be94f6e7b3a67f Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:16:48 +0300 Subject: [PATCH 057/269] fix fusion ring bloom --- .../machine/impl/FusionRingRender.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index db6cdc430be..ef2aaa5ebe9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -9,12 +9,15 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; @@ -66,13 +69,16 @@ public void render(FusionReactorMachine machine, float partialTick, return; } - if (!machine.isRegisteredBloomTicket()) { - machine.setRegisteredBloomTicket(true); - BloomUtil.registerBloomRender(FusionBloomSetup.INSTANCE, getBloomType(), - new FusionBloomEffect(machine), machine.getHolder().self()); + BloomAlgorithm bloomAlgorithm = getBloomType(); + if (bloomAlgorithm != BloomAlgorithm.DISABLED) { + if (!machine.isRegisteredBloomTicket()) { + machine.setRegisteredBloomTicket(true); + BloomUtil.registerBloomRender(FusionBloomSetup.INSTANCE, bloomAlgorithm, + new FusionBloomEffect(machine), machine.getHolder().self()); + } + } else { + renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); } - // TODO fix bloom on fusion reactor light - renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); } @OnlyIn(Dist.CLIENT) @@ -117,7 +123,7 @@ public AABB getRenderBoundingBox(FusionReactorMachine machine) { private static BloomAlgorithm getBloomType() { var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; - return config.useShader ? config.bloomAlgorithm : BloomAlgorithm.DISABLED; + return GTShaders.allowedShader() && config.useShader ? config.bloomAlgorithm : BloomAlgorithm.DISABLED; } @RequiredArgsConstructor @@ -141,7 +147,12 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild poseStack.popPose(); + ShaderInstance lastShader = RenderSystem.getShader(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + BufferUploader.drawWithShader(lightRingBuffer.end()); + + RenderSystem.setShader(() -> lastShader); } @Override From f42d6f689e0fc683172cbddb370343119099f985 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:17:18 +0300 Subject: [PATCH 058/269] remove enabling stencil buffer for no reason --- .../java/com/gregtechceu/gtceu/client/shader/GTShaders.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 9c5fd93c230..964a339bbfb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -67,9 +67,6 @@ private static void initPostShaders() { BLOOM_CHAIN = new PostChain(mc.getTextureManager(), mc.getResourceManager(), mc.getMainRenderTarget(), id); BLOOM_CHAIN.resize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); BLOOM_TARGET = BLOOM_CHAIN.getTempTarget("final"); - if (!BLOOM_TARGET.isStencilEnabled()) { - BLOOM_TARGET.enableStencil(); - } } catch (IOException ioexception) { GTCEu.LOGGER.error("Failed to load shader: {}", id, ioexception); BLOOM_CHAIN = null; From 7bc94a885dc9b0fb6ce3b7921eef89130ee31382 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:44:28 +0300 Subject: [PATCH 059/269] fix the shaders not working --- .../rendertarget/ScaledTextureTarget.java | 16 ++++-- .../core/mixins/client/PostChainMixin.java | 11 +--- .../shaders/program/filter_bloom_color.json | 5 +- .../gtceu/shaders/program/separable_blur.fsh | 53 ------------------- .../gtceu/shaders/program/separable_blur.json | 18 ------- .../shaders/program/unity_composite.json | 1 + .../shaders/program/unreal_composite.json | 1 + .../gtceu/shaders/program/up_sampling.json | 3 +- .../shaders/program/vanilla_composite.json | 1 + 9 files changed, 21 insertions(+), 88 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/program/separable_blur.json diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java b/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java index a1a4a58440a..020cbbef543 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java @@ -10,7 +10,7 @@ public class ScaledTextureTarget extends TextureTarget { public ScaledTextureTarget(float widthScale, float heightScale, int width, int height, boolean useDepth, boolean clearError) { - super((int) (width * widthScale), (int) (height * heightScale), useDepth, clearError); + super(width, height, useDepth, clearError); this.widthScale = widthScale; this.heightScale = heightScale; this.isInit = true; @@ -19,10 +19,16 @@ public ScaledTextureTarget(float widthScale, float heightScale, int width, int h @Override public void resize(int width, int height, boolean clearError) { - if (!isInit) { - super.resize(width, height, clearError); - return; + int renderWidth = width; + int renderHeight = height; + if (isInit) { + renderWidth *= widthScale; + renderHeight *= heightScale; } - super.resize(Math.max((int) (width * widthScale), 1), Math.max((int) (height * heightScale), 1), clearError); + super.resize(renderWidth, renderHeight, clearError); + + // set the screen width/height back to the actual values + this.viewWidth = width; + this.viewHeight = height; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java index 196cdf894b0..c1720b151de 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.shader.rendertarget.ScaledTextureTarget; import net.minecraft.client.renderer.PostChain; @@ -10,7 +9,6 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import com.mojang.blaze3d.pipeline.TextureTarget; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; @@ -45,15 +43,10 @@ public class PostChainMixin { @WrapOperation(method = "addTempTarget", at = @At(value = "NEW", target = "com/mojang/blaze3d/pipeline/TextureTarget")) private TextureTarget gtceu$wrapScaledTextureTarget(int width, int height, boolean useDepth, boolean clearError, - Operation original, - @Local(ordinal = 0, argsOnly = true) LocalIntRef widthRef, - @Local(ordinal = 1, argsOnly = true) LocalIntRef heightRef) { + Operation original) { TextureTarget target; - if (gtceu$widthScale > 0.0f && gtceu$heightScale > 0.0f) { - widthRef.set((int) (width * gtceu$widthScale)); - heightRef.set((int) (height * gtceu$heightScale)); - + if (gtceu$widthScale > 0 && gtceu$heightScale > 0) { target = new ScaledTextureTarget(gtceu$widthScale, gtceu$heightScale, width, height, useDepth, clearError); gtceu$widthScale = -1; gtceu$heightScale = -1; diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index a50bbbc12ce..4df5d909b5b 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -14,7 +14,8 @@ { "name": "MainDepthSampler" } ], "uniforms": [ - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } + { "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": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh b/src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh deleted file mode 100644 index 5ceca0deaaf..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/separable_blur.fsh +++ /dev/null @@ -1,53 +0,0 @@ -#version 150 - -#define PI 3.1415926538 - -uniform sampler2D DiffuseSampler; -uniform vec2 OutSize; -uniform vec2 BlurDir; -uniform float Radius; - -in vec2 texCoord; - -out vec4 fragColor; - -vec2 outTexel = 1.0 / OutSize; - -float calcExpectedMean() { - float invRadius = 1.0 / Radius; - float result = 0.0; - for (float i = 1; i <= Radius; i += 1) { - result += i * invRadius; - } - return result; -} - -float variance = ((Radius * Radius) - 1) / 12; -float twoVariance = 2.0 * variance; -float expectedMean = calcExpectedMean(); - -// pdf stands for "Probability density function" -float gaussianPdf(float x) { - return 1.0 / sqrt(PI * twoVariance) * exp(-pow(x - expectedMean, 2.0) / twoVariance); -} - -void main() { - vec4 blurred = vec4(0.0); - float totalAlpha = 0.0; - float totalSamples = 1.0; - - for(float r = 0; r <= Radius; r += 1.0) { - vec2 uvOffset = outTexel * r * BlurDir; - vec4 sample1 = texture(DiffuseSampler, texCoord + uvOffset); - vec4 sample2 = texture(DiffuseSampler, texCoord - uvOffset); - - float weight = gaussianPdf(r); - vec4 sampleValue = (sample1 + sample2) * weight; - - // Accumulate average alpha & smoothed blur - totalAlpha += sampleValue.a; - totalSamples += 2.0 * weight; - blurred += sampleValue; - } - fragColor = vec4(blurred.rgb / totalSamples, totalAlpha); -} diff --git a/src/main/resources/assets/gtceu/shaders/program/separable_blur.json b/src/main/resources/assets/gtceu/shaders/program/separable_blur.json deleted file mode 100644 index 982a26975c3..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/separable_blur.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" - }, - "vertex": "blit", - "fragment": "gtceu:separable_blur", - "attributes": [ "Position" ], - "samplers": [ - { "name": "DiffuseSampler" } - ], - "uniforms": [ - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BlurDir", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, - { "name": "Radius", "type": "float", "count": 1, "values": [ 5 ] } - ] -} diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json index 5c6ac7398ed..aaf6be1545c 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -13,6 +13,7 @@ { "name": "MainSampler" } ], "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": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.0 ] }, diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index 2062872b783..2b37f86dbb5 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -16,6 +16,7 @@ { "name": "BlurTexture4" } ], "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": "BloomRadius", "type": "float", "count": 1, "values": [ 1.0 ] }, { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json index 5de79da307d..6929a93c508 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -12,6 +12,7 @@ { "name": "DownTexture" } ], "uniforms": [ - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } + { "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 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json index 769c8536aaa..6c5e6a4e2fe 100644 --- a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json @@ -13,6 +13,7 @@ { "name": "BlurTexture" } ], "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": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.1 ] }, From 74f09b4d5ef68135a59811ffcd9bb1abcb06c482 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:44:57 +0300 Subject: [PATCH 060/269] apparently depth checking does not work, revert --- .../gtceu/shaders/post/bloom_unity.json | 31 ++-------------- .../gtceu/shaders/post/bloom_unreal.json | 37 +++---------------- .../shaders/program/filter_bloom_color.fsh | 11 +----- .../shaders/program/filter_bloom_color.json | 4 +- 4 files changed, 11 insertions(+), 72 deletions(-) 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 bb04c399766..c22ea346e19 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -35,27 +35,15 @@ }, { "name": "swap2b", - "bilinear": true, - "scale": { - "width": 0.5, - "height": 0.5 - } + "bilinear": true }, { "name": "swap4b", - "bilinear": true, - "scale": { - "width": 0.25, - "height": 0.25 - } + "bilinear": true }, { "name": "swap8b", - "bilinear": true, - "scale": { - "width": 0.125, - "height": 0.125 - } + "bilinear": true }, "final", "swap" @@ -66,18 +54,7 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { - "name": "DiffuseDepthSampler", - "id": "final:depth" - }, - { - "name": "MainSampler", - "id": "minecraft:main" - }, - { - "name": "MainDepthSampler", - "id": "minecraft:main:depth" - } + { "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 4db9fdf8c32..3329533647e 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -35,35 +35,19 @@ }, { "name": "swap2b", - "bilinear": true, - "scale": { - "width": 0.5, - "height": 0.5 - } + "bilinear": true }, { "name": "swap4b", - "bilinear": true, - "scale": { - "width": 0.25, - "height": 0.25 - } + "bilinear": true }, { "name": "swap8b", - "bilinear": true, - "scale": { - "width": 0.125, - "height": 0.125 - } + "bilinear": true }, { "name": "swap16b", - "bilinear": true, - "scale": { - "width": 0.0625, - "height": 0.0625 - } + "bilinear": true }, "final" ], @@ -73,18 +57,7 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { - "name": "DiffuseDepthSampler", - "id": "final:depth" - }, - { - "name": "MainSampler", - "id": "minecraft:main" - }, - { - "name": "MainDepthSampler", - "id": "minecraft:main:depth" - } + { "id": "minecraft:main", "name": "MainSampler" } ] }, { 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 a6d02c0de3e..00a6c62a185 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,9 +1,7 @@ #version 150 uniform sampler2D DiffuseSampler; -uniform sampler2D DiffuseDepthSampler; uniform sampler2D MainSampler; -uniform sampler2D MainDepthSampler; uniform bool EnableFilter; in vec2 texCoord; @@ -13,16 +11,9 @@ out vec4 fragColor; void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { - float mainDepth = texture(MainDepthSampler, texCoord).r; - float bloomDepth = texture(DiffuseDepthSampler, texCoord).r; - if (mainDepth > bloomDepth) { - fragColor = vec4(0.0); - } - /* vec4 mainColor = texture(MainSampler, texCoord); - if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.01){ + if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { fragColor = vec4(0.0); } - */ } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 4df5d909b5b..e1ad2712050 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -9,9 +9,7 @@ "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" }, - { "name": "DiffuseDepthSampler" }, - { "name": "MainSampler" }, - { "name": "MainDepthSampler" } + { "name": "MainSampler" } ], "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 ] }, From 535e0ec32ed9ff7bf7cbc8bde9ab8db1ca75539a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 01:05:46 +0300 Subject: [PATCH 061/269] remove the rescaling target --- .../rendertarget/ScaledTextureTarget.java | 34 ------------- .../gtceu/config/ConfigHolder.java | 1 - .../core/mixins/client/PostChainMixin.java | 51 +++++-------------- .../gtceu/shaders/post/bloom_unity.json | 24 ++------- .../gtceu/shaders/post/bloom_unreal.json | 24 ++------- src/main/resources/gtceu.mixins.json | 1 - 6 files changed, 20 insertions(+), 115 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java b/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java deleted file mode 100644 index 020cbbef543..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/rendertarget/ScaledTextureTarget.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.gregtechceu.gtceu.client.shader.rendertarget; - -import com.mojang.blaze3d.pipeline.TextureTarget; - -public class ScaledTextureTarget extends TextureTarget { - - private final float widthScale; - private final float heightScale; - private final boolean isInit; - - public ScaledTextureTarget(float widthScale, float heightScale, int width, int height, - boolean useDepth, boolean clearError) { - super(width, height, useDepth, clearError); - this.widthScale = widthScale; - this.heightScale = heightScale; - this.isInit = true; - this.resize(width, height, clearError); - } - - @Override - public void resize(int width, int height, boolean clearError) { - int renderWidth = width; - int renderHeight = height; - if (isInit) { - renderWidth *= widthScale; - renderHeight *= heightScale; - } - super.resize(renderWidth, renderHeight, clearError); - - // set the screen width/height back to the actual values - this.viewWidth = width; - this.viewHeight = height; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 562b9f09ad5..56d1c357100 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -965,5 +965,4 @@ public static class DeveloperConfigs { @Configurable.Comment({ "Dump all registered GT models/blockstates/etc?", "Default: false" }) public boolean dumpAssets = false; } - } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java index c1720b151de..c18757e74e0 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java @@ -1,63 +1,36 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.shader.rendertarget.ScaledTextureTarget; - import net.minecraft.client.renderer.PostChain; import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.pipeline.TextureTarget; +import com.mojang.blaze3d.pipeline.RenderTarget; import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; +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.Map; + @Mixin(PostChain.class) public class PostChainMixin { - @Unique - private float gtceu$widthScale = -1; - @Unique - private float gtceu$heightScale = -1; - @Unique - private boolean gtceu$bilinear = false; + @Shadow + @Final + private Map customRenderTargets; @Inject(method = "parseTargetNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/PostChain;addTempTarget(Ljava/lang/String;II)V", - ordinal = 1)) + ordinal = 1, + shift = At.Shift.AFTER)) private void gtceu$scaleTargetSize(CallbackInfo ci, @Local JsonObject json, @Local String name) { - if (json.has("scale")) { - JsonObject scale = GsonHelper.getAsJsonObject(json, "scale"); - gtceu$widthScale = GsonHelper.getAsFloat(scale, "width", 1.0f); - gtceu$heightScale = GsonHelper.getAsFloat(scale, "height", 1.0f); - } - gtceu$bilinear = GsonHelper.getAsBoolean(json, "bilinear"); - } - - @WrapOperation(method = "addTempTarget", - at = @At(value = "NEW", target = "com/mojang/blaze3d/pipeline/TextureTarget")) - private TextureTarget gtceu$wrapScaledTextureTarget(int width, int height, boolean useDepth, boolean clearError, - Operation original) { - TextureTarget target; - - if (gtceu$widthScale > 0 && gtceu$heightScale > 0) { - target = new ScaledTextureTarget(gtceu$widthScale, gtceu$heightScale, width, height, useDepth, clearError); - gtceu$widthScale = -1; - gtceu$heightScale = -1; - } else { - target = original.call(width, height, useDepth, clearError); + if (GsonHelper.getAsBoolean(json, "bilinear", false)) { + this.customRenderTargets.get(name).setFilterMode(GL11.GL_LINEAR); } - if (gtceu$bilinear) { - target.setFilterMode(GL11.GL_NEAREST); - gtceu$bilinear = false; - } - - return target; } } 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 c22ea346e19..cfb77fafed2 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -3,35 +3,19 @@ "gtceu:filter_temp", { "name": "swap2a", - "bilinear": true, - "scale": { - "width": 0.5, - "height": 0.5 - } + "bilinear": true }, { "name": "swap4a", - "bilinear": true, - "scale": { - "width": 0.25, - "height": 0.25 - } + "bilinear": true }, { "name": "swap8a", - "bilinear": true, - "scale": { - "width": 0.125, - "height": 0.125 - } + "bilinear": true }, { "name": "swap16a", - "bilinear": true, - "scale": { - "width": 0.0625, - "height": 0.0625 - } + "bilinear": true }, { "name": "swap2b", 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 3329533647e..c53183496e3 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -3,35 +3,19 @@ "gtceu:filter_temp", { "name": "swap2a", - "bilinear": true, - "scale": { - "width": 0.5, - "height": 0.5 - } + "bilinear": true }, { "name": "swap4a", - "bilinear": true, - "scale": { - "width": 0.25, - "height": 0.25 - } + "bilinear": true }, { "name": "swap8a", - "bilinear": true, - "scale": { - "width": 0.125, - "height": 0.125 - } + "bilinear": true }, { "name": "swap16a", - "bilinear": true, - "scale": { - "width": 0.0625, - "height": 0.0625 - } + "bilinear": true }, { "name": "swap2b", diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 5172137aa4a..5d49272d0ab 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -28,7 +28,6 @@ "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "embeddium.BlockRendererMixin", - "embeddium.SodiumWorldRendererAccessor", "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", From 738caec079cb6e162617b0275341f71d6f77079b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 26 Jul 2025 01:50:00 +0300 Subject: [PATCH 062/269] remove entirely unused fusion and cable bloom configs --- .../gtceu/client/bloom/BloomUtil.java | 81 +++++--------- .../bloom/particle/GTBloomParticle.java | 10 +- .../client/particle/GTOverheatParticle.java | 24 +---- .../gtceu/client/particle/GTParticle.java | 3 +- .../machine/impl/FusionRingRender.java | 48 ++------- .../gtceu/config/ConfigHolder.java | 100 ------------------ 6 files changed, 41 insertions(+), 225 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 4230631d776..3e1f285473c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -42,13 +42,7 @@ @OnlyIn(Dist.CLIENT) public class BloomUtil { - public static float strength = ConfigHolder.INSTANCE.client.shader.strength; - public static float baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - public static float highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.maxBrightness; - public static float lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.minBrightness; - public static float step = ConfigHolder.INSTANCE.client.shader.step; - - private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); + private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); @@ -69,7 +63,6 @@ public class BloomUtil { *

* * @param setup Render setup, if exists - * @param algorithm Type of the bloom * @param render Rendering callback * @param blockEntity Meta tile entity instance * @return Ticket for the registered bloom render callback @@ -77,11 +70,10 @@ public class BloomUtil { */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @NotNull BlockEntity blockEntity) { Objects.requireNonNull(blockEntity, "blockEntity == null"); - return registerBloomRender(setup, algorithm, + return registerBloomRender(setup, new IBloomEffect() { @Override @@ -111,20 +103,18 @@ public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { * returned instead. *

* - * @param setup Render setup, if exists - * @param algorithm Type of the bloom - * @param render Rendering callback - * @param particle Particle instance + * @param setup Render setup, if exists + * @param render Rendering callback + * @param particle Particle instance * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null || metaTileEntity == null} */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @NotNull GTParticle particle) { Objects.requireNonNull(particle, "particle == null"); - return registerBloomRender(setup, algorithm, render, t -> particle.isAlive()); + return registerBloomRender(setup, render, t -> particle.isAlive()); } /** @@ -138,22 +128,20 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup *

* * @param setup Render setup, if exists - * @param algorithm Type of the bloom * @param render Rendering callback * @param validityChecker Optional validity checker; returning {@code false} causes the ticket to be invalidated. - * Checked on both pre-/post-render each frame. + * Checked on both pre- / post-render each frame. * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null} - * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity) - * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, GTParticle) - * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, Predicate, Supplier) + * @see #registerBloomRender(IRenderSetup, IBloomEffect, BlockEntity) + * @see #registerBloomRender(IRenderSetup, IBloomEffect, GTParticle) + * @see #registerBloomRender(IRenderSetup, IBloomEffect, Predicate, Supplier) */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @Nullable Predicate validityChecker) { - return registerBloomRender(setup, algorithm, render, validityChecker, null); + return registerBloomRender(setup, render, validityChecker, null); } /** @@ -167,27 +155,25 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup *

* * @param setup Render setup, if exists - * @param algorithm Type of the bloom * @param render Rendering callback * @param validityChecker Optional validity checker; returning {@code false} causes the ticket to be invalidated. - * Checked on both pre/post render each frame. + * Checked on both pre- / post-render each frame. * @param worldContext Optional world bound to the ticket. If the world returned is not null, the bloom ticket * will be automatically invalidated on world unload. If world context returns {@code null}, * it will not be affected by aforementioned automatic invalidation. * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null} - * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity) - * @see #registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, GTParticle) + * @see #registerBloomRender(IRenderSetup, IBloomEffect, BlockEntity) + * @see #registerBloomRender(IRenderSetup, IBloomEffect, GTParticle) */ @NotNull public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull BloomAlgorithm algorithm, @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; - if (algorithm == BloomAlgorithm.DISABLED) return BloomRenderTicket.INVALID; - BloomRenderTicket ticket = new BloomRenderTicket(setup, algorithm, render, validityChecker, worldContext); + + BloomRenderTicket ticket = new BloomRenderTicket(setup, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.writeLock().lock(); try { SCHEDULED_BLOOM_RENDERS.add(ticket); @@ -251,12 +237,6 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende postDraw(); } - strength = ConfigHolder.INSTANCE.client.shader.strength; - baseBrightness = ConfigHolder.INSTANCE.client.shader.baseBrightness; - highBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.maxBrightness; - lowBrightnessThreshold = ConfigHolder.INSTANCE.client.shader.minBrightness; - step = ConfigHolder.INSTANCE.client.shader.step; - if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { setupBloomUniforms(true); drawBlockBloom(poseStack, projectionMatrix, camPos); @@ -273,8 +253,7 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende private static void preDraw() { for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { if (!ticket.isValid()) continue; - BLOOM_RENDERS.computeIfAbsent(new BloomRenderKey(ticket.renderSetup, ticket.algorithm), - k -> new ArrayList<>()).add(ticket); + BLOOM_RENDERS.computeIfAbsent(ticket.renderSetup, k -> new ArrayList<>()).add(ticket); } SCHEDULED_BLOOM_RENDERS.clear(); } @@ -395,6 +374,8 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { private static final String BLUR_DIR_UNIFORM = "BlurDir"; private static void setupBloomUniforms(boolean drawBlockBloom) { + var config = ConfigHolder.INSTANCE.client.shader; + // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); for (PostPass pass : passes) { @@ -406,15 +387,15 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { if (name.contains(BLUR_SHADER_NAME)) { int index = passes.indexOf(pass); if (index % 2 == 0) { - shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, step); + shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, config.step); } else { - shader.safeGetUniform(BLUR_DIR_UNIFORM).set(step, 0.0f); + shader.safeGetUniform(BLUR_DIR_UNIFORM).set(config.step, 0.0f); } } - shader.safeGetUniform(BLOOM_STRENGTH_UNIFORM).set(strength); - shader.safeGetUniform(BASE_BRIGHTNESS_UNIFORM).set(baseBrightness); - shader.safeGetUniform(MAX_BRIGHTNESS_UNIFORM).set(highBrightnessThreshold); - shader.safeGetUniform(MIN_BRIGHTNESS_UNIFORM).set(lowBrightnessThreshold); + shader.safeGetUniform(BLOOM_STRENGTH_UNIFORM).set(config.strength); + shader.safeGetUniform(BASE_BRIGHTNESS_UNIFORM).set(config.baseBrightness); + shader.safeGetUniform(MAX_BRIGHTNESS_UNIFORM).set(config.maxBrightness); + shader.safeGetUniform(MIN_BRIGHTNESS_UNIFORM).set(config.minBrightness); } } @@ -473,17 +454,12 @@ public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pos } } - private record BloomRenderKey(@Nullable IRenderSetup renderSetup, @NotNull BloomAlgorithm algorithm) { - - } - public static final class BloomRenderTicket { public static final BloomRenderTicket INVALID = new BloomRenderTicket(); @Nullable private final IRenderSetup renderSetup; - private final BloomAlgorithm algorithm; private final IBloomEffect render; @Nullable private final Predicate validityChecker; @@ -493,15 +469,14 @@ public static final class BloomRenderTicket { private boolean invalidated; BloomRenderTicket() { - this(null, BloomAlgorithm.DISABLED, (p, b, c) -> {}, null, null); + this(null, (p, b, c) -> {}, null, null); this.invalidated = true; } - BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull BloomAlgorithm algorithm, - @NotNull IBloomEffect render, @Nullable Predicate validityChecker, + BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull IBloomEffect render, + @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { this.renderSetup = renderSetup; - this.algorithm = Objects.requireNonNull(algorithm, "algorithm == null"); this.render = Objects.requireNonNull(render, "render == null"); this.validityChecker = validityChecker; this.worldContext = worldContext; diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java index 1911a499cbb..c30e61faeff 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java @@ -1,24 +1,18 @@ package com.gregtechceu.gtceu.client.bloom.particle; -import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.particle.GTParticle; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public abstract class GTBloomParticle extends GTParticle implements IBloomEffect { public GTBloomParticle(double posX, double posY, double posZ) { super(posX, posY, posZ); - BloomUtil.registerBloomRender(getBloomRenderSetup(), getBloomType(), this, this); + BloomUtil.registerBloomRender(getBloomRenderSetup(), this, this); } - @Nullable - protected abstract IRenderSetup getBloomRenderSetup(); - - @NotNull - protected abstract BloomAlgorithm getBloomType(); + protected @Nullable abstract IRenderSetup getBloomRenderSetup(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 9c6ac1b569a..21b656e148a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -1,15 +1,12 @@ package com.gregtechceu.gtceu.client.particle; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.bloom.particle.GTBloomParticle; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; @@ -240,9 +237,8 @@ public String toString() { '}'; } - @Nullable @Override - public IRenderSetup getRenderSetup() { + public @Nullable IRenderSetup getRenderSetup() { return SETUP; } @@ -257,19 +253,11 @@ public boolean shouldRender(@NotNull EffectRenderContext context) { return true; } - @Nullable @Override - protected IRenderSetup getBloomRenderSetup() { + protected @Nullable IRenderSetup getBloomRenderSetup() { return SETUP; } - @NotNull - @Override - protected BloomAlgorithm getBloomType() { - var config = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; - return config.useShader ? config.bloomAlgorithm : BloomAlgorithm.DISABLED; - } - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @NotNull EffectRenderContext context) { float red = ((color >> 16) & 0xFF) / 255f; @@ -289,14 +277,6 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild @Override @OnlyIn(Dist.CLIENT) public void preDraw(@NotNull BufferBuilder buffer) { - var config = ConfigHolder.INSTANCE.client.shader.heatEffectBloom; - - BloomUtil.strength = config.strength; - BloomUtil.baseBrightness = config.baseBrightness; - BloomUtil.highBrightnessThreshold = config.highBrightnessThreshold; - BloomUtil.lowBrightnessThreshold = config.lowBrightnessThreshold; - BloomUtil.step = 1; - RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.enableBlend(); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index da4662913b0..9d2f468043c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -111,8 +111,7 @@ public void renderParticle(@NotNull PoseStack poseStack, @NotNull BufferBuilder /** * @return Render setup for this particle, if exists */ - @Nullable - public IRenderSetup getRenderSetup() { + public @Nullable IRenderSetup getRenderSetup() { return null; } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index ef2aaa5ebe9..682211d3325 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -1,18 +1,14 @@ package com.gregtechceu.gtceu.client.renderer.machine.impl; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; import com.gregtechceu.gtceu.client.bloom.IBloomEffect; -import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.RenderBufferHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -69,16 +65,14 @@ public void render(FusionReactorMachine machine, float partialTick, return; } - BloomAlgorithm bloomAlgorithm = getBloomType(); - if (bloomAlgorithm != BloomAlgorithm.DISABLED) { - if (!machine.isRegisteredBloomTicket()) { - machine.setRegisteredBloomTicket(true); - BloomUtil.registerBloomRender(FusionBloomSetup.INSTANCE, bloomAlgorithm, - new FusionBloomEffect(machine), machine.getHolder().self()); - } - } else { - renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); + if (machine.isRegisteredBloomTicket() && !machine.isFormed()) { + machine.setRegisteredBloomTicket(false); + } + if (!machine.isRegisteredBloomTicket()) { + machine.setRegisteredBloomTicket(true); + BloomUtil.registerBloomRender(null, new FusionBloomEffect(machine), machine.getHolder().self()); } + renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); } @OnlyIn(Dist.CLIENT) @@ -121,11 +115,6 @@ public AABB getRenderBoundingBox(FusionReactorMachine machine) { return new AABB(machine.getPos()).inflate(getViewDistance() / 2.0D); } - private static BloomAlgorithm getBloomType() { - var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; - return GTShaders.allowedShader() && config.useShader ? config.bloomAlgorithm : BloomAlgorithm.DISABLED; - } - @RequiredArgsConstructor private final class FusionBloomEffect implements IBloomEffect { @@ -157,29 +146,8 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild @Override public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { - return machine.recipeLogic.isWorking() && delta > 0 && + return (machine.recipeLogic.isWorking() || delta > 0) && context.frustum().isVisible(FusionRingRender.this.getRenderBoundingBox(machine)); } } - - private static final class FusionBloomSetup implements IRenderSetup { - - private static final FusionBloomSetup INSTANCE = new FusionBloomSetup(); - - @Override - public void preDraw(@NotNull BufferBuilder buffer) { - var config = ConfigHolder.INSTANCE.client.shader.fusionBloom; - - BloomUtil.strength = config.strength; - BloomUtil.baseBrightness = config.baseBrightness; - BloomUtil.highBrightnessThreshold = config.highBrightnessThreshold; - BloomUtil.lowBrightnessThreshold = config.lowBrightnessThreshold; - BloomUtil.step = 1; - - RenderSystem.setShaderColor(1, 1, 1, 1); - } - - @Override - public void postDraw(@NotNull BufferBuilder buffer) {} - } } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 56d1c357100..d593a589e44 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -820,106 +820,6 @@ public static class ShaderOptions { @Configurable.Comment({ "Blur Step (bloom range)", "Default: 1" }) @Configurable.DecimalRange(min = 0) public float step = 1.0f; - - @Configurable - @Configurable.Comment("Bloom config options for the fusion reactor.") - public FusionBloom fusionBloom = new FusionBloom(); - - @Configurable - @Configurable.Comment("Bloom config options for the cable burning effect") - public HeatEffectBloom heatEffectBloom = new HeatEffectBloom(); - - public static class FusionBloom { - - @Configurable - @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) - public boolean useShader = true; - - @Configurable - @Configurable.Comment({ "Bloom Strength", - "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", - "Default: 1.5" }) - @Configurable.DecimalRange(min = 0) - public float strength = 1.5f; - - @Configurable - @Configurable.Comment({ "Bloom Algorithm", - "GAUSSIAN - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", - "UNITY - Unity-like Bloom", - "UNREAL - Unreal-like Bloom", - "Default: UNREAL" }) - public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; - - @Configurable - @Configurable.Comment({ - "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", - "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", - "This value should be greater than lowBrightnessThreshold.", "Default: 1.3" }) - @Configurable.DecimalRange(min = 0) - public float highBrightnessThreshold = 1.3f; - - @Configurable - @Configurable.Comment({ - "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts (e.g., night/caves)", - "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", - "This value should be smaller than highBrightnessThreshold.", "Default: 0.3" }) - @Configurable.DecimalRange(min = 0) - public float lowBrightnessThreshold = 0.3f; - - @Configurable - @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", - "This value should be smaller than highBrightnessThreshold.", - "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", - "Default: 0.1" }) - @Configurable.DecimalRange(min = 0) - public float baseBrightness = 0.1f; - } - - public static class HeatEffectBloom { - - @Configurable - @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) - public boolean useShader = true; - - @Configurable - @Configurable.Comment({ "Bloom Strength", - "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", - "Default: 2" }) - @Configurable.DecimalRange(min = 0) - public float strength = 2.0f; - - @Configurable - @Configurable.Comment({ "Bloom Algorithm", - "GAUSSIAN - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", - "UNITY - Unity-like Bloom", - "UNREAL - Unreal-like Bloom", - "Default: UNREAL" }) - public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; - - @Configurable - @Configurable.Comment({ - "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", - "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", - "This value should be greater than lowBrightnessThreshold.", "Default: 1.4" }) - @Configurable.DecimalRange(min = 0) - public float highBrightnessThreshold = 1.4f; - - @Configurable - @Configurable.Comment({ - "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts (e.g., night/caves)", - "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", - "This value should be smaller than highBrightnessThreshold.", "Default: 0.6" }) - @Configurable.DecimalRange(min = 0) - public float lowBrightnessThreshold = 0.6f; - - @Configurable - @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", - "This value should be smaller than highBrightnessThreshold.", - "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", - "Default: 0.1" }) - @Configurable.DecimalRange(min = 0) - public float baseBrightness = 0.1f; - } } public static class RendererOptions { From 2f4b437b0e8a5595d7a29df299373d70456db9cc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:35:28 +0200 Subject: [PATCH 063/269] Remove GAUSSIAN bloom option as it isn't implemented and UNREAL does the same thing --- .../gtceu/client/bloom/BloomAlgorithm.java | 8 ++----- .../gtceu/client/shader/GTShaders.java | 9 +++----- .../gtceu/config/ConfigHolder.java | 5 ++-- .../gtceu/shaders/post/bloom_unity.json | 4 +++- .../gtceu/shaders/post/bloom_unreal.json | 4 +++- .../shaders/program/filter_bloom_color.json | 4 +++- .../shaders/program/vanilla_composite.fsh | 22 ------------------ .../shaders/program/vanilla_composite.json | 23 ------------------- 8 files changed, 16 insertions(+), 63 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh delete mode 100644 src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java index fd29d12455f..369637488c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java @@ -3,15 +3,11 @@ public enum BloomAlgorithm { /** - * Simple Gaussian Blur - */ - GAUSSIAN, - /** - * Unity Bloom + * Unity Bloom (rescale) */ UNITY, /** - * Unreal Bloom + * Unreal Bloom (gaussian blur) */ UNREAL, /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 964a339bbfb..33325430172 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -26,7 +26,7 @@ public class GTShaders { public static RenderTarget BLOOM_TARGET = null; public static void onRegisterShaders(RegisterShadersEvent event) { - if (!innerAllowedShader()) { + if (!earlyAllowedShader()) { return; } @@ -41,9 +41,6 @@ private static void initPostShaders() { ResourceLocation id; switch (BLOOM_TYPE) { - case GAUSSIAN -> { - id = GTCEu.id("shaders/post/bloom_gaussian.json"); - } case UNITY -> { id = GTCEu.id("shaders/post/bloom_unity.json"); } @@ -79,10 +76,10 @@ private static void initPostShaders() { } public static boolean allowedShader() { - return BLOOM_CHAIN != null && BLOOM_TARGET != null && innerAllowedShader(); + return BLOOM_CHAIN != null && BLOOM_TARGET != null && earlyAllowedShader(); } - private static boolean innerAllowedShader() { + private static boolean earlyAllowedShader() { return ConfigHolder.INSTANCE.client.shader.enableBloom && !GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 4246dedc613..b786a2df860 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -834,9 +834,8 @@ public static class ShaderOptions { @Configurable @Configurable.Comment({ "Bloom Algorithm", - "GAUSSIAN - Simple Gaussian Blur Bloom (Fast) NYI: WILL ERROR", - "UNITY - Unity-like Bloom", - "UNREAL - Unreal-like Bloom", + "UNITY - Unity-like Bloom (rescale)", + "UNREAL - Unreal-like Bloom (gaussian blur)", "Default: UNREAL" }) public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; 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 cfb77fafed2..06307f6af72 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -38,7 +38,9 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { "id": "minecraft:main", "name": "MainSampler" } + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, { 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 c53183496e3..124604677d7 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -41,7 +41,9 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { "id": "minecraft:main", "name": "MainSampler" } + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, { diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index e1ad2712050..4df5d909b5b 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -9,7 +9,9 @@ "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" }, - { "name": "MainSampler" } + { "name": "DiffuseDepthSampler" }, + { "name": "MainSampler" }, + { "name": "MainDepthSampler" } ], "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 ] }, diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh deleted file mode 100644 index d5adabfe220..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.fsh +++ /dev/null @@ -1,22 +0,0 @@ -#version 150 - -uniform sampler2D DiffuseSampler; -uniform sampler2D HighlightSampler; -uniform sampler2D BlurTexture; -uniform float BloomStrength; -uniform float BaseBrightness; -uniform float MaxBrightness; -uniform float MinBrightness; - -in vec2 texCoord; -out vec4 fragColor; - -void main() { - vec3 bloom = texture(BlurTexture, texCoord).rgb * BloomStrength; - vec4 background = texture(DiffuseSampler, texCoord); - vec4 highLight = texture(HighlightSampler, texCoord); - background.rgb = background.rgb * (1 - highLight.a) + highLight.a * highLight.rgb; - float max = max(background.b, max(background.r, background.g)); - float min = min(background.b, min(background.r, background.g)); - fragColor = vec4(background.rgb + bloom.rgb * ((1. - (max + min) / 2.) * (MaxBrightness - MinBrightness) + MinBrightness + BaseBrightness), 1.); -} diff --git a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json b/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json deleted file mode 100644 index 6c5e6a4e2fe..00000000000 --- a/src/main/resources/assets/gtceu/shaders/program/vanilla_composite.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" - }, - "vertex": "blit", - "fragment": "gtceu:vanilla_composite", - "attributes": [ "Position" ], - "samplers": [ - { "name": "DiffuseSampler" }, - { "name": "HighlightSampler" }, - { "name": "BlurTexture" } - ], - "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": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, - { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.1 ] }, - { "name": "MaxBrightness", "type": "float", "count": 1, "values": [ 0.7 ] }, - { "name": "MinBrightness", "type": "float", "count": 1, "values": [ 0.2 ] } - ] -} From ec8bec27ee87ae1402a78023a7199786a088e053 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:35:47 +0200 Subject: [PATCH 064/269] block loading mixins if there are load errors (thanks Oculus) --- .../java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index c71d604433f..abe5ca01cf1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -42,6 +42,9 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (!LoadingModList.get().getErrors().isEmpty()) { + return false; + } if (mixinClassName.startsWith(DEV_PACKAGE)) { return !FMLLoader.isProduction(); } From f90f1c2a3af4f4c7239db16fe8cdf10c8ccf2ce8 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 09:33:42 +0200 Subject: [PATCH 065/269] rename GTShaders's util methods --- .../com/gregtechceu/gtceu/client/bloom/BloomUtil.java | 8 ++++---- .../gtceu/client/forge/ForgeClientEventListener.java | 4 ++-- .../gregtechceu/gtceu/client/renderer/GTRenderTypes.java | 4 ++-- .../com/gregtechceu/gtceu/client/shader/GTShaders.java | 8 ++++---- .../gtceu/core/mixins/embeddium/BlockRendererMixin.java | 2 +- .../integration/embeddium/renderer/BloomMeshAppender.java | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 3e1f285473c..085a0fd1096 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -171,7 +171,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @NotNull IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier worldContext) { - if (!GTShaders.allowedShader()) return BloomRenderTicket.INVALID; + if (!GTShaders.canUseBloomShader()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.writeLock().lock(); @@ -215,7 +215,7 @@ public static void init() {} public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRenderer levelRenderer, PoseStack poseStack, Matrix4f projectionMatrix, Frustum frustum, float partialTicks) { - if (!GTShaders.allowedShader()) { + if (!GTShaders.canUseBloomShader()) { return; } Vec3 camPos = camera.getPosition(); @@ -350,7 +350,7 @@ public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { } public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { - if (!GTShaders.allowedShader()) { + if (!GTShaders.canUseBloomShader()) { return; } @@ -442,7 +442,7 @@ public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pos original.call(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); - if (!GTShaders.allowedShader()) { + if (!GTShaders.canUseBloomShader()) { return; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java index c12337925ab..bb939db36de 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/forge/ForgeClientEventListener.java @@ -82,7 +82,7 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { @SubscribeEvent public static void onChunkUnloadEvent(ChunkEvent.Unload event) { - if (!GTShaders.allowedShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { + if (!GTShaders.canUseBloomShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { return; } ChunkAccess chunk = event.getChunk(); @@ -100,7 +100,7 @@ public static void onChunkUnloadEvent(ChunkEvent.Unload event) { @SubscribeEvent public static void onRenderTick(TickEvent.RenderTickEvent event) { if (event.phase == TickEvent.Phase.START && Minecraft.getInstance().level != null) { - if (GTShaders.allowedShader()) { + if (GTShaders.canUseBloomShader()) { GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } 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 1db2b47d74d..2cdd2d5e26f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -21,12 +21,12 @@ public class GTRenderTypes extends RenderType { public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard( "bloom_target", () -> { - if (GTShaders.allowedShader()) { + if (GTShaders.canUseBloomShader()) { GTShaders.BLOOM_TARGET.bindWrite(false); } }, () -> { - if (GTShaders.allowedShader()) { + if (GTShaders.canUseBloomShader()) { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 33325430172..105352e1236 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -26,7 +26,7 @@ public class GTShaders { public static RenderTarget BLOOM_TARGET = null; public static void onRegisterShaders(RegisterShadersEvent event) { - if (!earlyAllowedShader()) { + if (!canLoadBloomShader()) { return; } @@ -75,11 +75,11 @@ private static void initPostShaders() { } } - public static boolean allowedShader() { - return BLOOM_CHAIN != null && BLOOM_TARGET != null && earlyAllowedShader(); + public static boolean canUseBloomShader() { + return BLOOM_CHAIN != null && BLOOM_TARGET != null && canLoadBloomShader(); } - private static boolean earlyAllowedShader() { + private static boolean canLoadBloomShader() { return ConfigHolder.INSTANCE.client.shader.enableBloom && !GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index e499153d143..3f2e04df192 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -53,7 +53,7 @@ public class BlockRendererMixin { BlockPos chunkOrigin = SectionPos.of(ctx.pos()).origin(); // Check if quad is full brightness OR we have bloom enabled for the quad // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though - if (GTShaders.allowedShader() && gtceu$isEmissive(quad, light)) { + if (GTShaders.canUseBloomShader() && gtceu$isEmissive(quad, light)) { ModelQuadOrientation orientation = this.useReorienting ? ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index 7a1cc7b38f1..a1bbf4e3e16 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -15,7 +15,7 @@ public class BloomMeshAppender implements MeshAppender { @Override public void render(Context context) { - if (!GTShaders.allowedShader()) { + if (!GTShaders.canUseBloomShader()) { return; } BlockPos chunkOrigin = context.sectionOrigin().origin(); From 39b3213e0920710d70119086812f4d403c8da756 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 09:34:16 +0200 Subject: [PATCH 066/269] very minor cleanup --- .../gtceu/client/shader/GTShaders.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 105352e1236..680e623b0fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -38,24 +38,21 @@ private static void initPostShaders() { BLOOM_CHAIN.close(); } - ResourceLocation id; + ResourceLocation id = null; switch (BLOOM_TYPE) { - case UNITY -> { - id = GTCEu.id("shaders/post/bloom_unity.json"); - } - case UNREAL -> { - id = GTCEu.id("shaders/post/bloom_unreal.json"); - } + case UNITY -> id = GTCEu.id("shaders/post/bloom_unity.json"); + case UNREAL -> id = GTCEu.id("shaders/post/bloom_unreal.json"); case DISABLED -> { return; } - default -> { - GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomAlgorithm); - ConfigHolder.INSTANCE.client.shader.bloomAlgorithm = BloomAlgorithm.DISABLED; - BLOOM_TYPE = BloomAlgorithm.DISABLED; - return; - } + // skip adding a default branch in favor of the if statement below + } + if (id == null) { + GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomAlgorithm); + ConfigHolder.INSTANCE.client.shader.bloomAlgorithm = BloomAlgorithm.DISABLED; + BLOOM_TYPE = BloomAlgorithm.DISABLED; + return; } try { From 16bbf7a18e5a5890b4b5a48c81d54dcb053ba6fa Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 09:36:17 +0200 Subject: [PATCH 067/269] fix renamed method reference --- .../com/gregtechceu/gtceu/client/bloom/BloomUtil.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 085a0fd1096..1d2b71dfbe5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -223,7 +223,7 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende BLOOM_RENDER_LOCK.writeLock().lock(); try { - GTRenderTypes.getBloom().setupRenderState(); + GTRenderTypes.bloom().setupRenderState(); preDraw(); if (!BLOOM_RENDERS.isEmpty()) { @@ -342,9 +342,9 @@ public static void removeBloomChunk(BlockPos origin) { public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { BufferBuilder builder = BLOOM_BUFFER_BUILDERS.computeIfAbsent(pos, - $ -> new BufferBuilder(GTRenderTypes.getBloom().bufferSize())); + $ -> new BufferBuilder(GTRenderTypes.bloom().bufferSize())); if (!builder.building()) { - builder.begin(GTRenderTypes.getBloom().mode(), GTRenderTypes.getBloom().format()); + builder.begin(GTRenderTypes.bloom().mode(), GTRenderTypes.bloom().format()); } return builder; } @@ -429,10 +429,10 @@ private static void render(float partialTicks, PoseStack poseStack, Matrix4f pro Minecraft.getInstance().getProfiler().pop(); // noinspection UnstableApiUsage - ForgeHooksClient.dispatchRenderStage(GTRenderTypes.getBloom(), levelRenderer, + ForgeHooksClient.dispatchRenderStage(GTRenderTypes.bloom(), levelRenderer, poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); - GTRenderTypes.getBloom().clearRenderState(); + GTRenderTypes.bloom().clearRenderState(); } public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, From 6378e8062d42ff4052c3cb079fd83bd394c75d92 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 09:43:49 +0200 Subject: [PATCH 068/269] very minor doc cleanups --- .../gtceu/client/bloom/IBloomEffect.java | 7 +++---- .../machine/impl/FusionRingRender.java | 6 ++---- .../gtceu/client/util/StaticFaceBakery.java | 21 +++++++------------ 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java index 8420a54b077..8bfb6db8a05 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java @@ -9,8 +9,7 @@ import org.jetbrains.annotations.NotNull; /** - * Render callback interface for - * {@link BloomUtil#registerBloomRender(IRenderSetup, BloomAlgorithm, IBloomEffect, BlockEntity)}. + * Render callback interface for {@link BloomUtil#registerBloomRender(IRenderSetup, IBloomEffect, BlockEntity)}. */ @FunctionalInterface public interface IBloomEffect { @@ -27,8 +26,8 @@ void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buff /** * @param context render context - * @return if this effect should be rendered; returning {@code false} skips - * {@link #renderBloomEffect(PoseStack, BufferBuilder, EffectRenderContext)} call. + * @return if this effect should be rendered; returning {@code false} skips calling + * {@link #renderBloomEffect(PoseStack, BufferBuilder, EffectRenderContext)}. */ @OnlyIn(Dist.CLIENT) default boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index 682211d3325..e3cc9bdf17b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -29,7 +29,6 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.serialization.Codec; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; import static net.minecraft.util.FastColor.ARGB32.*; @@ -124,8 +123,7 @@ private final class FusionBloomEffect implements IBloomEffect { GTRenderTypes.getLightRing().bufferSize()); @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, - @NotNull EffectRenderContext context) { + public void renderBloomEffect(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) { BlockPos pos = machine.getPos(); lightRingBuffer.begin(GTRenderTypes.getLightRing().mode(), GTRenderTypes.getLightRing().format()); @@ -145,7 +143,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild } @Override - public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { + public boolean shouldRenderBloomEffect(EffectRenderContext context) { return (machine.recipeLogic.isWorking() || delta > 0) && context.frustum().isVisible(FusionRingRender.this.getRenderBoundingBox(machine)); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/StaticFaceBakery.java b/src/main/java/com/gregtechceu/gtceu/client/util/StaticFaceBakery.java index dd7b1c9a7c0..df792aa4c3e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/StaticFaceBakery.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/StaticFaceBakery.java @@ -69,13 +69,13 @@ public static BakedQuad bakeFace(AABB cube, Direction face, TextureAtlasSprite s emissivity); } - public static BakedQuad bakeFace(Direction face, TextureAtlasSprite sprite, ModelState rotation, int tintIndex, - int emissivity, boolean cull, boolean shade) { + public static BakedQuad bakeFace(Direction face, TextureAtlasSprite sprite, ModelState rotation, + int tintIndex, int emissivity, boolean cull, boolean shade) { return bakeFace(FaceQuad.BLOCK, face, sprite, rotation, tintIndex, emissivity, cull, shade); } - public static BakedQuad bakeFace(Direction face, TextureAtlasSprite sprite, ModelState rotation, int tintIndex, - int emissivity) { + public static BakedQuad bakeFace(Direction face, TextureAtlasSprite sprite, ModelState rotation, + int tintIndex, int emissivity) { return bakeFace(face, sprite, rotation, tintIndex, emissivity, true, true); } @@ -95,15 +95,10 @@ public static BakedQuad bakeFace(AABB cube, Direction face, TextureAtlasSprite s return bakeFace(cube, face, sprite, BlockModelRotation.X0_Y0, -1, 0, true, true); } - public static BakedQuad bakeQuad(Vector3f posFrom, - Vector3f posTo, - BlockElementFace face, - TextureAtlasSprite sprite, - Direction facing, - ModelState transform, - @Nullable BlockElementRotation partRotation, - boolean shade, - int emissivity) { + public static BakedQuad bakeQuad(Vector3f posFrom, Vector3f posTo, + BlockElementFace face, TextureAtlasSprite sprite, Direction facing, + ModelState transform, @Nullable BlockElementRotation partRotation, + boolean shade, int emissivity) { BlockFaceUV uvs = face.uv; if (transform.isUvLocked()) { uvs = recomputeUVs(face.uv, facing, transform.getRotation()); From 43054ecdbd416a4beede96031d48af9fa877f238 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 09:44:21 +0200 Subject: [PATCH 069/269] don't ignore `emissiveTexturesHaveBloom` config when embeddium is installed --- .../core/mixins/embeddium/BlockRendererMixin.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 3f2e04df192..ece8b0b2b73 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; @@ -53,7 +54,7 @@ public class BlockRendererMixin { BlockPos chunkOrigin = SectionPos.of(ctx.pos()).origin(); // Check if quad is full brightness OR we have bloom enabled for the quad // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though - if (GTShaders.canUseBloomShader() && gtceu$isEmissive(quad, light)) { + if (GTShaders.canUseBloomShader() && gtceu$hasBloom(quad, light)) { ModelQuadOrientation orientation = this.useReorienting ? ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { @@ -85,7 +86,7 @@ public class BlockRendererMixin { } @Unique - private static boolean gtceu$isEmissive(BakedQuadView quad, QuadLightData light) { + private static boolean gtceu$hasBloom(BakedQuadView quad, QuadLightData light) { if (!quad.hasShade() || !quad.hasAmbientOcclusion()) { return true; } @@ -93,6 +94,11 @@ public class BlockRendererMixin { return true; } + // do not apply bloom to emissive quads if this config is off + // same check is done for vanilla quads in BloomMetadataSection + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { + return false; + } for (int i = 0; i < 4; i++) { int quadLight = quad.getLight(i); int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); From be67f479d28f33be2e15f6d0fa3df7be3a8d76d7 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 11:18:19 +0200 Subject: [PATCH 070/269] fix merge mistakes --- src/main/java/com/gregtechceu/gtceu/api/GTValues.java | 1 + .../gtceu/client/renderer/block/FluidBlockRenderer.java | 4 ++-- .../gtceu/client/renderer/machine/impl/FluidAreaRender.java | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index d58b6e45418..0b9f0e4b57b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -118,6 +118,7 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { MODID_SODIUM = "sodium", MODID_EMBEDDIUM = "embeddium", MODID_OPTIFINE = "optifine", + MODID_CREATE = "create", MODID_CURIOS = "curios", MODID_AE2WTLIB = "ae2wtlib", MODID_MODERNFIX = "modernfix", diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java index 843915dab27..747bd2f2d79 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java @@ -45,8 +45,8 @@ public Vector3f[] transformVertices(Vector3fc[] vertices, Direction face) { case Z -> offsetZ += properties.offsetFace; } - var newVertices = new Vector3f[4]; - for (int i = 0; i < 4; i++) { + var newVertices = new Vector3f[vertices.length]; + for (int i = 0; i < vertices.length; i++) { newVertices[i] = RenderUtil.transformVertex(vertices[i], face, offsetX, offsetY, offsetZ); } return newVertices; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java index fdf0cc53b47..b0af77ec3d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java @@ -109,13 +109,12 @@ public void render(IFluidRenderMulti machine, float partialTick, for (RelativeDirection face : this.drawFaces) { poseStack.pushPose(); - Matrix4f pose = poseStack.last().pose(); Direction dir = face.getRelative(full.getFrontFacing(), full.getUpwardsFacing(), full.isFlipped()); if (dir.getAxis() != Direction.Axis.Y) dir = dir.getOpposite(); - fluidBlockRenderer.drawPlane(dir, machine.getFluidOffsets(), pose, consumer, cachedFluid, + fluidBlockRenderer.drawPlane(dir, machine.getFluidOffsets(), poseStack, consumer, cachedFluid, RenderUtil.FluidTextureType.STILL, packedOverlay, full.getPos()); poseStack.popPose(); } From 1ca9e619827aba71db2deb3d14f85d8b5c787cc1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 11:25:55 +0200 Subject: [PATCH 071/269] remove unused mixin --- .../core/mixins/client/RenderChunkMixin.java | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java deleted file mode 100644 index b5ed3677d4c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderChunkMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client; - -import com.gregtechceu.gtceu.client.bloom.BloomUtil; - -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; -import net.minecraft.core.BlockPos; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ChunkRenderDispatcher.RenderChunk.class) -public class RenderChunkMixin { - - @Shadow - @Final - BlockPos.MutableBlockPos origin; - - @Inject(method = "reset", at = @At("HEAD")) - private void gtceu$resetBloomBuffers(CallbackInfo ci) { - BloomUtil.removeBloomChunk(this.origin); - } -} From 651caae444989e719e2a6495b03a21106141eda6 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:01:36 +0200 Subject: [PATCH 072/269] implement the relative scaling logic shimmer had --- .../core/mixins/client/PostChainMixin.java | 28 +- .../gtceu/shaders/post/bloom_unity.json | 236 ++++++------ .../gtceu/shaders/post/bloom_unreal.json | 348 +++++++++--------- 3 files changed, 334 insertions(+), 278 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java index c18757e74e0..a6c3bf8ee64 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java @@ -4,6 +4,8 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.pipeline.RenderTarget; import org.lwjgl.opengl.GL11; @@ -23,12 +25,36 @@ public class PostChainMixin { @Final private Map customRenderTargets; + @WrapOperation(method = "parseTargetNode", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/util/GsonHelper;getAsInt(Lcom/google/gson/JsonObject;Ljava/lang/String;I)I", + ordinal = 0)) + private int gtceu$scaleTargetWidth(JsonObject json, String name, int screenWidth, Operation original) { + if (GsonHelper.isNumberValue(json, "scale_width")) { + return (int) (GsonHelper.getAsFloat(json, "scale_width", 1.0f) * screenWidth); + } + return original.call(json, name, screenWidth); + } + + @WrapOperation(method = "parseTargetNode", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/util/GsonHelper;getAsInt(Lcom/google/gson/JsonObject;Ljava/lang/String;I)I", + ordinal = 1)) + private int gtceu$scaleTargetHeight(JsonObject json, String name, int screenHeight, Operation original) { + if (GsonHelper.isNumberValue(json, "scale_height")) { + return (int) (GsonHelper.getAsFloat(json, "scale_height", 1.0f) * screenHeight); + } + return original.call(json, name, screenHeight); + } + @Inject(method = "parseTargetNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/PostChain;addTempTarget(Ljava/lang/String;II)V", ordinal = 1, shift = At.Shift.AFTER)) - private void gtceu$scaleTargetSize(CallbackInfo ci, @Local JsonObject json, @Local String name) { + private void gtceu$makeTargetLinear(CallbackInfo ci, @Local JsonObject json, @Local String name) { if (GsonHelper.getAsBoolean(json, "bilinear", false)) { this.customRenderTargets.get(name).setFilterMode(GL11.GL_LINEAR); } 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 06307f6af72..cb19cfb701d 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -1,113 +1,127 @@ { - "targets": [ - "gtceu:filter_temp", - { - "name": "swap2a", - "bilinear": true - }, - { - "name": "swap4a", - "bilinear": true - }, - { - "name": "swap8a", - "bilinear": true - }, - { - "name": "swap16a", - "bilinear": true - }, - { - "name": "swap2b", - "bilinear": true - }, - { - "name": "swap4b", - "bilinear": true - }, - { - "name": "swap8b", - "bilinear": true - }, - "final", - "swap" - ], - "passes": [ - { - "name": "gtceu:filter_bloom_color", - "intarget": "final", - "outtarget": "gtceu:filter_temp", - "auxtargets": [ - { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, - { "id": "minecraft:main:depth", "name": "MainDepthSampler" } - ] - }, - { - "name": "blit", - "intarget": "final", - "outtarget": "swap2a" - }, - { - "name": "gtceu:down_sampling", - "intarget": "swap2a", - "outtarget": "swap4a" - }, - { - "name": "gtceu:down_sampling", - "intarget": "swap4a", - "outtarget": "swap8a" - }, - { - "name": "gtceu:down_sampling", - "intarget": "swap8a", - "outtarget": "swap16a" - }, - { - "name": "blit", - "intarget": "swap16a", - "outtarget": "swap8b", - "auxtargets": [ - { "id": "swap8a", "name": "DownTexture" } - ] - }, - { - "name": "gtceu:up_sampling", - "intarget": "swap8b", - "outtarget": "swap4b", - "auxtargets": [ - { "id": "swap4a", "name": "DownTexture" } - ] - }, - { - "name": "gtceu:up_sampling", - "intarget": "swap4b", - "outtarget": "swap2b", - "auxtargets": [ - { "id": "swap2a", "name": "DownTexture" } - ] - }, - { - "name": "gtceu:up_sampling", - "intarget": "swap2b", - "outtarget": "swap", - "auxtargets": [ - { "id": "gtceu:filter_temp", "name": "DownTexture" } - ] - }, - { - "name": "gtceu:unity_composite", - "intarget": "swap", - "outtarget": "final", - "auxtargets": [ - { "id": "gtceu:filter_temp", "name": "HighlightSampler" }, - { "id": "minecraft:main", "name": "MainSampler" } - ] - }, - { - "name": "blit", - "intarget": "final", - "outtarget": "minecraft:main" - } - ] + "targets": [ + "gtceu:filter_temp", + { + "name": "swap2a", + "bilinear": true, + "scale_width": 0.5, + "scale_height": 0.5 + }, + { + "name": "swap4a", + "bilinear": true, + "scale_width": 0.25, + "scale_height": 0.25 + }, + { + "name": "swap8a", + "bilinear": true, + "scale_width": 0.125, + "scale_height": 0.125 + }, + { + "name": "swap16a", + "bilinear": true, + "scale_width": 0.0625, + "scale_height": 0.0625 + }, + { + "name": "swap2b", + "bilinear": true, + "scale_width": 0.5, + "scale_height": 0.5 + }, + { + "name": "swap4b", + "bilinear": true, + "scale_width": 0.25, + "scale_height": 0.25 + }, + { + "name": "swap8b", + "bilinear": true, + "scale_width": 0.125, + "scale_height": 0.125 + }, + "final", + "swap" + ], + "passes": [ + { + "name": "gtceu:filter_bloom_color", + "intarget": "final", + "outtarget": "gtceu:filter_temp", + "auxtargets": [ + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "minecraft:main:depth", "name": "MainDepthSampler" } + ] + }, + { + "name": "blit", + "intarget": "final", + "outtarget": "swap2a" + }, + { + "name": "gtceu:down_sampling", + "intarget": "swap2a", + "outtarget": "swap4a" + }, + { + "name": "gtceu:down_sampling", + "intarget": "swap4a", + "outtarget": "swap8a" + }, + { + "name": "gtceu:down_sampling", + "intarget": "swap8a", + "outtarget": "swap16a" + }, + { + "name": "blit", + "intarget": "swap16a", + "outtarget": "swap8b", + "auxtargets": [ + { "id": "swap8a", "name": "DownTexture" } + ] + }, + { + "name": "gtceu:up_sampling", + "intarget": "swap8b", + "outtarget": "swap4b", + "auxtargets": [ + { "id": "swap4a", "name": "DownTexture" } + ] + }, + { + "name": "gtceu:up_sampling", + "intarget": "swap4b", + "outtarget": "swap2b", + "auxtargets": [ + { "id": "swap2a", "name": "DownTexture" } + ] + }, + { + "name": "gtceu:up_sampling", + "intarget": "swap2b", + "outtarget": "swap", + "auxtargets": [ + { "id": "gtceu:filter_temp", "name": "DownTexture" } + ] + }, + { + "name": "gtceu:unity_composite", + "intarget": "swap", + "outtarget": "final", + "auxtargets": [ + { "id": "gtceu:filter_temp", "name": "HighlightSampler" }, + { "id": "minecraft:main", "name": "MainSampler" } + ] + }, + { + "name": "blit", + "intarget": "final", + "outtarget": "minecraft:main" + } + ] } 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 124604677d7..118a9212ffd 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -1,190 +1,206 @@ { - "targets": [ - "gtceu:filter_temp", - { - "name": "swap2a", - "bilinear": true - }, - { - "name": "swap4a", - "bilinear": true - }, - { - "name": "swap8a", - "bilinear": true - }, - { - "name": "swap16a", - "bilinear": true - }, - { - "name": "swap2b", - "bilinear": true - }, - { - "name": "swap4b", - "bilinear": true - }, - { - "name": "swap8b", - "bilinear": true - }, - { - "name": "swap16b", - "bilinear": true - }, - "final" - ], - "passes": [ - { - "name": "gtceu:filter_bloom_color", - "intarget": "final", - "outtarget": "gtceu:filter_temp", - "auxtargets": [ - { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, - { "id": "minecraft:main:depth", "name": "MainDepthSampler" } - ] - }, - { - "name": "blur", - "intarget": "gtceu:filter_temp", - "outtarget": "swap2a", - "uniforms": [ - { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] - }, - { - "name": "Radius", - "values": [3] - } - ] - }, - { - "name": "blur", - "intarget": "swap2a", - "outtarget": "swap2b", - "uniforms": [ + "targets": [ + "gtceu:filter_temp", { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] + "name": "swap2a", + "bilinear": true, + "scale_width": 0.5, + "scale_height": 0.5 }, { - "name": "Radius", - "values": [3] - } - ] - }, - { - "name": "blur", - "intarget": "swap2b", - "outtarget": "swap4a", - "uniforms": [ + "name": "swap4a", + "bilinear": true, + "scale_width": 0.25, + "scale_height": 0.25 + }, { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] + "name": "swap8a", + "bilinear": true, + "scale_width": 0.125, + "scale_height": 0.125 }, { - "name": "Radius", - "values": [5] - } - ] - }, - { - "name": "blur", - "intarget": "swap4a", - "outtarget": "swap4b", - "uniforms": [ + "name": "swap16a", + "bilinear": true, + "scale_width": 0.0625, + "scale_height": 0.0625 + }, { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] + "name": "swap2b", + "bilinear": true, + "scale_width": 0.5, + "scale_height": 0.5 }, { - "name": "Radius", - "values": [5] - } - ] - }, - { - "name": "blur", - "intarget": "swap4b", - "outtarget": "swap8a", - "uniforms": [ + "name": "swap4b", + "bilinear": true, + "scale_width": 0.25, + "scale_height": 0.25 + }, { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] + "name": "swap8b", + "bilinear": true, + "scale_width": 0.125, + "scale_height": 0.125 }, { - "name": "Radius", - "values": [7] - } - ] - }, - { - "name": "blur", - "intarget": "swap8a", - "outtarget": "swap8b", - "uniforms": [ + "name": "swap16b", + "bilinear": true, + "scale_width": 0.0625, + "scale_height": 0.0625 + }, + "final" + ], + "passes": [ + { + "name": "gtceu:filter_bloom_color", + "intarget": "final", + "outtarget": "gtceu:filter_temp", + "auxtargets": [ + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "minecraft:main:depth", "name": "MainDepthSampler" } + ] + }, { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] + "name": "blur", + "intarget": "gtceu:filter_temp", + "outtarget": "swap2a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [3] + } + ] }, { - "name": "Radius", - "values": [7] - } - ] - }, - { - "name": "blur", - "intarget": "swap8b", - "outtarget": "swap16a", - "uniforms": [ + "name": "blur", + "intarget": "swap2a", + "outtarget": "swap2b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [3] + } + ] + }, { - "name": "BlurDir", - "values": [ 1.0, 0.0 ] + "name": "blur", + "intarget": "swap2b", + "outtarget": "swap4a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [5] + } + ] }, { - "name": "Radius", - "values": [9] - } - ] - }, - { - "name": "blur", - "intarget": "swap16a", - "outtarget": "swap16b", - "uniforms": [ + "name": "blur", + "intarget": "swap4a", + "outtarget": "swap4b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [5] + } + ] + }, + { + "name": "blur", + "intarget": "swap4b", + "outtarget": "swap8a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [7] + } + ] + }, + { + "name": "blur", + "intarget": "swap8a", + "outtarget": "swap8b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [7] + } + ] + }, + { + "name": "blur", + "intarget": "swap8b", + "outtarget": "swap16a", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 1.0, 0.0 ] + }, + { + "name": "Radius", + "values": [9] + } + ] + }, + { + "name": "blur", + "intarget": "swap16a", + "outtarget": "swap16b", + "uniforms": [ + { + "name": "BlurDir", + "values": [ 0.0, 1.0 ] + }, + { + "name": "Radius", + "values": [9] + } + ] + }, { - "name": "BlurDir", - "values": [ 0.0, 1.0 ] + "name": "gtceu:unreal_composite", + "intarget": "minecraft:main", + "outtarget": "final", + "auxtargets": [ + { "id": "gtceu:filter_temp", "name": "HighlightSampler" }, + { "id": "swap2b", "name": "BlurTexture1" }, + { "id": "swap4b", "name": "BlurTexture2" }, + { "id": "swap8b", "name": "BlurTexture3" }, + { "id": "swap16b", "name": "BlurTexture4 "} + ], + "uniforms": [ + { "name": "BloomRadius", "values": [1.0] } + ] }, { - "name": "Radius", - "values": [9] + "name": "blit", + "intarget": "final", + "outtarget": "minecraft:main" } - ] - }, - { - "name": "gtceu:unreal_composite", - "intarget": "minecraft:main", - "outtarget": "final", - "auxtargets": [ - { "id": "gtceu:filter_temp", "name": "HighlightSampler" }, - { "id": "swap2b", "name": "BlurTexture1" }, - { "id": "swap4b", "name": "BlurTexture2" }, - { "id": "swap8b", "name": "BlurTexture3" }, - { "id": "swap16b", "name": "BlurTexture4" } - ], - "uniforms": [ - { "name": "BloomRadius", "values": [1.0] } - ] - }, - { - "name": "blit", - "intarget": "final", - "outtarget": "minecraft:main" - } - ] + ] } From 4819870b7a28b45b0cc77a157db6aef7390b9a0b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:03:16 +0200 Subject: [PATCH 073/269] more very minor cleanups --- .../gtceu/client/bloom/BloomUtil.java | 23 +++++++++++-------- .../gtceu/client/renderer/GTRenderTypes.java | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 1d2b71dfbe5..6718add7d06 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -219,7 +219,7 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende return; } Vec3 camPos = camera.getPosition(); - Minecraft.getInstance().getProfiler().popPush("gtceu_block_bloom"); + Minecraft.getInstance().getProfiler().popPush("gtceu:bloom"); BLOOM_RENDER_LOCK.writeLock().lock(); try { @@ -366,6 +366,8 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); + private static final String FILTER_TOGGLE_UNIFORM = "EnableFilter"; + private static final String BLUR_SHADER_NAME = "blur"; private static final String BLOOM_STRENGTH_UNIFORM = "BloomStrength"; private static final String BASE_BRIGHTNESS_UNIFORM = "BaseBrightness"; @@ -378,15 +380,14 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { // Forcefully insert config values to shader List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); - for (PostPass pass : passes) { + for (int i = 0; i < passes.size(); i++) { + PostPass pass = passes.get(i); EffectInstance shader = pass.getEffect(); - String name = shader.getName(); - shader.safeGetUniform("EnableFilter").set(drawBlockBloom ? 1 : 0); + shader.safeGetUniform(FILTER_TOGGLE_UNIFORM).set(drawBlockBloom ? 1 : 0); - if (name.contains(BLUR_SHADER_NAME)) { - int index = passes.indexOf(pass); - if (index % 2 == 0) { + if (shader.getName().contains(BLUR_SHADER_NAME)) { + if (i % 2 == 0) { shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, config.step); } else { shader.safeGetUniform(BLUR_DIR_UNIFORM).set(config.step, 0.0f); @@ -402,19 +403,21 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { for (var entry : BLOOM_BUFFERS.entrySet()) { BlockPos pos = entry.getKey(); + VertexBuffer buffer = entry.getValue(); // return early if buffer is invalid or has no vertex data bound // VertexBuffer#mode's nullness is the easiest way to check this. - if (entry.getValue().isInvalid() || ((VertexBufferAccessor) entry.getValue()).getMode() == null) { + if (buffer.isInvalid() || ((VertexBufferAccessor) buffer).getMode() == null) { continue; } - entry.getValue().bind(); + buffer.bind(); poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); - entry.getValue().drawWithShader(poseStack.last().pose(), projectionMatrix, + //noinspection DataFlowIssue + buffer.drawWithShader(poseStack.last().pose(), projectionMatrix, GameRenderer.getRendertypeCutoutShader()); poseStack.popPose(); } 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 2cdd2d5e26f..3086a5cb816 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -37,8 +37,7 @@ public class GTRenderTypes extends RenderType { .setCullState(RenderStateShard.NO_CULL) .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) .createCompositeState(false)); - - private static final RenderType BLOOM = RenderType.create("gtceu_bloom", DefaultVertexFormat.BLOCK, + private static final RenderType BLOOM = RenderType.create("gtceu:bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, false, false, RenderType.CompositeState.builder() .setLightmapState(RenderStateShard.LIGHTMAP) @@ -46,6 +45,7 @@ public class GTRenderTypes extends RenderType { .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) .setOutputState(BLOOM_TARGET) .createCompositeState(false)); + 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, From 483e73d10117d5aea66327d10f8373e137d1a59f Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:03:29 +0200 Subject: [PATCH 074/269] copy depth buffer from the screen render target --- src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 6718add7d06..074c6f7ce1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -224,6 +224,8 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende BLOOM_RENDER_LOCK.writeLock().lock(); try { GTRenderTypes.bloom().setupRenderState(); + // copy depth buffer from the main render target so bloom won't render through blocks + GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); preDraw(); if (!BLOOM_RENDERS.isEmpty()) { From 4c0d31975455451bce27227913129549f621f9cc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:06:06 +0200 Subject: [PATCH 075/269] also check depth state when filtering pixels that should have bloom --- .../gtceu/client/bloom/BloomUtil.java | 4 ++++ .../shaders/program/filter_bloom_color.fsh | 21 +++++++++++++++++++ .../shaders/program/filter_bloom_color.json | 4 +++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 074c6f7ce1d..39ada6f2206 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -369,6 +369,8 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); private static final String FILTER_TOGGLE_UNIFORM = "EnableFilter"; + private static final String DEPTH_NEAR_UNIFORM = "DepthNear"; + private static final String DEPTH_FAR_UNIFORM = "DepthFar"; private static final String BLUR_SHADER_NAME = "blur"; private static final String BLOOM_STRENGTH_UNIFORM = "BloomStrength"; @@ -387,6 +389,8 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { EffectInstance shader = pass.getEffect(); shader.safeGetUniform(FILTER_TOGGLE_UNIFORM).set(drawBlockBloom ? 1 : 0); + shader.safeGetUniform(DEPTH_NEAR_UNIFORM).set(GameRenderer.PROJECTION_Z_NEAR); + shader.safeGetUniform(DEPTH_FAR_UNIFORM).set(Minecraft.getInstance().gameRenderer.getDepthFar()); if (shader.getName().contains(BLUR_SHADER_NAME)) { if (i % 2 == 0) { 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 00a6c62a185..5a2bdc4a307 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,19 +1,40 @@ #version 150 uniform sampler2D DiffuseSampler; +uniform sampler2D DiffuseDepthSampler; uniform sampler2D MainSampler; +uniform sampler2D MainDepthSampler; uniform bool EnableFilter; +// from GameRenderer.PROJECTION_Z_NEAR +uniform float DepthNear = 0.05; +// from GameRenderer#getDepthFar +uniform float DepthFar = 32.0; + in vec2 texCoord; out vec4 fragColor; +float linearizeDepth(float depth) { + float z = depth * 2.0 - 1.0; // back to NDC + return (2.0 * DepthNear * DepthFar) / (DepthFar + DepthNear - z * (DepthFar - DepthNear)); +} + void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { vec4 mainColor = texture(MainSampler, texCoord); + // clear bloom color fragment if the main buffer's color is off by too much if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { fragColor = vec4(0.0); + } else { + // calculate linear depth + float mainDepth = linearizeDepth(texture(MainDepthSampler, texCoord).r); + float diffuseDepth = linearizeDepth(texture(DiffuseDepthSampler, texCoord).r); + // also clear if the main buffer's depth isn't the same as the bloom buffer's depth + if (abs(mainDepth - diffuseDepth) > 0.001) { + fragColor = vec4(0.0); + } } } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 4df5d909b5b..29c12a7ca1f 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -16,6 +16,8 @@ "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": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] }, + { "name": "DepthNear", "type": "float", "count": 1, "values": [ 0.05 ] }, + { "name": "DepthFar", "type": "float", "count": 1, "values": [ 32.0 ] } ] } From 22e82c33ad6c276fee3f648d36fc4e6e0cfc93d0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:15:30 +0200 Subject: [PATCH 076/269] wait no that wont do anything if the depth buffer is copied over nvm --- .../gtceu/client/bloom/BloomUtil.java | 4 ---- .../gtceu/shaders/post/bloom_unity.json | 4 +--- .../gtceu/shaders/post/bloom_unreal.json | 4 +--- .../shaders/program/filter_bloom_color.fsh | 21 ------------------- .../shaders/program/filter_bloom_color.json | 8 ++----- 5 files changed, 4 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 39ada6f2206..074c6f7ce1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -369,8 +369,6 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); private static final String FILTER_TOGGLE_UNIFORM = "EnableFilter"; - private static final String DEPTH_NEAR_UNIFORM = "DepthNear"; - private static final String DEPTH_FAR_UNIFORM = "DepthFar"; private static final String BLUR_SHADER_NAME = "blur"; private static final String BLOOM_STRENGTH_UNIFORM = "BloomStrength"; @@ -389,8 +387,6 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { EffectInstance shader = pass.getEffect(); shader.safeGetUniform(FILTER_TOGGLE_UNIFORM).set(drawBlockBloom ? 1 : 0); - shader.safeGetUniform(DEPTH_NEAR_UNIFORM).set(GameRenderer.PROJECTION_Z_NEAR); - shader.safeGetUniform(DEPTH_FAR_UNIFORM).set(Minecraft.getInstance().gameRenderer.getDepthFar()); if (shader.getName().contains(BLUR_SHADER_NAME)) { if (i % 2 == 0) { 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 cb19cfb701d..4945dcd074a 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -52,9 +52,7 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, - { "id": "minecraft:main:depth", "name": "MainDepthSampler" } + { "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 118a9212ffd..f8b7246dae5 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -57,9 +57,7 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, - { "id": "minecraft:main:depth", "name": "MainDepthSampler" } + { "id": "minecraft:main", "name": "MainSampler" } ] }, { 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 5a2bdc4a307..00a6c62a185 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,40 +1,19 @@ #version 150 uniform sampler2D DiffuseSampler; -uniform sampler2D DiffuseDepthSampler; uniform sampler2D MainSampler; -uniform sampler2D MainDepthSampler; uniform bool EnableFilter; -// from GameRenderer.PROJECTION_Z_NEAR -uniform float DepthNear = 0.05; -// from GameRenderer#getDepthFar -uniform float DepthFar = 32.0; - in vec2 texCoord; out vec4 fragColor; -float linearizeDepth(float depth) { - float z = depth * 2.0 - 1.0; // back to NDC - return (2.0 * DepthNear * DepthFar) / (DepthFar + DepthNear - z * (DepthFar - DepthNear)); -} - void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { vec4 mainColor = texture(MainSampler, texCoord); - // clear bloom color fragment if the main buffer's color is off by too much if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { fragColor = vec4(0.0); - } else { - // calculate linear depth - float mainDepth = linearizeDepth(texture(MainDepthSampler, texCoord).r); - float diffuseDepth = linearizeDepth(texture(DiffuseDepthSampler, texCoord).r); - // also clear if the main buffer's depth isn't the same as the bloom buffer's depth - if (abs(mainDepth - diffuseDepth) > 0.001) { - fragColor = vec4(0.0); - } } } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 29c12a7ca1f..e1ad2712050 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -9,15 +9,11 @@ "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" }, - { "name": "DiffuseDepthSampler" }, - { "name": "MainSampler" }, - { "name": "MainDepthSampler" } + { "name": "MainSampler" } ], "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": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] }, - { "name": "DepthNear", "type": "float", "count": 1, "values": [ 0.05 ] }, - { "name": "DepthFar", "type": "float", "count": 1, "values": [ 32.0 ] } + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } ] } From 3c4e685d37f7df78cfdf488669323ee3bb4d5240 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:16:36 +0200 Subject: [PATCH 077/269] fix bloom_unreal having a badly named sampler that made the lowest res bloom texture be the original image (and thus making the entire world have bloom) --- src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f8b7246dae5..c976c39f55d 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -189,7 +189,7 @@ { "id": "swap2b", "name": "BlurTexture1" }, { "id": "swap4b", "name": "BlurTexture2" }, { "id": "swap8b", "name": "BlurTexture3" }, - { "id": "swap16b", "name": "BlurTexture4 "} + { "id": "swap16b", "name": "BlurTexture4" } ], "uniforms": [ { "name": "BloomRadius", "values": [1.0] } From 876d43324f28160573da424cc1f00a783807a847 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 12:17:13 +0200 Subject: [PATCH 078/269] (TEMPORARY) make LWJGL and FastUtil be downloaded from the central maven repository --- gradle/scripts/repositories.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 85195980410..c02d0f5c566 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -1,6 +1,14 @@ repositories { mavenLocal() mavenCentral() + // force gradle to download FastUtil & LWJGL from the central maven so we can get source artifacts + exclusiveContent { // Force + forRepository { mavenCentral() } + filter { + includeGroup("it.unimi.dsi") + includeGroup("org.lwjgl") + } + } // exclude LWJGL from Minecraft's library maven so we can download its sources from mavenCentral maven { From 47723ce8af592f8ec52c673c0adcb35f5fdeaee3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 15:48:03 +0200 Subject: [PATCH 079/269] also check depth state when filtering pixels that should have bloom --- .../gtceu/client/bloom/BloomUtil.java | 8 +++++-- .../gtceu/shaders/post/bloom_unity.json | 4 +++- .../gtceu/shaders/post/bloom_unreal.json | 4 +++- .../shaders/program/filter_bloom_color.fsh | 21 +++++++++++++++++++ .../shaders/program/filter_bloom_color.json | 8 +++++-- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 074c6f7ce1d..ce762a7d1fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -224,8 +224,6 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende BLOOM_RENDER_LOCK.writeLock().lock(); try { GTRenderTypes.bloom().setupRenderState(); - // copy depth buffer from the main render target so bloom won't render through blocks - GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); preDraw(); if (!BLOOM_RENDERS.isEmpty()) { @@ -245,6 +243,8 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende } else { setupBloomUniforms(false); } + // copy depth buffer from the main render target so bloom won't render through blocks + // GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); render(partialTicks, poseStack, projectionMatrix, levelRenderer, camera, frustum); } finally { @@ -369,6 +369,8 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); private static final String FILTER_TOGGLE_UNIFORM = "EnableFilter"; + private static final String DEPTH_NEAR_UNIFORM = "DepthNear"; + private static final String DEPTH_FAR_UNIFORM = "DepthFar"; private static final String BLUR_SHADER_NAME = "blur"; private static final String BLOOM_STRENGTH_UNIFORM = "BloomStrength"; @@ -387,6 +389,8 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { EffectInstance shader = pass.getEffect(); shader.safeGetUniform(FILTER_TOGGLE_UNIFORM).set(drawBlockBloom ? 1 : 0); + shader.safeGetUniform(DEPTH_NEAR_UNIFORM).set(GameRenderer.PROJECTION_Z_NEAR); + shader.safeGetUniform(DEPTH_FAR_UNIFORM).set(Minecraft.getInstance().gameRenderer.getDepthFar()); if (shader.getName().contains(BLUR_SHADER_NAME)) { if (i % 2 == 0) { 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 4945dcd074a..cb19cfb701d 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -52,7 +52,9 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { "id": "minecraft:main", "name": "MainSampler" } + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, { 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 c976c39f55d..0d9a60029f6 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -57,7 +57,9 @@ "intarget": "final", "outtarget": "gtceu:filter_temp", "auxtargets": [ - { "id": "minecraft:main", "name": "MainSampler" } + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, { 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 00a6c62a185..5a2bdc4a307 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,19 +1,40 @@ #version 150 uniform sampler2D DiffuseSampler; +uniform sampler2D DiffuseDepthSampler; uniform sampler2D MainSampler; +uniform sampler2D MainDepthSampler; uniform bool EnableFilter; +// from GameRenderer.PROJECTION_Z_NEAR +uniform float DepthNear = 0.05; +// from GameRenderer#getDepthFar +uniform float DepthFar = 32.0; + in vec2 texCoord; out vec4 fragColor; +float linearizeDepth(float depth) { + float z = depth * 2.0 - 1.0; // back to NDC + return (2.0 * DepthNear * DepthFar) / (DepthFar + DepthNear - z * (DepthFar - DepthNear)); +} + void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { vec4 mainColor = texture(MainSampler, texCoord); + // clear bloom color fragment if the main buffer's color is off by too much if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { fragColor = vec4(0.0); + } else { + // calculate linear depth + float mainDepth = linearizeDepth(texture(MainDepthSampler, texCoord).r); + float diffuseDepth = linearizeDepth(texture(DiffuseDepthSampler, texCoord).r); + // also clear if the main buffer's depth isn't the same as the bloom buffer's depth + if (abs(mainDepth - diffuseDepth) > 0.001) { + fragColor = vec4(0.0); + } } } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index e1ad2712050..29c12a7ca1f 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -9,11 +9,15 @@ "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" }, - { "name": "MainSampler" } + { "name": "DiffuseDepthSampler" }, + { "name": "MainSampler" }, + { "name": "MainDepthSampler" } ], "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": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] } + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] }, + { "name": "DepthNear", "type": "float", "count": 1, "values": [ 0.05 ] }, + { "name": "DepthFar", "type": "float", "count": 1, "values": [ 32.0 ] } ] } From a541f1ba1696c593607b58dfa25bec990a079b91 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 20:27:27 +0200 Subject: [PATCH 080/269] make it smarter --- .../gtceu/shaders/post/bloom_unreal.json | 16 +++---- .../assets/gtceu/shaders/program/blur.fsh | 43 +++++++++++++++++++ .../assets/gtceu/shaders/program/blur.json | 19 ++++++++ .../gtceu/shaders/program/down_sampling.fsh | 3 +- .../gtceu/shaders/program/down_sampling.json | 6 +-- .../shaders/program/filter_bloom_color.fsh | 21 +++++---- .../shaders/program/filter_bloom_color.json | 2 +- 7 files changed, 85 insertions(+), 25 deletions(-) create mode 100644 src/main/resources/assets/gtceu/shaders/program/blur.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/program/blur.json 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 0d9a60029f6..8d20ecdb08d 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -63,7 +63,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "gtceu:filter_temp", "outtarget": "swap2a", "uniforms": [ @@ -78,7 +78,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "swap2a", "outtarget": "swap2b", "uniforms": [ @@ -93,7 +93,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "swap2b", "outtarget": "swap4a", "uniforms": [ @@ -108,7 +108,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "swap4a", "outtarget": "swap4b", "uniforms": [ @@ -123,7 +123,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "swap4b", "outtarget": "swap8a", "uniforms": [ @@ -138,7 +138,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "swap8a", "outtarget": "swap8b", "uniforms": [ @@ -153,7 +153,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "swap8b", "outtarget": "swap16a", "uniforms": [ @@ -168,7 +168,7 @@ ] }, { - "name": "blur", + "name": "gtceu:blur", "intarget": "swap16a", "outtarget": "swap16b", "uniforms": [ diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.fsh b/src/main/resources/assets/gtceu/shaders/program/blur.fsh new file mode 100644 index 00000000000..b8a8a5a3f78 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/blur.fsh @@ -0,0 +1,43 @@ +#version 150 + +#define PI 3.141592653 + +uniform sampler2D DiffuseSampler; +uniform vec2 BlurDir; +uniform float Radius; +uniform vec2 OutSize; + +in vec2 texCoord; + +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)) + // 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; + return (INV_SQRT_2PI * invSigma) * exp(-(x * x) * (0.5 * invSigma * invSigma)); +} + +void main() { + vec2 invSize = 1.0 / OutSize; + float weightSum = gaussianPdf(0.0, Radius); + + vec4 diffuseSum = texture(DiffuseSampler, texCoord) * weightSum; + + float iRadius = int(Radius); + for(int i = 1; i < iRadius; i++) { + float x = float(i); + float w = gaussianPdf(x, Radius); + vec2 uvOffset = BlurDir * invSize * x; + // sample both +x and -x offsets + vec4 sample1 = texture(DiffuseSampler, texCoord + uvOffset); + vec4 sample2 = texture(DiffuseSampler, texCoord - uvOffset); + diffuseSum += (sample1 + sample2) * w; + weightSum += 2.0 * w; + } + fragColor = diffuseSum / weightSum; +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.json b/src/main/resources/assets/gtceu/shaders/program/blur.json new file mode 100644 index 00000000000..52f8b6285ba --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/program/blur.json @@ -0,0 +1,19 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "blit", + "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 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh index 9f505550bf6..fce0f2a9781 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh @@ -5,11 +5,10 @@ uniform vec2 OutSize; uniform vec2 InSize; in vec2 texCoord; -in vec2 oneTexel; out vec4 fragColor; -vec2 inTexel = oneTexel; +vec2 inTexel = 1.0 / InSize; vec2 inTexelNegX = vec2(-inTexel.x, inTexel.y); vec2 inTexelNegY = vec2(inTexel.x, -inTexel.y); diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json index 970a1338885..77c4446fc88 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json @@ -4,14 +4,14 @@ "srcrgb": "one", "dstrgb": "zero" }, - "vertex": "sobel", + "vertex": "blit", "fragment": "gtceu:down_sampling", "attributes": [ "Position" ], "samplers": [ { "name": "DiffuseSampler" } ], "uniforms": [ - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "InSize", "type": "float", "count": 2, "values": [ 1.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 ] } ] } 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 5a2bdc4a307..e082dab15cc 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 @@ -9,7 +9,7 @@ uniform bool EnableFilter; // from GameRenderer.PROJECTION_Z_NEAR uniform float DepthNear = 0.05; // from GameRenderer#getDepthFar -uniform float DepthFar = 32.0; +uniform float DepthFar = 482.0; in vec2 texCoord; @@ -24,17 +24,16 @@ void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { vec4 mainColor = texture(MainSampler, texCoord); - // clear bloom color fragment if the main buffer's color is off by too much - if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { + + // calculate linear depth + float mainDepth = linearizeDepth(texture(MainDepthSampler, texCoord).r); + float diffuseDepth = linearizeDepth(texture(DiffuseDepthSampler, texCoord).r); + // clear bloom color fragment if the main buffer's depth isn't the same as the bloom buffer's depth + if (abs(mainDepth - diffuseDepth) > 0.01) { + fragColor = vec4(0.0); + } else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { + // also clear it if the main buffer's color is off by too much fragColor = vec4(0.0); - } else { - // calculate linear depth - float mainDepth = linearizeDepth(texture(MainDepthSampler, texCoord).r); - float diffuseDepth = linearizeDepth(texture(DiffuseDepthSampler, texCoord).r); - // also clear if the main buffer's depth isn't the same as the bloom buffer's depth - if (abs(mainDepth - diffuseDepth) > 0.001) { - fragColor = vec4(0.0); - } } } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 29c12a7ca1f..35db19d9bc5 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -16,7 +16,7 @@ "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": "EnableFilter", "type": "int", "count": 1, "values": [ 1.0 ] }, + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1 ] }, { "name": "DepthNear", "type": "float", "count": 1, "values": [ 0.05 ] }, { "name": "DepthFar", "type": "float", "count": 1, "values": [ 32.0 ] } ] From fd46d609132e67bc8f97a723fc72afd5343e5a4d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 20:28:06 +0200 Subject: [PATCH 081/269] Add a hook for running `./gradlew processResources` when F3+T is pressed --- .../gtceu/config/ConfigHolder.java | 4 ++ .../dev/client/KeyboardHandlerMixin.java | 25 +++++++ .../gtceu/data/lang/LangHandler.java | 3 + .../utils/dev/ResourceReloadDetector.java | 65 +++++++++++++++++++ src/main/resources/gtceu.mixins.json | 1 + 5 files changed, 98 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index b786a2df860..c7b3503daff 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -927,5 +927,9 @@ public static class DeveloperConfigs { @Configurable @Configurable.Comment({ "Dump all registered GT models/blockstates/etc?", "Default: false" }) public boolean dumpAssets = false; + @Configurable + @Configurable.Comment({ "Executes ./gradlew :processResources when F3+T is pressed", + "Only works in a development environment", "Default: false" }) + public boolean autoRebuildResources = false; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java new file mode 100644 index 00000000000..e06b0e59053 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java @@ -0,0 +1,25 @@ +package com.gregtechceu.gtceu.core.mixins.dev.client; + +import com.gregtechceu.gtceu.utils.dev.ResourceReloadDetector; + +import net.minecraft.client.KeyboardHandler; +import net.minecraft.client.Minecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.concurrent.CompletableFuture; + +@Mixin(KeyboardHandler.class) +public abstract class KeyboardHandlerMixin { + + @WrapOperation(method = "handleDebugKeys", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;reloadResourcePacks()Ljava/util/concurrent/CompletableFuture;")) + private CompletableFuture gtceu$hookResourceReload(Minecraft instance, + Operation> original) { + return ResourceReloadDetector.regenerateResourcesOnReload(() -> original.call(instance)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 62d422b1c0f..5f95f494353 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1233,6 +1233,9 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.key.enable_step_assist", "Enable StepAssist"); provider.add("gtceu.debug.f3_h.enabled", "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more"); + provider.add("gtceu.debug.resource_rebuild.done", "Gradle resource rebuild done in %s"); + provider.add("gtceu.debug.resource_rebuild.start", + "Invoking gradle resource rebuild (./gradlew :processResources)"); provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable"); provider.add("config.jade.plugin_gtceu.workable_provider", "[GTCEu] Workable"); provider.add("config.jade.plugin_gtceu.electric_container_provider", "[GTCEu] Electric Container"); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java new file mode 100644 index 00000000000..66d75c84979 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java @@ -0,0 +1,65 @@ +package com.gregtechceu.gtceu.utils.dev; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; + +import com.sun.jna.platform.win32.*; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.time.Instant; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +public class ResourceReloadDetector { + + private static final Path gradleDir = findGradleDir(); + + public static CompletableFuture regenerateResourcesOnReload(Supplier> reloadFuture) { + if (!ConfigHolder.INSTANCE.dev.autoRebuildResources || !GTCEu.isDev() || gradleDir == null) { + return reloadFuture.get(); + } + ProcessBuilder builder = switch (Util.getPlatform()) { + case WINDOWS -> new ProcessBuilder("cmd.exe", "/c", "gradlew.bat", ":processResources"); + default -> new ProcessBuilder("./gradlew", ":processResources"); + }; + builder.directory(gradleDir.toFile()); + builder.inheritIO(); + Process process; + try { + process = builder.start(); + } catch (IOException exception) { + GTCEu.LOGGER.error("Cound not run ./gradlew :processResources", exception); + GTCEu.LOGGER.error("Message the GTCEu developers about this!"); + return reloadFuture.get(); + } + Minecraft.getInstance().player.sendSystemMessage(Component.translatable("gtceu.debug.resource_rebuild.start")); + Instant start = Instant.now(); + // wait for the resource reload to finish, then send chat message, then let MC actually reload resources + return process.toHandle().onExit() + .thenRun(() -> Minecraft.getInstance().player + .sendSystemMessage(Component.translatable("gtceu.debug.resource_rebuild.done", + Duration.between(start, Instant.now())))) + .thenCompose($ -> reloadFuture.get()); + } + + private static @Nullable Path findGradleDir() { + Path path = Path.of(".").toAbsolutePath(); + do { + if (Files.isRegularFile(path.resolve("settings.gradle")) || + Files.isRegularFile(path.resolve("settings.gradle.kts"))) { + return path; + } + path = path.getParent(); + } while (path.getParent() != null); + + return null; + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index a688dcebe59..a056e0abfeb 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -27,6 +27,7 @@ "client.RebuildTaskMixin", "client.VariantDeserializerMixin", "client.VertexBufferAccessor", + "dev.client.KeyboardHandlerMixin", "embeddium.BlockRendererMixin", "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", From 76efb071c1bd488809090897df6f8c6f05e56a20 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 20:29:20 +0200 Subject: [PATCH 082/269] remove the rescaling stuff because something else is also rescaling everything and I've forgotten what --- .../core/mixins/client/PostChainMixin.java | 26 --------------- .../gtceu/shaders/post/bloom_unity.json | 33 +++++-------------- .../gtceu/shaders/post/bloom_unreal.json | 32 +++++------------- 3 files changed, 16 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java index a6c3bf8ee64..cfd47cec5c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java @@ -4,8 +4,6 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.pipeline.RenderTarget; import org.lwjgl.opengl.GL11; @@ -25,30 +23,6 @@ public class PostChainMixin { @Final private Map customRenderTargets; - @WrapOperation(method = "parseTargetNode", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/util/GsonHelper;getAsInt(Lcom/google/gson/JsonObject;Ljava/lang/String;I)I", - ordinal = 0)) - private int gtceu$scaleTargetWidth(JsonObject json, String name, int screenWidth, Operation original) { - if (GsonHelper.isNumberValue(json, "scale_width")) { - return (int) (GsonHelper.getAsFloat(json, "scale_width", 1.0f) * screenWidth); - } - return original.call(json, name, screenWidth); - } - - @WrapOperation(method = "parseTargetNode", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/util/GsonHelper;getAsInt(Lcom/google/gson/JsonObject;Ljava/lang/String;I)I", - ordinal = 1)) - private int gtceu$scaleTargetHeight(JsonObject json, String name, int screenHeight, Operation original) { - if (GsonHelper.isNumberValue(json, "scale_height")) { - return (int) (GsonHelper.getAsFloat(json, "scale_height", 1.0f) * screenHeight); - } - return original.call(json, name, screenHeight); - } - @Inject(method = "parseTargetNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/PostChain;addTempTarget(Ljava/lang/String;II)V", 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 cb19cfb701d..81c2dc60970 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -3,45 +3,31 @@ "gtceu:filter_temp", { "name": "swap2a", - "bilinear": true, - "scale_width": 0.5, - "scale_height": 0.5 + "bilinear": true }, { "name": "swap4a", - "bilinear": true, - "scale_width": 0.25, - "scale_height": 0.25 + "bilinear": true }, { "name": "swap8a", - "bilinear": true, - "scale_width": 0.125, - "scale_height": 0.125 + "bilinear": true }, { "name": "swap16a", - "bilinear": true, - "scale_width": 0.0625, - "scale_height": 0.0625 + "bilinear": true }, { "name": "swap2b", - "bilinear": true, - "scale_width": 0.5, - "scale_height": 0.5 + "bilinear": true }, { "name": "swap4b", - "bilinear": true, - "scale_width": 0.25, - "scale_height": 0.25 + "bilinear": true }, { "name": "swap8b", - "bilinear": true, - "scale_width": 0.125, - "scale_height": 0.125 + "bilinear": true }, "final", "swap" @@ -80,10 +66,7 @@ { "name": "blit", "intarget": "swap16a", - "outtarget": "swap8b", - "auxtargets": [ - { "id": "swap8a", "name": "DownTexture" } - ] + "outtarget": "swap8b" }, { "name": "gtceu:up_sampling", 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 8d20ecdb08d..0e69ed16d6f 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -3,51 +3,35 @@ "gtceu:filter_temp", { "name": "swap2a", - "bilinear": true, - "scale_width": 0.5, - "scale_height": 0.5 + "bilinear": true }, { "name": "swap4a", - "bilinear": true, - "scale_width": 0.25, - "scale_height": 0.25 + "bilinear": true }, { "name": "swap8a", - "bilinear": true, - "scale_width": 0.125, - "scale_height": 0.125 + "bilinear": true }, { "name": "swap16a", - "bilinear": true, - "scale_width": 0.0625, - "scale_height": 0.0625 + "bilinear": true }, { "name": "swap2b", - "bilinear": true, - "scale_width": 0.5, - "scale_height": 0.5 + "bilinear": true }, { "name": "swap4b", - "bilinear": true, - "scale_width": 0.25, - "scale_height": 0.25 + "bilinear": true }, { "name": "swap8b", - "bilinear": true, - "scale_width": 0.125, - "scale_height": 0.125 + "bilinear": true }, { "name": "swap16b", - "bilinear": true, - "scale_width": 0.0625, - "scale_height": 0.0625 + "bilinear": true }, "final" ], From 20446ef5b2e947725b0f695134b487d2fc978e6e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 20 Jan 2026 09:06:50 +0200 Subject: [PATCH 083/269] spotless + datagen --- .../resources/assets/gtceu/lang/en_ud.json | 28 ++++++++++--- .../resources/assets/gtceu/lang/en_us.json | 39 ++++++++++++------- .../gtceu/client/bloom/BloomUtil.java | 2 +- .../machine/impl/FluidAreaRender.java | 1 - .../gtceu/client/util/RenderUtil.java | 1 - 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index e89aadd73ac..3fef20a256a 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -66,6 +66,7 @@ "behaviour.lighter.uses": "%d :sǝsn buıuıɐɯǝᴚ", "behaviour.memory_card.client_msg.cleared": "pǝɹɐǝןɔ uoıʇɐɹnbıɟuoɔ pǝɹoʇS", "behaviour.memory_card.client_msg.copied": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıdoƆ", + "behaviour.memory_card.client_msg.missing_items": "uoıʇɐɹnbıɟuoɔ ǝʇsɐd oʇ pǝɹınbǝɹ sɯǝʇı buıssıW", "behaviour.memory_card.client_msg.pasted": "uoıʇɐɹnbıɟuoɔ ǝuıɥɔɐɯ pǝıןddⱯ", "behaviour.memory_card.copy_target": "%s :buıʎdoƆ", "behaviour.memory_card.disabled": "ɹ§pǝןqɐsıᗡɔ§", @@ -1748,9 +1749,12 @@ "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", "config.gtceu.option.arcRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɔɹɐ", "config.gtceu.option.armorHud": "pnHɹoɯɹɐ", + "config.gtceu.option.autoRebuildResources": "sǝɔɹnosǝᴚpןınqǝᴚoʇnɐ", + "config.gtceu.option.baseBrightness": "ssǝuʇɥbıɹᗺǝsɐq", "config.gtceu.option.batchDuration": "uoıʇɐɹnᗡɥɔʇɐq", "config.gtceu.option.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", + "config.gtceu.option.bloomAlgorithm": "ɯɥʇıɹobןⱯɯooןq", "config.gtceu.option.borderColor": "ɹoןoƆɹǝpɹoq", "config.gtceu.option.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", "config.gtceu.option.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", @@ -1775,7 +1779,9 @@ "config.gtceu.option.drum": "ɯnɹp", "config.gtceu.option.dumpAssets": "sʇǝssⱯdɯnp", "config.gtceu.option.dumpRecipes": "sǝdıɔǝᴚdɯnp", + "config.gtceu.option.emissiveTexturesHaveBloom": "ɯooןᗺǝʌɐHsǝɹnʇxǝ⟘ǝʌıssıɯǝ", "config.gtceu.option.enableArcRecycling": "buıןɔʎɔǝᴚɔɹⱯǝןqɐuǝ", + "config.gtceu.option.enableBloom": "ɯooןᗺǝןqɐuǝ", "config.gtceu.option.enableCleanroom": "ɯooɹuɐǝןƆǝןqɐuǝ", "config.gtceu.option.enableExtractorRecycling": "buıןɔʎɔǝᴚɹoʇɔɐɹʇxƎǝןqɐuǝ", "config.gtceu.option.enableFEConverters": "sɹǝʇɹǝʌuoƆƎℲǝןqɐuǝ", @@ -1838,7 +1844,9 @@ "config.gtceu.option.machinesEmissiveTextures": "sǝɹnʇxǝ⟘ǝʌıssıɯƎsǝuıɥɔɐɯ", "config.gtceu.option.machinesHaveBERsByDefault": "ʇןnɐɟǝᗡʎᗺsᴚƎᗺǝʌɐHsǝuıɥɔɐɯ", "config.gtceu.option.maintenanceCheckRate": "ǝʇɐᴚʞɔǝɥƆǝɔuɐuǝʇuıɐɯ", + "config.gtceu.option.maxBrightness": "ssǝuʇɥbıɹᗺxɐɯ", "config.gtceu.option.meHatchEnergyUsage": "ǝbɐs∩ʎbɹǝuƎɥɔʇɐHǝɯ", + "config.gtceu.option.minBrightness": "ssǝuʇɥbıɹᗺuıɯ", "config.gtceu.option.minerSpeed": "pǝǝdSɹǝuıɯ", "config.gtceu.option.minimap": "dɐɯıuıɯ", "config.gtceu.option.nanoSaber": "ɹǝqɐSouɐu", @@ -1879,6 +1887,7 @@ "config.gtceu.option.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", "config.gtceu.option.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", "config.gtceu.option.sandOresFall": "ןןɐℲsǝɹOpuɐs", + "config.gtceu.option.shader": "ɹǝpɐɥs", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "uoısoןdxƎuıɐɹɹǝ⟘ɹOɹǝɥʇɐǝMpןnoɥs", "config.gtceu.option.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", "config.gtceu.option.smallBoilers": "sɹǝןıoᗺןןɐɯs", @@ -1890,9 +1899,11 @@ "config.gtceu.option.steelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇs", "config.gtceu.option.steelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇs", "config.gtceu.option.steelSteamMultiblocks": "sʞɔoןqıʇןnWɯɐǝʇSןǝǝʇs", + "config.gtceu.option.step": "dǝʇs", + "config.gtceu.option.strength": "ɥʇbuǝɹʇs", "config.gtceu.option.surfaceRockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoᴚǝɔɐɟɹns", "config.gtceu.option.tankItemFluidPreview": "ʍǝıʌǝɹԀpınןℲɯǝʇIʞuɐʇ", - "config.gtceu.option.temperaturesInKelvin": "uıʌןǝʞuIsǝɹnʇɐɹǝdɯǝʇ", + "config.gtceu.option.temperaturesInCelsius": "snısןǝƆuIsǝɹnʇɐɹǝdɯǝʇ", "config.gtceu.option.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.toggle": "ǝןbboʇ", @@ -2290,6 +2301,8 @@ "gtceu.creative_tooltip.3": "sıɥʇ ǝsn oʇ ㄥ§", "gtceu.cutter": "ɹǝʇʇnƆ", "gtceu.debug.f3_h.enabled": "ǝɹoɯ ǝǝs oʇ ǝןıɟ bıɟuoɔ ɥɔǝ⟘bǝɹ⅁ ǝɥʇ uı uoıʇdo bıɟuoɔ bnqǝp:ɔsıɯ ǝɥʇ ǝןqɐuǝ :sɹǝdoןǝʌǝᗡ ɹoℲ ¡oɟuı bnqǝp ǝɥʇ pǝıɟıpoɯ sɐɥ ɥɔǝ⟘bǝɹ⅁", + "gtceu.debug.resource_rebuild.done": "%s uı ǝuop pןınqǝɹ ǝɔɹnosǝɹ ǝןpɐɹ⅁", + "gtceu.debug.resource_rebuild.start": ")sǝɔɹnosǝᴚssǝɔoɹd: ʍǝןpɐɹb/˙( pןınqǝɹ ǝɔɹnosǝɹ ǝןpɐɹb buıʞoʌuI", "gtceu.direction.tooltip.back": "ʞɔɐᗺ", "gtceu.direction.tooltip.down": "uʍoᗡ", "gtceu.direction.tooltip.front": "ʇuoɹℲ", @@ -2607,6 +2620,7 @@ "gtceu.key.armor_mode_switch": "ɥɔʇıʍS ǝpoW ɹoɯɹⱯ", "gtceu.key.enable_boots": "dɯnſ pǝʇsooᗺ ǝןqɐuƎ", "gtceu.key.enable_jetpack": "ʞɔɐdʇǝſ ǝןqɐuƎ", + "gtceu.key.enable_step_assist": "ʇsıssⱯdǝʇS ǝןqɐuƎ", "gtceu.key.tool_aoe_change": "ɥɔʇıʍS ǝpoW ƎoⱯ ןoo⟘", "gtceu.large_boiler": "ɹǝןıoᗺ ǝbɹɐꞀ", "gtceu.large_chemical_reactor": "ɹoʇɔɐǝᴚ ןɐɔıɯǝɥƆ ǝbɹɐꞀ", @@ -4724,7 +4738,7 @@ "item.gtceu.talc_dust": "ɔןɐ⟘", "item.gtceu.tantalum_capacitor": "ɹoʇıɔɐdɐƆ ɯnןɐʇuɐ⟘", "item.gtceu.terminal": "ןɐuıɯɹǝ⟘", - "item.gtceu.terminal.tooltip": "ʞɔoןq-ıʇןnɯ ǝɥʇ pןınq ʎןןɐɔıʇɐɯoʇnɐ oʇ ɹǝןןoɹʇuoɔ ɐ uo ʞɔıןƆ-ᴚ + ʇɟıɥS", + "item.gtceu.terminal.tooltip": "ʎɹoʇuǝʌuı ɹnoʎ ɯoɹɟ sɯǝʇı ɥʇıʍ ʞɔoןqıʇןnɯ ɐ pןınq ʎןןɐɔıʇɐɯoʇnɐ oʇ ɹǝןןoɹʇuoɔ ɐ uo ʞɔıןƆ-ᴚ + ʇɟıɥS", "item.gtceu.text_module": "ǝןnpoW ʇxǝ⟘", "item.gtceu.tiny_ash_dust": "sǝɥsⱯ ɟo ǝןıԀ ʎuı⟘", "item.gtceu.tiny_basaltic_mineral_sand_dust": "puɐS ןɐɹǝuıW ɔıʇןɐsɐᗺ ɟo ǝןıԀ ʎuı⟘", @@ -4827,7 +4841,7 @@ "item.gtceu.tool.lv_screwdriver.tooltip": "sǝuıɥɔɐW puɐ sɹǝʌoƆ sʇsnظpⱯ8§", "item.gtceu.tool.lv_wirecutter": ")ΛꞀ( ɹǝʇʇnƆ ǝɹıM %s", "item.gtceu.tool.lv_wrench": ")ΛꞀ( ɥɔuǝɹM %s", - "item.gtceu.tool.lv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇs ʞɔıןɔ ʇɟǝן pןoH8§", + "item.gtceu.tool.lv_wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", "item.gtceu.tool.mallet": "ʇǝןןɐW ʇɟoS %s", "item.gtceu.tool.mallet.tooltip.0": "˙ǝdıɔǝᴚ ʇuǝɹɹnƆ ɹǝʇɟⱯ ǝuıɥɔɐW ǝsnɐԀ oʇ ʞɐǝuS8§", "item.gtceu.tool.mallet.tooltip.1": "sǝuıɥɔɐW sʇɹɐʇS/sdoʇS8§", @@ -5689,20 +5703,24 @@ "metaarmor.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", - "metaarmor.nms.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", - "metaarmor.nms.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", + "metaarmor.nms.step_assist.disabled": "pǝןqɐsıᗡ ʇsıssⱯdǝʇS :ǝʇınS ™ǝןɔsnWouɐN", + "metaarmor.nms.step_assist.enabled": "pǝןqɐuƎ ʇsıssⱯdǝʇS :ǝʇınS ™ǝןɔsnWouɐN", + "metaarmor.qts.boosted_jump.disabled": "pǝןqɐsıᗡ ʇsooᗺ dɯnſ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "metaarmor.qts.boosted_jump.enabled": "pǝןqɐuƎ ʇsooᗺ dɯnſ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.share.disable": "pǝןqɐsıᗡ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.share.enable": "pǝןqɐuƎ buıbɹɐɥƆ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.qts.share.error": "¡buıbɹɐɥɔ ɹoɟ ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "metaarmor.qts.step_assist.disabled": "pǝןqɐsıᗡ ʇsıssⱯdǝʇS :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", + "metaarmor.qts.step_assist.enabled": "pǝןqɐuƎ ʇsıssⱯdǝʇS :ǝʇınS ™ɥɔǝ⟘ʞɹɐnὉ", "metaarmor.tooltip.autoeat": "ʎɹoʇuǝʌuI ɯoɹɟ pooℲ buıs∩ ʎq ɹɐᗺ pooℲ sǝɥsıuǝןdǝᴚ", "metaarmor.tooltip.breath": "ɹɐᗺ ɥʇɐǝɹᗺ ɹǝʇɐʍɹǝpu∩ sǝɥsıuǝןdǝᴚ", "metaarmor.tooltip.burning": "buıuɹnᗺ sǝıɟıןןnN", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6874fa34070..eb57042d1b6 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -66,6 +66,7 @@ "behaviour.lighter.uses": "Remaining uses: %d", "behaviour.memory_card.client_msg.cleared": "Stored configuration cleared", "behaviour.memory_card.client_msg.copied": "Copied machine configuration", + "behaviour.memory_card.client_msg.missing_items": "Missing items required to paste configuration", "behaviour.memory_card.client_msg.pasted": "Applied machine configuration", "behaviour.memory_card.copy_target": "Copying: %s", "behaviour.memory_card.disabled": "§cDisabled§r", @@ -1748,9 +1749,12 @@ "config.gtceu.option.animationTime": "animationTime", "config.gtceu.option.arcRecyclingYield": "arcRecyclingYield", "config.gtceu.option.armorHud": "armorHud", + "config.gtceu.option.autoRebuildResources": "autoRebuildResources", + "config.gtceu.option.baseBrightness": "baseBrightness", "config.gtceu.option.batchDuration": "batchDuration", "config.gtceu.option.bedrockOreDistance": "bedrockOreDistance", "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", + "config.gtceu.option.bloomAlgorithm": "bloomAlgorithm", "config.gtceu.option.borderColor": "borderColor", "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", @@ -1775,7 +1779,9 @@ "config.gtceu.option.drum": "drum", "config.gtceu.option.dumpAssets": "dumpAssets", "config.gtceu.option.dumpRecipes": "dumpRecipes", + "config.gtceu.option.emissiveTexturesHaveBloom": "emissiveTexturesHaveBloom", "config.gtceu.option.enableArcRecycling": "enableArcRecycling", + "config.gtceu.option.enableBloom": "enableBloom", "config.gtceu.option.enableCleanroom": "enableCleanroom", "config.gtceu.option.enableExtractorRecycling": "enableExtractorRecycling", "config.gtceu.option.enableFEConverters": "enableFEConverters", @@ -1838,7 +1844,9 @@ "config.gtceu.option.machinesEmissiveTextures": "machinesEmissiveTextures", "config.gtceu.option.machinesHaveBERsByDefault": "machinesHaveBERsByDefault", "config.gtceu.option.maintenanceCheckRate": "maintenanceCheckRate", + "config.gtceu.option.maxBrightness": "maxBrightness", "config.gtceu.option.meHatchEnergyUsage": "meHatchEnergyUsage", + "config.gtceu.option.minBrightness": "minBrightness", "config.gtceu.option.minerSpeed": "minerSpeed", "config.gtceu.option.minimap": "minimap", "config.gtceu.option.nanoSaber": "nanoSaber", @@ -1879,6 +1887,7 @@ "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", "config.gtceu.option.rubberTreeSpawnChance": "rubberTreeSpawnChance", "config.gtceu.option.sandOresFall": "sandOresFall", + "config.gtceu.option.shader": "shader", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "shouldWeatherOrTerrainExplosion", "config.gtceu.option.showDimensionTier": "showDimensionTier", "config.gtceu.option.smallBoilers": "smallBoilers", @@ -1890,9 +1899,11 @@ "config.gtceu.option.steelBoilerHeatSpeed": "steelBoilerHeatSpeed", "config.gtceu.option.steelBoilerMaxTemperature": "steelBoilerMaxTemperature", "config.gtceu.option.steelSteamMultiblocks": "steelSteamMultiblocks", + "config.gtceu.option.step": "step", + "config.gtceu.option.strength": "strength", "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", "config.gtceu.option.tankItemFluidPreview": "tankItemFluidPreview", - "config.gtceu.option.temperaturesInKelvin": "temperaturesInKelvin", + "config.gtceu.option.temperaturesInCelsius": "temperaturesInCelsius", "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", "config.gtceu.option.toggle": "toggle", @@ -2290,6 +2301,8 @@ "gtceu.creative_tooltip.3": "§7 to use this", "gtceu.cutter": "Cutter", "gtceu.debug.f3_h.enabled": "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more", + "gtceu.debug.resource_rebuild.done": "Gradle resource rebuild done in %s", + "gtceu.debug.resource_rebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", "gtceu.direction.tooltip.back": "Back", "gtceu.direction.tooltip.down": "Down", "gtceu.direction.tooltip.front": "Front", @@ -2607,8 +2620,8 @@ "gtceu.key.armor_mode_switch": "Armor Mode Switch", "gtceu.key.enable_boots": "Enable Boosted Jump", "gtceu.key.enable_jetpack": "Enable Jetpack", - "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch", "gtceu.key.enable_step_assist": "Enable StepAssist", + "gtceu.key.tool_aoe_change": "Tool AoE Mode Switch", "gtceu.large_boiler": "Large Boiler", "gtceu.large_chemical_reactor": "Large Chemical Reactor", "gtceu.laser_engraver": "Laser Engraver", @@ -4725,7 +4738,7 @@ "item.gtceu.talc_dust": "Talc", "item.gtceu.tantalum_capacitor": "Tantalum Capacitor", "item.gtceu.terminal": "Terminal", - "item.gtceu.terminal.tooltip": "Shift + R-Click on a controller to automatically build the multi-block", + "item.gtceu.terminal.tooltip": "Shift + R-Click on a controller to automatically build a multiblock with items from your inventory", "item.gtceu.text_module": "Text Module", "item.gtceu.tiny_ash_dust": "Tiny Pile of Ashes", "item.gtceu.tiny_basaltic_mineral_sand_dust": "Tiny Pile of Basaltic Mineral Sand", @@ -5690,26 +5703,24 @@ "metaarmor.message.nightvision.disabled": "§bNightVision: §cOff", "metaarmor.message.nightvision.enabled": "§bNightVision: §aOn", "metaarmor.message.nightvision.error": "§cNot enough power!", - "metaarmor.message.step_assist.disabled": "StepAssist: §cOff", - "metaarmor.message.step_assist.enabled": "StepAssist: §aOn", "metaarmor.nms.nightvision.disabled": "NanoMuscle™ Suite: NightVision Disabled", "metaarmor.nms.nightvision.enabled": "NanoMuscle™ Suite: NightVision Enabled", "metaarmor.nms.nightvision.error": "NanoMuscle™ Suite: §cNot enough power!", - "metaarmor.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", - "metaarmor.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", - "metaarmor.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", - "metaarmor.nms.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled", - "metaarmor.nms.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled", - "metaarmor.qts.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled", - "metaarmor.qts.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled", "metaarmor.nms.share.disable": "NanoMuscle™ Suite: Charging Disabled", "metaarmor.nms.share.enable": "NanoMuscle™ Suite: Charging Enabled", "metaarmor.nms.share.error": "NanoMuscle™ Suite: §cNot enough power for charging!", + "metaarmor.nms.step_assist.disabled": "NanoMuscle™ Suite: StepAssist Disabled", + "metaarmor.nms.step_assist.enabled": "NanoMuscle™ Suite: StepAssist Enabled", + "metaarmor.qts.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled", + "metaarmor.qts.boosted_jump.enabled": "QuarkTech™ Suite: Jump Boost Enabled", + "metaarmor.qts.nightvision.disabled": "QuarkTech™ Suite: NightVision Disabled", + "metaarmor.qts.nightvision.enabled": "QuarkTech™ Suite: NightVision Enabled", + "metaarmor.qts.nightvision.error": "QuarkTech™ Suite: §cNot enough power!", "metaarmor.qts.share.disable": "QuarkTech™ Suite: Charging Disabled", "metaarmor.qts.share.enable": "QuarkTech™ Suite: Charging Enabled", "metaarmor.qts.share.error": "QuarkTech™ Suite: §cNot enough power for charging!", - "metaarmor.qts.boosted_jump.disabled": "QuarkTech™ Suite: Jump Boost Disabled", - "metaarmor.qts.boosted_jump.enabled": "QuarkTech™ Suite: Jump Boost Enabled", + "metaarmor.qts.step_assist.disabled": "QuarkTech™ Suite: StepAssist Disabled", + "metaarmor.qts.step_assist.enabled": "QuarkTech™ Suite: StepAssist Enabled", "metaarmor.tooltip.autoeat": "Replenishes Food Bar by Using Food from Inventory", "metaarmor.tooltip.breath": "Replenishes Underwater Breath Bar", "metaarmor.tooltip.burning": "Nullifies Burning", diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index ce762a7d1fb..4c66f49a20a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -422,7 +422,7 @@ private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatri poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); - //noinspection DataFlowIssue + // noinspection DataFlowIssue buffer.drawWithShader(poseStack.last().pose(), projectionMatrix, GameRenderer.getRendertypeCutoutShader()); poseStack.popPose(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java index b0af77ec3d3..049b77aaf87 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java @@ -25,7 +25,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java index 4b21ee29873..b15588fad39 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java @@ -17,7 +17,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; From 4209eae5cbe02fb559548c1ad82c64ed8de40b94 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 22 Feb 2026 11:45:56 +0200 Subject: [PATCH 084/269] spotless --- .../gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index d83dd31fb7b..14928c9413c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -22,7 +22,6 @@ import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; import net.minecraft.server.level.BlockDestructionProgress; From 746805489ad2337ffd3a175614ee07c3161dfbe8 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 6 Apr 2026 10:25:21 +0300 Subject: [PATCH 085/269] datagen --- src/generated/resources/assets/gtceu/lang/en_ud.json | 3 ++- src/generated/resources/assets/gtceu/lang/en_us.json | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index b4f19571581..a36c2b6f18f 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1758,7 +1758,6 @@ "command.gtceu.share_prospection_data.notification": "¡noʎ ɥʇıʍ ɐʇɐp buıʇɔǝdsoɹd buıɹɐɥs sı %s", "config.gtceu.option.addLoot": "ʇooꞀppɐ", "config.gtceu.option.ae2": "ᄅǝɐ", - "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "ǝpıSʇndʇnOɯoɹℲspınןℲʇnduIsɯnɹᗡʍoןןɐ", "config.gtceu.option.allowedImageDomains": "suıɐɯoᗡǝbɐɯIpǝʍoןןɐ", "config.gtceu.option.animationTime": "ǝɯı⟘uoıʇɐɯıuɐ", "config.gtceu.option.arcRecyclingYield": "pןǝıʎbuıןɔʎɔǝᴚɔɹɐ", @@ -5741,6 +5740,8 @@ "metaarmor.message.nightvision.disabled": "ɟɟOɔ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.enabled": "uOɐ§ :uoısıΛʇɥbıNq§", "metaarmor.message.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§", + "metaarmor.message.step_assist.disabled": "ɟɟOɔ§ :ʇsıssⱯ-dǝʇSq§", + "metaarmor.message.step_assist.enabled": "uOɐ§ :ʇsıssⱯ-dǝʇSq§", "metaarmor.nms.nightvision.disabled": "pǝןqɐsıᗡ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.enabled": "pǝןqɐuƎ uoısıΛʇɥbıN :ǝʇınS ™ǝןɔsnWouɐN", "metaarmor.nms.nightvision.error": "¡ɹǝʍod ɥbnouǝ ʇoNɔ§ :ǝʇınS ™ǝןɔsnWouɐN", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 712d70bbbbd..dbe039f50e4 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1758,7 +1758,6 @@ "command.gtceu.share_prospection_data.notification": "%s is sharing prospecting data with you!", "config.gtceu.option.addLoot": "addLoot", "config.gtceu.option.ae2": "ae2", - "config.gtceu.option.allowDrumsInputFluidsFromOutputSide": "allowDrumsInputFluidsFromOutputSide", "config.gtceu.option.allowedImageDomains": "allowedImageDomains", "config.gtceu.option.animationTime": "animationTime", "config.gtceu.option.arcRecyclingYield": "arcRecyclingYield", @@ -5981,4 +5980,4 @@ "tooltip.gtceu.hazard_trigger.skin_contact": "Skin contact", "tooltip.gtceu.medical_condition.description": "§l§cHAZARDOUS §7Hold Shift to show details", "tooltip.gtceu.medical_condition.description_shift": "§l§cHAZARDOUS:" -} +} \ No newline at end of file From 4acd70e2dc2ea06967f93d1b907671971db1966b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 10 Apr 2026 09:10:06 +0300 Subject: [PATCH 086/269] sometihng about CTM quads --- .../gtceu/client/util/GTQuadTransformers.java | 29 ++ .../gtceu/client/util/ModelUtils.java | 21 +- .../gtceu/client/util/QuadInfo.java | 282 ++++++++++++++++++ .../gtceu/client/util/QuadUtils.java | 141 +++++++++ 4 files changed, 470 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java b/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java index fdfea07a48d..7b6d077d821 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java @@ -8,6 +8,8 @@ import net.minecraftforge.client.model.IQuadTransformer; import net.minecraftforge.client.model.QuadTransformers; +import java.lang.reflect.Array; + public final class GTQuadTransformers { public static IQuadTransformer offset(float by) { @@ -74,6 +76,33 @@ public static BakedQuad setColor(BakedQuad quad, int argbColor, boolean clearTin return copy.gtceu$setTextureKey(quad.gtceu$getTextureKey()); } + public static IQuadTransformer derotate() { + return quad -> { + int[] vertices = quad.getVertices(); + + int start = 0; + float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE; + int[][] uvs = (int[][]) Array.newInstance(int.class, 4, 2); + + for (int i = 0; i < 4; i++) { + int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.UV0; + System.arraycopy(vertices, offset, uvs[i], 0, 2); + + float u = Float.intBitsToFloat(uvs[i][0]); + float v = Float.intBitsToFloat(uvs[i][1]); + if (u <= minU && v <= minV) { + minU = Math.min(minU, u); + minV = Math.min(minV, v); + start = i; + } + } + for (int i = 0; i < 4; i++) { + int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.UV0; + System.arraycopy(uvs[(i + start) % 4], 0, vertices, offset, 2); + } + }; + } + public static BakedQuad copy(BakedQuad quad) { return new BakedQuad(quad.getVertices().clone(), quad.getTintIndex(), quad.getDirection(), quad.getSprite(), quad.isShade(), quad.hasAmbientOcclusion()) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java index 8568412da98..be53024ad2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java @@ -6,12 +6,14 @@ import com.gregtechceu.gtceu.integration.modernfix.GTModernFixIntegration; import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; +import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.*; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -33,9 +35,8 @@ import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; @Mod.EventBusSubscriber(modid = GTCEu.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class ModelUtils { @@ -43,6 +44,7 @@ public class ModelUtils { private ModelUtils() {} private static final List EVENT_LISTENERS = new ArrayList<>(); + public static final Map CTM_SPRITE_CACHE = new ConcurrentHashMap<>(); public static List getBakedModelQuads(BakedModel model, BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side, RandomSource rand) { @@ -105,6 +107,19 @@ public void onResourceManagerReload(@NotNull ResourceManager resourceManager) { @SuppressWarnings({ "unchecked", "deprecation" }) @SubscribeEvent(priority = EventPriority.LOWEST) public static void onAtlasStitched(TextureStitchEvent.Post event) { + if (event.getAtlas().location().equals(TextureAtlas.LOCATION_BLOCKS)) { + CTM_SPRITE_CACHE.clear(); + for (ResourceLocation location : event.getAtlas().getTextureLocations()) { + ResourceLocation absLoc = LDLMetadataSection.spriteToAbsolute(location); + LDLMetadataSection section = LDLMetadataSection.getMetadata(absLoc); + if (section.connection != null) { + TextureAtlasSprite baseSprite = event.getAtlas().getSprite(location); + TextureAtlasSprite ctmSprite = event.getAtlas().getSprite(section.connection); + CTM_SPRITE_CACHE.put(baseSprite, ctmSprite); + } + } + } + TextureAtlas atlas = event.getAtlas(); if (atlas.location() == TextureAtlas.LOCATION_BLOCKS) { MachineModel.initSprites(atlas); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java b/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java new file mode 100644 index 00000000000..7116e3fcc5a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java @@ -0,0 +1,282 @@ +package com.gregtechceu.gtceu.client.util; + +import com.lowdragmc.lowdraglib.client.bakedpipeline.ISubmap; +import com.lowdragmc.lowdraglib.client.bakedpipeline.Submap; +import com.lowdragmc.lowdraglib.client.model.custommodel.Connection; +import com.lowdragmc.lowdraglib.client.model.custommodel.Connections; + +import net.minecraft.client.renderer.LightTexture; +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.minecraftforge.client.model.IQuadTransformer; + +import it.unimi.dsi.fastutil.Pair; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector2f; +import org.joml.Vector3f; + +public record QuadInfo(TextureAtlasSprite sprite, int tintIndex, Direction direction, + boolean shade, boolean ao, int blockLight, int skyLight, + Vector3f[] vertices, Vector2f[] uvs, Vector2f minUV, Vector2f maxUV) { + + // Mapping the different corner indices to their respective dirs + private static final Connection[][] SUBMAP_MAP = new Connection[][] { + { Connection.DOWN, Connection.LEFT, Connection.DOWN_LEFT }, + { Connection.DOWN, Connection.RIGHT, Connection.DOWN_RIGHT }, + { Connection.UP, Connection.RIGHT, Connection.UP_RIGHT }, + { Connection.UP, Connection.LEFT, Connection.UP_LEFT } + }; + + public QuadInfo(TextureAtlasSprite sprite, int tintIndex, Direction direction, boolean shade, boolean ao, + Vector3f[] vertices, Vector2f[] uvs, Vector2f minUV, Vector2f maxUV) { + this(sprite, tintIndex, direction, shade, ao, 0, 0, vertices, uvs, minUV, maxUV); + } + + // region UV operations + + public Vector2f[] normalizeUVs() { + Vector2f[] ret = new Vector2f[uvs.length]; + for (int i = 0; i < ret.length; i++) { + ret[i] = QuadUtils.normalizeUV(sprite, uvs[i]); + } + return ret; + } + + public Vector2f[] relativizeUVs() { + Vector2f[] ret = new Vector2f[uvs.length]; + for (int i = 0; i < uvs.length; i++) { + ret[i] = QuadUtils.relativizeUV(sprite, uvs[i]); + } + return ret; + } + + public int getNormalizedUVQuadrant() { + return getUVQuadrant(QuadUtils.normalizeUV(sprite, maxUV)); + } + + public static int getUVQuadrant(Vector2f uv) { + if (uv.x() <= 0.5f) { + if (uv.y() <= 0.5f) { + return 3; + } else { + return 0; + } + } else { + if (uv.y() <= 0.5f) { + return 2; + } else { + return 1; + } + } + } + + public Vector2f[] normalizeUVQuadrant() { + Vector2f[] normalized = normalizeUVs(); + + int quadrant = getNormalizedUVQuadrant(); + float minUInterp = quadrant == 1 || quadrant == 2 ? 0.5f : 0; + float minVInterp = quadrant < 2 ? 0.5f : 0; + float maxUInterp = quadrant == 0 || quadrant == 3 ? 0.5f : 1; + float maxVInterp = quadrant > 1 ? 0.5f : 1; + + normalized = QuadUtils.normalizeUVs( + new Vector2f(minUInterp, minVInterp), + new Vector2f(maxUInterp, maxVInterp), + normalized); + return QuadUtils.relativizeUVs(sprite, normalized); + } + + public Vector2f[] transformUVData(TextureAtlasSprite other, ISubmap submap) { + Vector2f[] normalized = normalizeUVs(); + var maxUVs = QuadUtils.findMinMaxUVs(normalized); + submap = submap.normalize(); + + float width = maxUVs.second().x() - maxUVs.first().x(); + float height = maxUVs.second().y() - maxUVs.first().y(); + + float minU = submap.getXOffset(); + float minV = submap.getYOffset(); + minU += maxUVs.first().x() * submap.getWidth(); + minV += maxUVs.first().y() * submap.getHeight(); + + float maxU = minU + (width * submap.getWidth()); + float maxV = minV + (height * submap.getHeight()); + + Vector2f[] newUvs = new Vector2f[4]; + for (int i = 0; i < 4; i++) { + Vector2f uv = new Vector2f(this.uvs[i]); + // same as sprite.getX(oldSprite.getXOffset(x)), but we don't multiply and divide in between + uv.x = Mth.map(uv.x, this.sprite.getU0(), this.sprite.getU1(), other.getU0(), other.getU1()); + uv.y = Mth.map(uv.y, this.sprite.getV0(), this.sprite.getV1(), other.getV0(), other.getV1()); + newUvs[i] = uv; + } + + // FIXME this... isn't all that great. + Vector2f[] newUVs = { + new Vector2f(newUvs[0].x() == this.minUV.x() ? minU : maxU, newUvs[0].y() == this.minUV.y() ? minV : maxV), + new Vector2f(newUvs[1].x() == this.minUV.x() ? minU : maxU, newUvs[1].y() == this.minUV.y() ? minV : maxV), + new Vector2f(newUvs[2].x() == this.minUV.x() ? minU : maxU, newUvs[2].y() == this.minUV.y() ? minV : maxV), + new Vector2f(newUvs[3].x() == this.minUV.x() ? minU : maxU, newUvs[3].y() == this.minUV.y() ? minV : maxV) + }; + return QuadUtils.relativizeUVs(other, newUVs); + } + + public @Nullable Submap findSubmap(Connections connections) { + Vector2f uv = QuadUtils.normalizeUV(sprite, maxUV); + int xPos = uv.x() <= 0.5f ? 0 : 1; + int yPos = uv.y() <= 0.5f ? 0 : 1; + + Connection[] toConnect = SUBMAP_MAP[xPos + yPos]; + if (connections.connectedOr(toConnect[0], toConnect[1])) { + // If all dirs are connected, we use the fully connected face, the base offset value. + if (!connections.connectedAnd(toConnect)) { + // if a location isn't connected on all sides, the edge submap is at base+2 in the submap table + xPos += connections.contains(toConnect[0]) ? 2 : 0; + yPos += connections.contains(toConnect[1]) ? 2 : 0; + } + return Submap.X4[xPos][yPos]; + } + return null; + } + + public Vector2f[] copyUVs() { + Vector2f[] result = new Vector2f[uvs.length]; + for (int i = 0; i < uvs.length; ++i) { + result[i] = new Vector2f(uvs[i]); + } + return result; + } + + // endregion + + // region vertex operations + + public Vector3f[] copyVertices() { + Vector3f[] result = new Vector3f[vertices.length]; + for (int i = 0; i < vertices.length; ++i) { + result[i] = new Vector3f(vertices[i]); + } + return result; + } + + public QuadInfo grow() { + return new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, + copyVertices(), normalizeUVQuadrant(), new Vector2f(minUV), new Vector2f(maxUV)); + } + + public QuadInfo copy() { + return new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, + copyVertices(), copyUVs(), new Vector2f(minUV), new Vector2f(maxUV)); + } + + public QuadInfo transformUVs(TextureAtlasSprite sprite, ISubmap submap) { + return new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, + copyVertices(), transformUVData(sprite, submap), new Vector2f(minUV), new Vector2f(maxUV)); + } + + public QuadInfo[] subdivide() { + QuadInfo[] rects = new QuadInfo[4]; + + var firstDivide = this.divide(false); + var secondDivide = firstDivide.left().divide(true); + rects[0] = secondDivide.left(); + if (firstDivide.right() != null) { + Pair thirdDivide = firstDivide.right().divide(true); + rects[1] = thirdDivide.left(); + rects[2] = thirdDivide.right(); + } + rects[3] = secondDivide.right(); + + return rects; + } + + private Pair divide(boolean vertical) { + Vector2f[] normalizedUvs = this.normalizeUVs(); + float minUV, maxUV; + float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE, maxU = Float.MIN_VALUE, maxV = Float.MIN_VALUE; + + int start = 0; + for (int i = 0; i < 4; i++) { + if (minU >= normalizedUvs[i].x() && minV >= normalizedUvs[i].y()) { + start = i; + } + minU = Math.min(minU, normalizedUvs[i].x()); + minV = Math.min(minV, normalizedUvs[i].y()); + maxU = Math.max(maxU, normalizedUvs[i].x()); + maxV = Math.max(maxV, normalizedUvs[i].y()); + } + if (vertical) { + minUV = minV; + maxUV = maxV; + } else { + minUV = minU; + maxUV = maxU; + } + + if (minUV < 0.5f && maxUV > 0.5f) { + float delta = Mth.inverseLerp(minUV, maxUV, 0.5f); + + Vector2f[] firstUVs = QuadUtils.relativizeUVs(sprite, + new Vector2f(vertical ? minU : 0.5f, vertical ? 0.5f : minV), + new Vector2f(vertical ? minU : 0.5f, maxV), + new Vector2f(maxU, maxV), + new Vector2f(maxU, vertical ? 0.5f : minV)); + Vector2f[] secondUVs = QuadUtils.relativizeUVs(sprite, + new Vector2f(minU, minV), + new Vector2f(minU, vertical ? 0.5f : maxV), + new Vector2f(vertical ? maxU : 0.5f, vertical ? 0.5f : maxV), + new Vector2f(vertical ? maxU : 0.5f, minV)); + + Vector3f[] firstVerts = new Vector3f[4]; + Vector3f[] secondVerts = new Vector3f[4]; + for (int i = 0; i < 4; i++) { + int idx = (start + i) % 4; + firstVerts[i] = new Vector3f(vertices[idx]); + secondVerts[i] = new Vector3f(vertices[idx]); + } + + int i0 = 0; + int i1 = vertical ? 1 : 3; + int i2 = 2; + int i3 = vertical ? 3 : 1; + + firstVerts[i0].lerp(firstVerts[i1], delta); + firstVerts[i3].lerp(firstVerts[i2], delta); + secondVerts[i0].lerp(secondVerts[i1], delta, secondVerts[i1]); + secondVerts[i3].lerp(secondVerts[i2], delta, secondVerts[i2]); + + return Pair.of( + new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, + firstVerts, firstUVs, firstUVs[0], firstUVs[2]), + new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, + secondVerts, secondUVs, secondUVs[0], secondUVs[2])); + } else { + return Pair.of(this, null); + } + } + + // endregion + + public BakedQuad rebake() { + int[] vertexData = new int[32]; + for (int i = 0; i < 4; ++i) { + Vector3f pos = vertices[i]; + Vector2f uv = uvs[i]; + Vector2f nextUv = uvs[(i + 2) % 4]; + + int v = i * IQuadTransformer.STRIDE; + vertexData[v + IQuadTransformer.POSITION] = Float.floatToRawIntBits(pos.x()); + vertexData[v + IQuadTransformer.POSITION + 1] = Float.floatToRawIntBits(pos.y()); + vertexData[v + IQuadTransformer.POSITION + 2] = Float.floatToRawIntBits(pos.z()); + vertexData[v + IQuadTransformer.COLOR] = 0xffffffff; + vertexData[v + IQuadTransformer.UV0] = Float.floatToRawIntBits( + sprite.getU(uv.x() * 0.999f + nextUv.x() * 0.001f)); + vertexData[v + IQuadTransformer.UV0 + 1] = Float.floatToRawIntBits( + sprite.getV(uv.y() * 0.999f + nextUv.y() * 0.001f)); + vertexData[i * IQuadTransformer.STRIDE + IQuadTransformer.UV2] = LightTexture.pack(blockLight, skyLight); + } + return new BakedQuad(vertexData, tintIndex, direction, sprite, shade, ao); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java new file mode 100644 index 00000000000..31130f730c3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java @@ -0,0 +1,141 @@ +package com.gregtechceu.gtceu.client.util; + +import com.lowdragmc.lowdraglib.client.bakedpipeline.Submap; +import com.lowdragmc.lowdraglib.client.model.custommodel.Connections; + +import net.minecraft.client.renderer.block.model.BakedQuad; +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.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.IQuadTransformer; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector2f; +import org.joml.Vector3f; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import static com.gregtechceu.gtceu.client.util.ModelUtils.*; + +public class QuadUtils { + + public static Vector2f[] getQuadUVs(int[] vertices) { + Vector2f[] uvs = new Vector2f[4]; + + for (int i = 0; i < 4; i++) { + int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.UV0; + float u = Float.intBitsToFloat(vertices[offset]); + float v = Float.intBitsToFloat(vertices[offset + 1]); + uvs[i] = new Vector2f(u, v); + } + return uvs; + } + + public static Vector3f[] getQuadVertices(int[] vertices) { + Vector3f[] vertPos = new Vector3f[4]; + + for (int i = 0; i < 4; i++) { + int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.POSITION; + float x = Float.intBitsToFloat(vertices[offset]); + float y = Float.intBitsToFloat(vertices[offset + 1]); + float z = Float.intBitsToFloat(vertices[offset + 2]); + vertPos[i] = new Vector3f(x, y, z); + } + return vertPos; + } + + public static QuadInfo[] subdivide(BakedQuad baked) { + Vector3f[] vertPos = getQuadVertices(baked.getVertices()); + Vector2f[] uvs = getQuadUVs(baked.getVertices()); + var maxUVs = findMinMaxUVs(uvs); + QuadInfo quad = new QuadInfo(baked.getSprite(), baked.getTintIndex(), baked.getDirection(), + baked.isShade(), baked.hasAmbientOcclusion(), + vertPos, uvs, maxUVs.first(), maxUVs.second()); + + return quad.subdivide(); + } + + private static void putVertexData(int[] vertices, int index, Vector3f pos, Vector2f uv) { + int posOffset = index * IQuadTransformer.STRIDE + IQuadTransformer.POSITION; + vertices[posOffset] = Float.floatToRawIntBits(pos.x()); + vertices[posOffset + 1] = Float.floatToRawIntBits(pos.y()); + vertices[posOffset + 2] = Float.floatToRawIntBits(pos.z()); + + int uvOffset = index * IQuadTransformer.STRIDE + IQuadTransformer.UV0; + vertices[uvOffset] = Float.floatToRawIntBits(uv.x()); + vertices[uvOffset + 1] = Float.floatToRawIntBits(uv.y()); + } + + public static Vector2f[] normalizeUVs(Vector2f min, Vector2f max, Vector2f... uvs) { + Vector2f[] ret = new Vector2f[uvs.length]; + for (int i = 0; i < ret.length; i++) { + ret[i] = normalizeUV(min, max, uvs[i]); + } + return ret; + } + + public static Vector2f normalizeUV(TextureAtlasSprite sprite, Vector2f vec) { + return normalizeUV( + new Vector2f(sprite.getU0(), sprite.getU1()), + new Vector2f(sprite.getV0(), sprite.getV1()), + vec); + } + + public static Vector2f normalizeUV(Vector2f min, Vector2f max, Vector2f vec) { + return new Vector2f( + Mth.inverseLerp(vec.x(), min.x(), max.x()), + Mth.inverseLerp(vec.y(), min.y(), max.y())); + } + + public static Vector2f[] relativizeUVs(TextureAtlasSprite sprite, Vector2f... uvs) { + for (int i = 0; i < uvs.length; i++) { + uvs[i] = relativizeUV(sprite, uvs[i]); + } + return uvs; + } + + public static Vector2f relativizeUV(TextureAtlasSprite sprite, Vector2f vec) { + return new Vector2f( + Mth.lerp(vec.x(), sprite.getU0(), sprite.getU1()), + Mth.lerp(vec.y(), sprite.getV0(), sprite.getV1())); + } + + public static List buildCTMQuads(List quads, BlockAndTintGetter level, BlockPos pos, + @NotNull BlockState state, @Nullable Direction elementSide) { + return buildCTMQuads(Connections.checkConnections(level, pos, state, elementSide), quads); + } + + public static List buildCTMQuads(Connections connections, List base) { + List result = new ArrayList<>(); + for (BakedQuad originalQuad : base) { + TextureAtlasSprite connection = CTM_SPRITE_CACHE.get(originalQuad.getSprite()); + if (connection == null) { + result.add(originalQuad); + continue; + } + GTQuadTransformers.derotate().processInPlace(originalQuad); + + QuadInfo[] subdivided = QuadUtils.subdivide(originalQuad); + int[] ctm = connections.getSubmapIndices(); + + for (int j = 0; j < subdivided.length; j++) { + QuadInfo quad = subdivided[j]; + if (quad != null) { + int quadrant = quad.getNormalizedUVQuadrant(); + Submap submap = quad.findSubmap(connections); + TextureAtlasSprite ctmSprite = ctm[quadrant] > 15 ? originalQuad.getSprite() : connection; + subdivided[j] = quad.grow().transformUVs(ctmSprite, submap); + } + } + result.addAll(Arrays.stream(subdivided).filter(Objects::nonNull).map(QuadInfo::rebake).toList()); + } + return result; + } +} From 8fa98994863ed5499524363e54d1cc41411714c5 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 17 Apr 2026 18:37:36 +0300 Subject: [PATCH 087/269] "remake" the baked model replacement stuff (but not really) --- .../gregtechceu/gtceu/client/ClientProxy.java | 19 ++++++ .../gtceu/client/util/AssetEventListener.java | 14 +++-- .../gtceu/client/util/ModelUtils.java | 52 +++++++++-------- .../gtceu/common/item/LampBlockItem.java | 58 ++++++++++++++----- .../modernfix/GTModernFixIntegration.java | 16 +++-- 5 files changed, 113 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 9a0574d59a7..9895b34514d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; +import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; @@ -29,6 +30,7 @@ import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderManager; import com.gregtechceu.gtceu.client.renderer.machine.impl.*; import com.gregtechceu.gtceu.client.renderer.machine.impl.BoilerMultiPartRender; +import com.gregtechceu.gtceu.client.util.ModelUtils; import com.gregtechceu.gtceu.common.CommonEventListener; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; @@ -54,6 +56,7 @@ import com.gregtechceu.gtceu.utils.data.RuntimeBlockstateProvider; import com.gregtechceu.gtceu.utils.input.SyncedKeyMapping; +import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; import net.minecraft.client.renderer.blockentity.HangingSignRenderer; @@ -175,6 +178,22 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register(MachineModelLoader.ID.getPath(), MachineModelLoader.INSTANCE); event.register(PipeModelLoader.ID.getPath(), PipeModelLoader.INSTANCE); event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); + + // register CTM model (un)wrapper + ModelUtils.registerBakeEventListener(false, (modelLocation, model, modelBakery) -> { + // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins + if (model instanceof CustomBakedModel ctmModel) { + if (ctmModel.getParent() instanceof MachineModel machineModel) { + return machineModel; + } + } + // do not register automatic CTM for machine models, they handle it themselves + if (model instanceof MachineModel) { + return model; + } + + return model; + }); } @SubscribeEvent(priority = EventPriority.HIGHEST) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java index eb035bf4ed0..d45a95e5663 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java @@ -1,5 +1,8 @@ package com.gregtechceu.gtceu.client.util; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.eventbus.api.Event; @@ -15,6 +18,7 @@ public interface AssetEventListener { return null; } + @FunctionalInterface interface AtlasStitched extends AssetEventListener { @Override @@ -24,15 +28,13 @@ default Class eventClass() { } } - interface ModifyBakingResult extends AssetEventListener { + @FunctionalInterface + interface BakedModelReplacement { - @Override - @Nullable - default Class eventClass() { - return ModelEvent.ModifyBakingResult.class; - } + BakedModel modifyBakedModel(ResourceLocation modelLocation, BakedModel model, ModelBakery modelBakery); } + @FunctionalInterface interface RegisterAdditional extends AssetEventListener { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java index be53024ad2d..717cf048a8d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java @@ -34,6 +34,7 @@ import net.minecraftforge.fml.common.Mod; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -43,7 +44,8 @@ public class ModelUtils { private ModelUtils() {} - private static final List EVENT_LISTENERS = new ArrayList<>(); + @ApiStatus.Internal + public static final List> EVENT_LISTENERS = new ArrayList<>(); public static final Map CTM_SPRITE_CACHE = new ConcurrentHashMap<>(); public static List getBakedModelQuads(BakedModel model, BlockAndTintGetter level, BlockPos pos, @@ -71,7 +73,7 @@ public static String getPropertyValueString(Map.Entry, Comparable public static void registerAtlasStitchedEventListener(boolean removeOnReload, AssetEventListener.AtlasStitched listener) { - EVENT_LISTENERS.add(new EventListenerHolder(listener, removeOnReload)); + EVENT_LISTENERS.add(new EventListenerHolder<>(listener, removeOnReload)); } public static void registerAtlasStitchedEventListener(boolean removeOnReload, final ResourceLocation atlasLocation, @@ -84,13 +86,13 @@ public static void registerAtlasStitchedEventListener(boolean removeOnReload, fi } public static void registerBakeEventListener(boolean removeOnReload, - AssetEventListener.ModifyBakingResult listener) { - EVENT_LISTENERS.add(new EventListenerHolder(listener, removeOnReload)); + AssetEventListener.BakedModelReplacement listener) { + EVENT_LISTENERS.add(new EventListenerHolder<>(listener, removeOnReload)); } public static void registerAddModelsEventListener(boolean removeOnReload, AssetEventListener.RegisterAdditional listener) { - EVENT_LISTENERS.add(new EventListenerHolder(listener, removeOnReload)); + EVENT_LISTENERS.add(new EventListenerHolder<>(listener, removeOnReload)); } @SubscribeEvent(priority = EventPriority.HIGH) @@ -127,35 +129,36 @@ public static void onAtlasStitched(TextureStitchEvent.Post event) { } for (var listener : EVENT_LISTENERS) { - Class eventClass = listener.listener.eventClass(); + if (!(listener.listener instanceof AssetEventListener assetEventListener)) continue; + + Class eventClass = assetEventListener.eventClass(); if (eventClass != null && eventClass.isInstance(event)) { ((AssetEventListener) listener.listener).accept(event); } } } - @SuppressWarnings("unchecked") @SubscribeEvent(priority = EventPriority.LOWEST) public static void onModifyBakingResult(ModelEvent.ModifyBakingResult event) { - for (var listener : EVENT_LISTENERS) { - Class eventClass = listener.listener.eventClass(); - if (eventClass != null && eventClass.isInstance(event)) { - ((AssetEventListener) listener.listener).accept(event); - } - } - - // don't process the CTM model unwrapping here if modernfix dynamic resources is enabled + // don't process baked model replacement here if modernfix dynamic resources is enabled if (GTCEu.Mods.isModernFixLoaded() && GTModernFixIntegration.isDynamicResourcesEnabled()) return; - // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins - // Also, the caching they have stops our models from updating properly for (var entry : event.getModels().entrySet()) { BakedModel model = entry.getValue(); - if (!(model instanceof CustomBakedModel ctmModel)) { - continue; + + // run through all model replacers first + for (var listener : EVENT_LISTENERS) { + if (!(listener.listener instanceof AssetEventListener.BakedModelReplacement modelReplacement)) continue; + model = modelReplacement.modifyBakedModel(entry.getKey(), model, event.getModelBakery()); } - if (ctmModel.getParent() instanceof MachineModel machine) { - entry.setValue(machine); + entry.setValue(model); + + // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins + // Also, the caching they have stops our models from updating properly + if (model instanceof CustomBakedModel ctmModel) { + if (ctmModel.getParent() instanceof MachineModel machineModel) { + entry.setValue(machineModel); + } } } } @@ -164,12 +167,15 @@ public static void onModifyBakingResult(ModelEvent.ModifyBakingResult event) { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onRegisterAdditional(ModelEvent.RegisterAdditional event) { for (var listener : EVENT_LISTENERS) { - Class eventClass = listener.listener.eventClass(); + if (!(listener.listener instanceof AssetEventListener assetEventListener)) continue; + + Class eventClass = assetEventListener.eventClass(); if (eventClass != null && eventClass.isInstance(event)) { ((AssetEventListener) listener.listener).accept(event); } } } - private record EventListenerHolder(AssetEventListener listener, boolean removeOnReload) {} + @ApiStatus.Internal + public record EventListenerHolder(T listener, boolean removeOnReload) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java index c1e59d991b2..33028c2a399 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java @@ -5,14 +5,16 @@ import com.gregtechceu.gtceu.client.util.ModelUtils; import com.gregtechceu.gtceu.common.block.LampBlock; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.NonNullList; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.state.BlockState; @@ -22,6 +24,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; import javax.annotation.ParametersAreNonnullByDefault; @@ -84,21 +89,48 @@ public BlockEntityWithoutLevelRenderer getCustomRenderer() { private static class ClientCallWrapper { - private static void registerEventListener(LampBlockItem item) { - ModelUtils.registerBakeEventListener(false, event -> { - ResourceLocation model = BuiltInRegistries.ITEM.getKey(item).withPrefix("item/"); - BakedModel original = event.getModels().get(model); - if (original == null) { - model = new ModelResourceLocation(model, "inventory"); - original = event.getModels().get(model); + private static boolean registeredListener = false; + private static final Map trackedItems = new Reference2ObjectArrayMap<>(); + + private static void registerEventListener(LampBlockItem toWrap) { + trackedItems.put(toWrap, null); + + if (registeredListener) return; + registeredListener = true; + ModelUtils.registerBakeEventListener(false, (modelLocation, model, modelBakery) -> { + + // handle both cases 1.20 can have passed here. 1.21 *only* has the ModelResourceLocation case. + ResourceLocation possibleItemId; + if (modelLocation instanceof ModelResourceLocation modelResLoc && Objects.equals(modelResLoc.getVariant(), "inventory")) { + // unwrap ModelResourceLocations + // 1.21 needs different code here as ModelResourceLocation is a wrapper record instead of a subclass + possibleItemId = modelResLoc.withPrefix(""); + } else if (!modelLocation.getPath().startsWith("item/")) { + // remove the "item/" prefix from the model path + possibleItemId = modelLocation.withPath(path -> path.substring("item/".length())); + } else { + return model; } - event.getModels().put(model, new BakedModelWrapper<>(original) { - @Override - public boolean isCustomRenderer() { - return true; + for (var entry : trackedItems.entrySet()) { + ResourceLocation itemId = entry.getValue(); + if (itemId == null) { + entry.setValue(itemId = BuiltInRegistries.ITEM.getKey(entry.getKey())); } - }); + // if the current model is a lamp item, replace it with one that has isCustomRenderer()==true + // so the custom renderer in `LampBlockItem#initializeClient` works + if (itemId.equals(possibleItemId)) { + return new BakedModelWrapper<>(model) { + + @Override + public boolean isCustomRenderer() { + return true; + } + }; + } + } + + return model; }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java b/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java index a36f05bde92..4cf15c7b130 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java @@ -2,6 +2,8 @@ import com.gregtechceu.gtceu.client.model.machine.MachineModel; +import com.gregtechceu.gtceu.client.util.AssetEventListener; +import com.gregtechceu.gtceu.client.util.ModelUtils; import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -41,15 +43,21 @@ public void onDynamicResourcesStatusChange(boolean enabled) { } @Override - public BakedModel onBakedModelLoad(ResourceLocation location, UnbakedModel baseModel, - BakedModel originalModel, ModelState state, ModelBakery bakery, + public BakedModel onBakedModelLoad(ResourceLocation modelLocation, UnbakedModel baseModel, + BakedModel model, ModelState state, ModelBakery bakery, Function textureGetter) { - if (originalModel instanceof CustomBakedModel ctmModel) { + // run through all model replacers first + for (var listener : ModelUtils.EVENT_LISTENERS) { + if (!(listener.listener() instanceof AssetEventListener.BakedModelReplacement modelReplacement)) continue; + model = modelReplacement.modifyBakedModel(modelLocation, model, bakery); + } + + if (model instanceof CustomBakedModel ctmModel) { // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins if (ctmModel.getParent() instanceof MachineModel machineModel) { return machineModel; } } - return originalModel; + return model; } } From 9979fe3d4a5c928144f7d731b9f27e48e251264b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 23 Jun 2025 21:30:41 +0300 Subject: [PATCH 088/269] reimplement LDLib's CTM wrapper model --- .../gtceu/client/model/CTMBakedModel.java | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java new file mode 100644 index 00000000000..cf01fd27cdf --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java @@ -0,0 +1,137 @@ +package com.gregtechceu.gtceu.client.model; + +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.QuadInfo; + +import com.lowdragmc.lowdraglib.client.bakedpipeline.Submap; +import com.lowdragmc.lowdraglib.client.model.custommodel.Connections; +import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; + +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.BakedModelWrapper; +import net.minecraftforge.client.model.QuadTransformers; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelProperty; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class CTMBakedModel extends BakedModelWrapper { + + private final Map>> sideCache; + private final List noSideCache; + + public static final ModelProperty LEVEL = new ModelProperty<>(); + public static final ModelProperty POS = new ModelProperty<>(); + public static final ModelProperty MODEL_DATA = new ModelProperty<>(); + + public CTMBakedModel(T parent) { + super(parent); + this.sideCache = new EnumMap<>(Direction.class); + this.noSideCache = new ArrayList<>(); + } + + public BakedModel getParent() { + return this.originalModel; + } + + @Override + public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, + @NotNull RandomSource rand, @NotNull ModelData data, + @Nullable RenderType renderType) { + BlockAndTintGetter level = data.get(LEVEL); + BlockPos pos = data.get(POS); + if (level != null && pos != null && state != null) { + return getCustomQuads(level, pos, state, side, rand, data, renderType); + } else { + return super.getQuads(state, side, rand, data, renderType); + } + } + + @Override + public @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, + @NotNull BlockState state, @NotNull ModelData modelData) { + modelData = super.getModelData(level, pos, state, modelData); + return ModelData.builder() + .with(LEVEL, level) + .with(POS, pos) + .with(MODEL_DATA, modelData) + .build(); + } + + @SuppressWarnings("DataFlowIssue") + @NotNull + public List getCustomQuads(BlockAndTintGetter level, BlockPos pos, @NotNull BlockState state, + @Nullable Direction side, RandomSource rand, + @NotNull ModelData data, @Nullable RenderType renderType) { + final ModelData parentData = data.has(MODEL_DATA) ? data.get(MODEL_DATA) : ModelData.EMPTY; + + var connections = Connections.checkConnections(level, pos, state, side); + if (side == null) { + if (noSideCache.isEmpty()) { + noSideCache.addAll(buildCustomQuads(connections, + super.getQuads(state, null, rand, parentData, renderType), 0.0f)); + } + return noSideCache; + } + return sideCache.computeIfAbsent(side, this::makeMap) + .computeIfAbsent(connections, c -> buildCustomQuads(c, + super.getQuads(state, side, rand, parentData, renderType), 0.0f)); + } + + public static List reBakeCustomQuads(List quads, BlockAndTintGetter level, BlockPos pos, + @NotNull BlockState state, @Nullable Direction side, float offset) { + return buildCustomQuads(Connections.checkConnections(level, pos, state, side), quads, offset); + } + + public static List buildCustomQuads(Connections connections, List base, float offset) { + List result = new ArrayList<>(); + for (BakedQuad bakedQuad : base) { + var section = LDLMetadataSection.getMetadata(bakedQuad.getSprite()); + TextureAtlasSprite connection = section.connection == null ? null : + ModelUtils.getBlockSprite(section.connection); + if (connection == null) { + result.add(makeQuad(bakedQuad, section, offset)); + continue; + } + + BakedQuad baked = ModelUtils.derotateQuad(makeQuad(bakedQuad, section, offset)); + QuadInfo[] subdivided = ModelUtils.subdivide(baked); + + int[] ctm = connections.getSubmapIndices(); + + for (int j = 0; j < subdivided.length; j++) { + QuadInfo quad = subdivided[j]; + if (quad != null) { + int quadrant = quad.getNormalizedUVQuadrant(); + TextureAtlasSprite ctmSprite = ctm[quadrant] > 15 ? bakedQuad.getSprite() : connection; + subdivided[j] = quad.grow().transformUVs(ctmSprite, Submap.uvs[ctm[quadrant]]); + } + } + result.addAll(Arrays.stream(subdivided).filter(Objects::nonNull).map(QuadInfo::rebake).toList()); + } + return result; + } + + protected static BakedQuad makeQuad(BakedQuad quad, LDLMetadataSection section, float offset) { + int light = section.emissive ? 15 : 0; + quad = ModelUtils.offsetQuad(quad, offset); + QuadTransformers.settingEmissivity(light).process(quad); + return quad; + } + + private Map> makeMap(Direction ignored) { + return new ConcurrentHashMap<>(); + } +} From 9253abcad0c9a6b7aeeab9b4b1f2610100af0b48 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 00:20:31 +0300 Subject: [PATCH 089/269] Rip out almost* all LDLib CustomBakedModel usages & replace them with fresh (commented!) copies from CTM proper. \*: LDLMetadataSection is still missing, but that's easy enough to solve. --- .../gregtechceu/gtceu/client/ClientProxy.java | 66 ++++- .../gtceu/client/model/CTMBakedModel.java | 109 ++------ .../gtceu/client/model/GTModelProperties.java | 2 + .../client/model/connected/CTMCache.java | 255 ++++++++++++++++++ .../model/connected/ConnectionCheck.java | 97 +++++++ .../gtceu/client/model/connected/ISubmap.java | 103 +++++++ .../model/connected/OctagonalOrientation.java | 156 +++++++++++ .../gtceu/client/model/connected/Submap.java | 74 +++++ .../client/model/connected/package-info.java | 4 + .../client/model/machine/MachineModel.java | 5 +- .../gtceu/client/util/AssetEventListener.java | 3 +- .../gtceu/client/util/ModelUtils.java | 47 ++-- .../gtceu/client/util/QuadInfo.java | 56 ++-- .../gtceu/client/util/QuadUtils.java | 38 ++- .../client/util/SpriteFunctionWrapper.java | 28 ++ .../gtceu/common/item/LampBlockItem.java | 2 +- .../mixins/client/ModelBakerImplMixin.java | 29 ++ .../modernfix/GTModernFixIntegration.java | 14 +- src/main/resources/gtceu.mixins.json | 1 + 19 files changed, 921 insertions(+), 168 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/connected/CTMCache.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/connected/ConnectionCheck.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/connected/ISubmap.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/connected/OctagonalOrientation.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/connected/Submap.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/connected/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 9895b34514d..c521efcc894 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; +import com.gregtechceu.gtceu.client.model.CTMBakedModel; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; @@ -57,11 +58,16 @@ import com.gregtechceu.gtceu.utils.input.SyncedKeyMapping; import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; +import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; + import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; import net.minecraft.client.renderer.blockentity.HangingSignRenderer; import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraftforge.client.ForgeHooksClient; @@ -74,6 +80,11 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashSet; +import java.util.Set; + public class ClientProxy extends CommonProxy { public static final BiMap CLIENT_ORE_VEINS = HashBiMap.create(); @@ -180,7 +191,9 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); // register CTM model (un)wrapper - ModelUtils.registerBakeEventListener(false, (modelLocation, model, modelBakery) -> { + ModelUtils.registerBakeEventListener(false, (modelLocation, model, rootModel, modelBakery) -> { + if (model == null) return null; + // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins if (model instanceof CustomBakedModel ctmModel) { if (ctmModel.getParent() instanceof MachineModel machineModel) { @@ -192,6 +205,57 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { return model; } + + if (modelLocation instanceof ModelResourceLocation && rootModel != null) { + if (model.isCustomRenderer()) { // Nothing we can add to builtin models + return model; + } + Deque dependencies = new ArrayDeque<>(); + Set seenModels = new HashSet<>(); + dependencies.push(modelLocation); + seenModels.add(modelLocation); + boolean shouldWrap = ModelUtils.WRAPPED_MODELS.getOrDefault(modelLocation, false); + // Breadth-first loop through dependencies + // exiting as soon as a CTM texture is found, and skipping duplicates/cycles + while (!shouldWrap && !dependencies.isEmpty()) { + ResourceLocation dep = dependencies.pop(); + UnbakedModel unbaked; + try { + unbaked = dep == modelLocation ? rootModel : modelBakery.getModel(dep); + } catch (Exception e) { + continue; + } + try { + // have to copy because the set is updated during this loop + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") + Set textures = new HashSet<>(ModelUtils.SCRAPED_TEXTURES.get(dep)); + for (Material tex : textures) { + // Cache all dependent texture metadata + // TODO lazy + if (!LDLMetadataSection.getMetadata(LDLMetadataSection.spriteToAbsolute(tex.texture())).isMissing()) { + // At least one texture has CTM metadata, so we should wrap this model + shouldWrap = true; + break; + } + } + if (!shouldWrap) { + for (ResourceLocation newDep : unbaked.getDependencies()) { + if (seenModels.add(newDep)) { + dependencies.push(newDep); + } + } + } + } catch (Exception e) { + GTCEu.LOGGER.error("Error loading baked dependency {} for baked {}. Skipping...", + dep, modelLocation, e); + } + } + ModelUtils.WRAPPED_MODELS.put(modelLocation, shouldWrap); + if (shouldWrap) { + return new CTMBakedModel<>(model); + } + } + return model; }); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java index cf01fd27cdf..5806e3dfec0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java @@ -1,15 +1,10 @@ package com.gregtechceu.gtceu.client.model; -import com.gregtechceu.gtceu.client.util.ModelUtils; -import com.gregtechceu.gtceu.client.util.QuadInfo; - -import com.lowdragmc.lowdraglib.client.bakedpipeline.Submap; -import com.lowdragmc.lowdraglib.client.model.custommodel.Connections; -import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; +import com.gregtechceu.gtceu.client.model.connected.CTMCache; +import com.gregtechceu.gtceu.client.util.QuadUtils; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -17,121 +12,63 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.BakedModelWrapper; -import net.minecraftforge.client.model.QuadTransformers; import net.minecraftforge.client.model.data.ModelData; -import net.minecraftforge.client.model.data.ModelProperty; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -public class CTMBakedModel extends BakedModelWrapper { +import static com.gregtechceu.gtceu.client.model.GTModelProperties.*; - private final Map>> sideCache; - private final List noSideCache; +public class CTMBakedModel extends BakedModelWrapper { - public static final ModelProperty LEVEL = new ModelProperty<>(); - public static final ModelProperty POS = new ModelProperty<>(); - public static final ModelProperty MODEL_DATA = new ModelProperty<>(); + private final Map>> sideCache = new EnumMap<>(Direction.class); public CTMBakedModel(T parent) { super(parent); - this.sideCache = new EnumMap<>(Direction.class); - this.noSideCache = new ArrayList<>(); } public BakedModel getParent() { return this.originalModel; } + @SuppressWarnings("DataFlowIssue") @Override - public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, - @NotNull RandomSource rand, @NotNull ModelData data, - @Nullable RenderType renderType) { + public List getQuads(@Nullable BlockState state, @Nullable Direction side, + RandomSource rand, ModelData data, @Nullable RenderType renderType) { BlockAndTintGetter level = data.get(LEVEL); BlockPos pos = data.get(POS); + ModelData parentData = data.has(PARENT_MODEL_DATA) ? data.get(PARENT_MODEL_DATA) : data; + if (level != null && pos != null && state != null) { - return getCustomQuads(level, pos, state, side, rand, data, renderType); + return getCustomQuads(level, pos, state, side, rand, parentData, renderType); } else { - return super.getQuads(state, side, rand, data, renderType); + return super.getQuads(state, side, rand, parentData, renderType); } } @Override - public @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, - @NotNull BlockState state, @NotNull ModelData modelData) { - modelData = super.getModelData(level, pos, state, modelData); + public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) { + ModelData parentModelData = super.getModelData(level, pos, state, modelData); return ModelData.builder() .with(LEVEL, level) .with(POS, pos) - .with(MODEL_DATA, modelData) + .with(PARENT_MODEL_DATA, parentModelData) .build(); } - @SuppressWarnings("DataFlowIssue") - @NotNull - public List getCustomQuads(BlockAndTintGetter level, BlockPos pos, @NotNull BlockState state, + public List getCustomQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, @Nullable Direction side, RandomSource rand, - @NotNull ModelData data, @Nullable RenderType renderType) { - final ModelData parentData = data.has(MODEL_DATA) ? data.get(MODEL_DATA) : ModelData.EMPTY; - - var connections = Connections.checkConnections(level, pos, state, side); + ModelData modelData, @Nullable RenderType renderType) { if (side == null) { - if (noSideCache.isEmpty()) { - noSideCache.addAll(buildCustomQuads(connections, - super.getQuads(state, null, rand, parentData, renderType), 0.0f)); - } - return noSideCache; - } - return sideCache.computeIfAbsent(side, this::makeMap) - .computeIfAbsent(connections, c -> buildCustomQuads(c, - super.getQuads(state, side, rand, parentData, renderType), 0.0f)); - } - - public static List reBakeCustomQuads(List quads, BlockAndTintGetter level, BlockPos pos, - @NotNull BlockState state, @Nullable Direction side, float offset) { - return buildCustomQuads(Connections.checkConnections(level, pos, state, side), quads, offset); - } - - public static List buildCustomQuads(Connections connections, List base, float offset) { - List result = new ArrayList<>(); - for (BakedQuad bakedQuad : base) { - var section = LDLMetadataSection.getMetadata(bakedQuad.getSprite()); - TextureAtlasSprite connection = section.connection == null ? null : - ModelUtils.getBlockSprite(section.connection); - if (connection == null) { - result.add(makeQuad(bakedQuad, section, offset)); - continue; - } - - BakedQuad baked = ModelUtils.derotateQuad(makeQuad(bakedQuad, section, offset)); - QuadInfo[] subdivided = ModelUtils.subdivide(baked); - - int[] ctm = connections.getSubmapIndices(); - - for (int j = 0; j < subdivided.length; j++) { - QuadInfo quad = subdivided[j]; - if (quad != null) { - int quadrant = quad.getNormalizedUVQuadrant(); - TextureAtlasSprite ctmSprite = ctm[quadrant] > 15 ? bakedQuad.getSprite() : connection; - subdivided[j] = quad.grow().transformUVs(ctmSprite, Submap.uvs[ctm[quadrant]]); - } - } - result.addAll(Arrays.stream(subdivided).filter(Objects::nonNull).map(QuadInfo::rebake).toList()); + return super.getQuads(state, null, rand, modelData, renderType); } - return result; - } - - protected static BakedQuad makeQuad(BakedQuad quad, LDLMetadataSection section, float offset) { - int light = section.emissive ? 15 : 0; - quad = ModelUtils.offsetQuad(quad, offset); - QuadTransformers.settingEmissivity(light).process(quad); - return quad; - } - private Map> makeMap(Direction ignored) { - return new ConcurrentHashMap<>(); + CTMCache ctmCache = CTMCache.getInstance(); + ctmCache.getSubmapIds(level, pos, state, side); + return this.sideCache.computeIfAbsent(side, $ -> new ConcurrentHashMap<>()) + .computeIfAbsent(ctmCache, cache -> QuadUtils.buildCTMQuads(cache, + super.getQuads(state, side, rand, modelData, renderType))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java b/src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java index 547af6d647e..316cc6c722c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/GTModelProperties.java @@ -2,12 +2,14 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelProperty; public class GTModelProperties { public static final ModelProperty LEVEL = new ModelProperty<>(); public static final ModelProperty POS = new ModelProperty<>(); + public static final ModelProperty PARENT_MODEL_DATA = new ModelProperty<>(); public static final ModelProperty PIPE_CONNECTION_MASK = new ModelProperty<>(); public static final ModelProperty PIPE_BLOCKED_MASK = new ModelProperty<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/connected/CTMCache.java new file mode 100644 index 00000000000..be75c64be9a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/connected/CTMCache.java @@ -0,0 +1,255 @@ +package com.gregtechceu.gtceu.client.model.connected; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; + +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; + +import static com.gregtechceu.gtceu.client.model.connected.OctagonalOrientation.*; + +// @formatter:off +/** + * The CTM renderer will draw the block's FACE by assembling 4 quadrants from the 5 available block textures. + * The normal {@code texture.png} is the block's "unconnected" texture, and is used when CTM is disabled or the block has nothing to connect to. + * This texture has all the outside corner quadrants, and {@code texture_ctm.png} contains the rest of the quadrants. + *
+ * ┌─────────────────┐ ┌────────────────────────────────┐
+ * │ texture.png     │ │ texture_ctm.png                │
+ * │ ╔══════╤══════╗ │ │  ──────┼────── ║ ─────┼───── ║ │
+ * │ ║      │      ║ │ │ │      │      │║      │      ║ │
+ * │ ║ 16   │ 17   ║ │ │ │ 0    │ 1    │║ 2    │ 3    ║ │
+ * │ ╟──────┼──────╢ │ │ ┼──────┼──────┼╟──────┼──────╢ │
+ * │ ║      │      ║ │ │ │      │      │║      │      ║ │
+ * │ ║ 18   │ 19   ║ │ │ │ 4    │ 5    │║ 6    │ 7    ║ │
+ * │ ╚══════╧══════╝ │ │  ──────┼────── ║ ─────┼───── ║ │
+ * └─────────────────┘ │ ═══════╤═══════╝ ─────┼───── ╚ │
+ *                     │ │      │      ││      │      │ │
+ *                     │ │ 8    │ 9    ││ 10   │ 11   │ │
+ *                     │ ┼──────┼──────┼┼──────┼──────┼ │
+ *                     │ │      │      ││      │      │ │
+ *                     │ │ 12   │ 13   ││ 14   │ 15   │ │
+ *                     │ ═══════╧═══════╗ ─────┼───── ╔ │
+ *                     └────────────────────────────────┘
+ * 
+ * combining { 18, 13, 9, 16 }, we can generate a texture connected to the right! + *
+ * ╔══════╤═══════
+ * ║      │      │
+ * ║ 16   │ 9    │
+ * ╟──────┼──────┼
+ * ║      │      │
+ * ║ 18   │ 13   │
+ * ╚══════╧═══════
+ * 
+ * + * combining { 18, 13, 11, 2 }, we can generate a texture, in the shape of an L (connected to the right, and up + *
+ * ║ ─────┼───── ╚
+ * ║      │      │
+ * ║ 2    │ 11   │
+ * ╟──────┼──────┼
+ * ║      │      │
+ * ║ 18   │ 13   │
+ * ╚══════╧═══════
+ * 
+ * + * HAVE FUN! + * -CptRageToaster- + *

+ * Sourced from ConnectedTexturesMod. + */ +@Accessors(fluent = true, chain = true) +public class CTMCache { + + @FunctionalInterface + public interface StateComparisonCallback { + + StateComparisonCallback DEFAULT = (connectionCheck, from, to, dir) -> connectionCheck.ignoreStates() ? from.getBlock() == to.getBlock() : from == to; + + boolean connects(ConnectionCheck instance, BlockState from, BlockState to, Direction dir); + } + + /** + * The UVs for the specific "magic number" value + */ + public static final ISubmap[] uvs = { + // CTM texture + Submap.fromPixelScale(4, 4, 0, 0), // 0 + Submap.fromPixelScale(4, 4, 4, 0), // 1 + Submap.fromPixelScale(4, 4, 8, 0), // 2 + Submap.fromPixelScale(4, 4, 12, 0), // 3 + Submap.fromPixelScale(4, 4, 0, 4), // 4 + Submap.fromPixelScale(4, 4, 4, 4), // 5 + Submap.fromPixelScale(4, 4, 8, 4), // 6 + Submap.fromPixelScale(4, 4, 12, 4), // 7 + Submap.fromPixelScale(4, 4, 0, 8), // 8 + Submap.fromPixelScale(4, 4, 4, 8), // 9 + Submap.fromPixelScale(4, 4, 8, 8), // 10 + Submap.fromPixelScale(4, 4, 12, 8), // 11 + Submap.fromPixelScale(4, 4, 0, 12), // 12 + Submap.fromPixelScale(4, 4, 4, 12), // 13 + Submap.fromPixelScale(4, 4, 8, 12), // 14 + Submap.fromPixelScale(4, 4, 12, 12), // 15 + // Default texture + Submap.fromPixelScale(8, 8, 0, 0), // 16 + Submap.fromPixelScale(8, 8, 8, 0), // 17 + Submap.fromPixelScale(8, 8, 0, 8), // 18 + Submap.fromPixelScale(8, 8, 8, 8) // 19 + }; + + public static final ISubmap FULL_TEXTURE = Submap.X1; + + // @formatter:on + + /** Some hardcoded offset values for the different corner indeces */ + protected static int[] submapOffsets = { 4, 5, 1, 0 }; + protected static int[] defaultSubmapCache = { 18, 19, 17, 16 }; + + // TODO encapsulate + public ConnectionCheck connectionCheck = new ConnectionCheck(); + + // Mapping the different corner indeces to their respective dirs + protected static final OctagonalOrientation[][] submapMap = { + { BOTTOM, LEFT, BOTTOM_LEFT }, + { BOTTOM, RIGHT, BOTTOM_RIGHT }, + { TOP, RIGHT, TOP_RIGHT }, + { TOP, LEFT, TOP_LEFT } + }; + + protected byte connectionMap; + protected int[] submapCache = defaultSubmapCache.clone(); + + + public static CTMCache getInstance() { + return new CTMCache(); + } + + /** + * Indeces are in counter-clockwise order starting at bottom left. + * + * @return The indeces of the typical 4x4 submap to use for the given face at the given location. + */ + public int[] getSubmapIds(@Nullable BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side) { + if (level == null) { + return this.submapCache; + } + + buildConnectionMap(level, pos, state, side); + // Map connections to submap indices + for (int i = 0; i < 4; i++) { + fillSubmaps(i); + } + + return this.submapCache; + } + + public int[] getSubmapIndices() { + return this.submapCache; + } + + public static boolean isDefaultTexture(int id) { + return (id == 16 || id == 17 || id == 18 || id == 19); + } + + protected void setConnectedState(OctagonalOrientation dir, boolean connected) { + this.connectionMap = setConnectedState(this.connectionMap, dir, connected); + } + + private static byte setConnectedState(byte map, OctagonalOrientation dir, boolean connected) { + if (connected) { + return (byte) (map | (1 << dir.ordinal())); + } else { + return (byte) (map & ~(1 << dir.ordinal())); + } + } + + /** + * Builds the connection map and stores it in this CTMLogic instance. + * The {@link #connected(OctagonalOrientation)}, {@link #connectedAnd(OctagonalOrientation...)}, + * and {@link #connectedOr(OctagonalOrientation...)} methods can be used to access it. + */ + public void buildConnectionMap(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction side) { + // TODO this naive check doesn't work for models that have unculled faces. + // Perhaps a smarter optimization could be done eventually? + for (OctagonalOrientation dir : OctagonalOrientation.VALUES) { + //Note: We can't cache the state that we are checking about connection for as we want to ensure that + // we can take into account the side of the block we want to know the "state" of as if the block is + // a facade of some sort it might return different results based on where it is being queried from + setConnectedState(dir, dir.isConnected(this.connectionCheck, world, pos, state, side)); + } + } + + @SuppressWarnings("null") + protected void fillSubmaps(int idx) { + OctagonalOrientation[] dirs = submapMap[idx]; + if (connectedOr(dirs[0], dirs[1])) { + if (connectedAnd(dirs)) { + // If all dirs are connected, we use the fully connected face, the base offset value. + this.submapCache[idx] = submapOffsets[idx]; + } else { + // This is a bit magic-y, but basically the array is ordered so + // the first dir requires an offset of 2, and the second dir requires an offset of 8 + // plus the initial offset for the corner. + this.submapCache[idx] = submapOffsets[idx] + (connected(dirs[0]) ? 2 : 0) + (connected(dirs[1]) ? 8 : 0); + } + } + } + + /** + * @param dir + * The direction to check connection in. + * @return True if the cached connectionMap holds a connection in this {@link OctagonalOrientation direction}. + */ + public boolean connected(OctagonalOrientation dir) { + return ((this.connectionMap >> dir.ordinal()) & 1) == 1; + } + + /** + * @param dirs + * The directions to check connection in. + * @return True if the cached connectionMap holds a connection in all the given {@link OctagonalOrientation directions}. + */ + @SuppressWarnings("null") + public boolean connectedAnd(OctagonalOrientation... dirs) { + for (OctagonalOrientation dir : dirs) { + if (!connected(dir)) { + return false; + } + } + return true; + } + + /** + * @param dirs + * The directions to check connection in. + * @return True if the cached connectionMap holds a connection in one of the given {@link OctagonalOrientation directions}. + */ + @SuppressWarnings("null") + public boolean connectedOr(OctagonalOrientation... dirs) { + for (OctagonalOrientation dir : dirs) { + if (connected(dir)) { + return true; + } + } + return false; + } + + public boolean connectedNone(OctagonalOrientation... dirs) { + for (OctagonalOrientation dir : dirs) { + if (connected(dir)) { + return false; + } + } + return true; + } + + public boolean connectedOnly(OctagonalOrientation... dirs) { + byte map = 0; + for (OctagonalOrientation dir : dirs) { + map = setConnectedState(map, dir, true); + } + return map == this.connectionMap; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/ConnectionCheck.java b/src/main/java/com/gregtechceu/gtceu/client/model/connected/ConnectionCheck.java new file mode 100644 index 00000000000..afa0242ec85 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/connected/ConnectionCheck.java @@ -0,0 +1,97 @@ +package com.gregtechceu.gtceu.client.model.connected; + +import com.gregtechceu.gtceu.client.model.connected.CTMCache.StateComparisonCallback; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; + +/** + * Sourced from ConnectedTexturesMod. + */ +@NoArgsConstructor +@AllArgsConstructor +@Accessors(fluent = true, chain = true) +public class ConnectionCheck { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.BOOL.optionalFieldOf("ignore_states", false).forGetter(ConnectionCheck::ignoreStates) + ).apply(instance, ignoredStates -> new ConnectionCheck().ignoreStates(ignoredStates))); + + @Getter + @Setter + protected boolean ignoreStates; + + @Getter + @Setter + protected StateComparisonCallback stateComparator = StateComparisonCallback.DEFAULT; + + /** + * A simple check for if the given block can connect to the given direction on the given side. + * + * @param level The level the positions are in. + * @param current The position of your block. + * @param currentState The current state of your block. + * @param connection The position of the block to check against. + * @param dir The {@link Direction side} of the block to check for connection status. + * This is not the direction to check in. + * @return True if the given block can connect to the given location on the given side. + */ + public final boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, + BlockPos connection, Direction dir) { + BlockState state = getConnectionState(level, current, currentState, + dir, connection, level.getBlockState(connection)); + return isConnected(level, current, currentState, connection, dir, state); + } + + /** + * A simple check for if the given block can connect to the given direction on the given side. + * + * @param level The level the positions are in. + * @param current The position of your block. + * @param connection The position of the block to check against. + * @param dir The {@link Direction side} of the block to check for connection status. + * This is not the direction to check in. + * @param state The state to check against for connection. + * @return True if the given block can connect to the given location on the given side. + */ + @SuppressWarnings({ "unused", "null" }) + public boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, BlockPos connection, Direction dir, BlockState state) { + BlockState connectionState = getConnectionState(level, connection, level.getBlockState(connection), dir, current, currentState); + BlockPos obscuringPos = connection.relative(dir); + BlockState obscuring = getConnectionState(level, obscuringPos, level.getBlockState(obscuringPos), + dir, current, currentState); + + // check that we aren't already connected to / from this side + return stateComparator(state, connectionState, dir) && !stateComparator(state, obscuring, dir); + } + + public boolean stateComparator(BlockState from, BlockState to, Direction dir) { + return stateComparator.connects(this, from, to, dir); + } + + public BlockState getConnectionState(BlockAndTintGetter level, BlockPos pos, @Nullable Direction side, + BlockPos connection, BlockState connectionState) { + return getConnectionState(level, pos, level.getBlockState(pos), side, connection, connectionState); + } + + public BlockState getConnectionState(BlockAndTintGetter level, BlockPos pos, BlockState state, + @Nullable Direction side, BlockPos connection, BlockState connectionState) { + if (side != null) { + return state.getAppearance(level, pos, side, connectionState, connection); + } + return state; + } + +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/ISubmap.java b/src/main/java/com/gregtechceu/gtceu/client/model/connected/ISubmap.java new file mode 100644 index 00000000000..ccd66874017 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/connected/ISubmap.java @@ -0,0 +1,103 @@ +package com.gregtechceu.gtceu.client.model.connected; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; + +import lombok.RequiredArgsConstructor; + +/** + * Sourced from ConnectedTexturesMod. + */ +public interface ISubmap { + + float getYOffset(); + + float getXOffset(); + + float getWidth(); + + float getHeight(); + + default float getInterpolatedU(TextureAtlasSprite sprite, float u) { + return sprite.getU((getXOffset() + u / getWidth()) / 16F); + } + + default float getInterpolatedV(TextureAtlasSprite sprite, float v) { + return sprite.getV((getYOffset() + v / getHeight()) / 16F); + } + + default float[] toArray() { + return new float[] { getXOffset(), getYOffset(), getXOffset() + getWidth(), getYOffset() + getHeight() }; + } + + default ISubmap unitScale() { + return new SubmapRescaled(this, UNITS_PER_PIXEL, false); + } + + default ISubmap pixelScale() { + return this; + } + + float PIXELS_PER_UNIT = 16f; + float UNITS_PER_PIXEL = 1f / PIXELS_PER_UNIT; + + @RequiredArgsConstructor + class SubmapRescaled implements ISubmap { + + private final ISubmap parent; + private final float ratio; + private final boolean isPixelScale; + + @Override + public float getXOffset() { + return parent.getXOffset() * ratio; + } + + @Override + public float getYOffset() { + return parent.getYOffset() * ratio; + } + + @Override + public float getWidth() { + return parent.getWidth() * ratio; + } + + @Override + public float getHeight() { + return parent.getHeight() * ratio; + } + + @Override + public ISubmap pixelScale() { + return isPixelScale ? this : parent; + } + + @Override + public ISubmap unitScale() { + return isPixelScale ? parent : this; + } + + @Override + public float getInterpolatedU(TextureAtlasSprite sprite, float u) { + return parent.getInterpolatedU(sprite, u); + } + + @Override + public float getInterpolatedV(TextureAtlasSprite sprite, float v) { + return parent.getInterpolatedV(sprite, v); + } + + @Override + public float[] toArray() { + return parent.toArray(); + } + } + + default ISubmap flipX() { + return Submap.fromPixelScale(getWidth(), getHeight(), PIXELS_PER_UNIT - getXOffset() - getWidth(), getYOffset()); + } + + default ISubmap flipY() { + return Submap.fromPixelScale(getWidth(), getHeight(), getXOffset(), PIXELS_PER_UNIT - getYOffset() - getHeight()); + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/OctagonalOrientation.java b/src/main/java/com/gregtechceu/gtceu/client/model/connected/OctagonalOrientation.java new file mode 100644 index 00000000000..300d90dc3bf --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/connected/OctagonalOrientation.java @@ -0,0 +1,156 @@ +package com.gregtechceu.gtceu.client.model.connected; + +import net.createmod.catnip.math.DirectionHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.Locale; + +import static net.minecraft.core.Direction.*; + +/** + * Think of this class as an octagonal {@link net.minecraft.core.Direction}. + *

+ * It represents the eight different directions a face of a block can connect with CTM, + * and contains the logic for determining if a block is indeed connected in that direction. + *

+ * Note that, for example, {@link #TOP_RIGHT} does not mean connected to the {@link #TOP} and {@link #RIGHT}, + * but connected in the diagonal direction represented by {@link #TOP_RIGHT}. + * This is used for inner corner rendering. + *

+ * Sourced from ConnectedTexturesMod. + */ +public enum OctagonalOrientation implements StringRepresentable { + // spotless:off + TOP(UP), + TOP_RIGHT(UP, EAST), + RIGHT(EAST), + BOTTOM_RIGHT(DOWN, EAST), + BOTTOM(DOWN), + BOTTOM_LEFT(DOWN, WEST), + LEFT(WEST), + TOP_LEFT(UP, WEST); + // spotless:on + + public static final OctagonalOrientation[] VALUES = values(); + private static final Direction NORMAL = SOUTH; + + static { + // Run after static init + for (OctagonalOrientation dir : OctagonalOrientation.VALUES) { + dir.buildCaches(); + } + } + + private final Direction[] dirs; + + private final BlockPos[] offsets = new BlockPos[6]; + + OctagonalOrientation(Direction... dirs) { + this.dirs = dirs; + } + + private void buildCaches() { + // Fill normalized dirs + for (Direction normal : Direction.values()) { + Direction[] normalized; + if (normal == NORMAL) { + normalized = dirs; + } else if (normal == NORMAL.getOpposite()) { + // If this is the opposite direction of the default normal, we need to mirror the dirs + // A mirror version does not affect y+ and y- so we ignore those + Direction[] ret = new Direction[dirs.length]; + for (int i = 0; i < ret.length; i++) { + ret[i] = dirs[i].getStepY() != 0 ? dirs[i] : dirs[i].getOpposite(); + } + normalized = ret; + } else { + Direction axis; + // Next, we need different a different rotation axis depending on if this is up/down or not + if (normal.getAxis() != Axis.Y) { + // If it is not up/down, pick either the left or right-hand rotation + axis = normal == NORMAL.getClockWise() ? UP : DOWN; + } else { + // If it is up/down, pick either the up or down rotation. + axis = normal == UP ? NORMAL.getCounterClockWise() : NORMAL.getClockWise(); + } + Direction[] ret = new Direction[dirs.length]; + // Finally apply all the rotations + for (int i = 0; i < ret.length; i++) { + ret[i] = rotate(dirs[i], axis); + } + normalized = ret; + } + BlockPos ret = BlockPos.ZERO; + for (Direction dir : normalized) { + ret = ret.relative(dir); + } + offsets[normal.ordinal()] = ret; + } + } + + /** + * Finds if this block is connected for the given side in this OctagonalOrientation. + * + * @param ctm The ConnectionCheck instance to use for logic. + * @param level The level the block is in. + * @param pos The position of your block. + * @param state The state of your block. + * @param side The side of the current face. + * @return True if the block is connected in the given OctagonalOrientation, false otherwise. + */ + public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side) { + return ctm.isConnected(level, pos, state, applyConnection(pos, side), side); + } + + /** + * Finds if this block is connected for the given side in this OctagonalOrientation. + * + * @param ctm The ConnectionCheck instance to use for logic. + * @param level The level the block is in. + * @param pos The position of your block. + * @param state The state of your block. + * @param side The side of the current face. + * @param connectionState The state to check for connection with. + * @return True if the block is connected in the given OctagonalOrientation, false otherwise. + */ + public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side, BlockState connectionState) { + return ctm.isConnected(level, pos, state, applyConnection(pos, side), side, connectionState); + } + + /** + * Apply this OctagonalOrientation to the given BlockPos for the given normal direction. + * + * @return The offset BlockPos + */ + public BlockPos applyConnection(BlockPos pos, Direction side) { + return pos.offset(getOffset(side)); + } + + public BlockPos getOffset(Direction normal) { + return offsets[normal.ordinal()]; + } + + private Direction rotate(Direction facing, Direction axisFacing) { + Direction.Axis axis = axisFacing.getAxis(); + AxisDirection axisDir = axisFacing.getAxisDirection(); + + if (axisDir == AxisDirection.POSITIVE) { + return DirectionHelper.rotateAround(facing, axis); + } + + if (facing.getAxis() != axis) { + return facing.getCounterClockWise(axis); + } + + return facing; + } + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/Submap.java b/src/main/java/com/gregtechceu/gtceu/client/model/connected/Submap.java new file mode 100644 index 00000000000..4d7db40e1b2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/connected/Submap.java @@ -0,0 +1,74 @@ +package com.gregtechceu.gtceu.client.model.connected; + +import lombok.Getter; + +/** + * Sourced from ConnectedTexturesMod. + */ +public class Submap implements ISubmap { + + public static final ISubmap X1 = fromPixelScale(16, 16, 0, 0); + + public static final ISubmap[][] X2 = { + { fromPixelScale(8, 8, 0, 0), fromPixelScale(8, 8, 8, 0) }, + { fromPixelScale(8, 8, 0, 8), fromPixelScale(8, 8, 8, 8) } + }; + + private static final float DIV3 = 16 / 3f; + public static final ISubmap[][] X3 = { + { fromPixelScale(DIV3, DIV3, 0, 0), fromPixelScale(DIV3, DIV3, DIV3, 0), fromPixelScale(DIV3, DIV3, DIV3 * 2, 0) }, + { fromPixelScale(DIV3, DIV3, 0, DIV3), fromPixelScale(DIV3, DIV3, DIV3, DIV3), fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3) }, + { fromPixelScale(DIV3, DIV3, 0, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3 * 2) }, + }; + + public static final ISubmap[][] X4 = { + { fromPixelScale(4, 4, 0, 0), fromPixelScale(4, 4, 4, 0), fromPixelScale(4, 4, 8, 0), fromPixelScale(4, 4, 12, 0) }, + { fromPixelScale(4, 4, 0, 4), fromPixelScale(4, 4, 4, 4), fromPixelScale(4, 4, 8, 4), fromPixelScale(4, 4, 12, 4) }, + { fromPixelScale(4, 4, 0, 8), fromPixelScale(4, 4, 4, 8), fromPixelScale(4, 4, 8, 8), fromPixelScale(4, 4, 12, 8) }, + { fromPixelScale(4, 4, 0, 12), fromPixelScale(4, 4, 4, 12), fromPixelScale(4, 4, 8, 12), fromPixelScale(4, 4, 12, 12) }, + }; + + public static ISubmap[][] grid(int w, int h) { + float xDiv = 16f / w; + float yDiv = 16f / h; + ISubmap[][] ret = new ISubmap[h][w]; + for (int x = 0; x < w; x++) { + for (int y = 0; y < h; y++) { + ret[y][x] = fromPixelScale(xDiv, yDiv, xDiv * x, yDiv * y); + } + } + return ret; + } + + public static ISubmap raw(float width, float height, float xOffset, float yOffset) { + return new Submap(width, height, xOffset, yOffset, 1); + } + + public static ISubmap fromUnitScale(float width, float height, float xOffset, float yOffset) { + return fromPixelScale(width * PIXELS_PER_UNIT, height * PIXELS_PER_UNIT, xOffset * PIXELS_PER_UNIT, yOffset * PIXELS_PER_UNIT); + } + + public static ISubmap fromPixelScale(float width, float height, float xOffset, float yOffset) { + return new Submap(width, height, xOffset, yOffset, UNITS_PER_PIXEL); + } + + @Getter + private final float width, height; + @Getter + private final float xOffset, yOffset; + + final SubmapRescaled rescaled; + + private Submap(float width, float height, float xOffset, float yOffset, float rescale) { + this.width = width; + this.height = height; + this.xOffset = xOffset; + this.yOffset = yOffset; + this.rescaled = new SubmapRescaled(this, rescale, false); + } + + @Override + public SubmapRescaled pixelScale() { + return this.rescaled; + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/model/connected/package-info.java new file mode 100644 index 00000000000..a7df99e25f9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/connected/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.client.model.connected; + +import org.jetbrains.annotations.NotNullByDefault; 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 81c150e8358..803f4094a5a 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 @@ -12,12 +12,11 @@ import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartBakedModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.util.QuadUtils; import com.gregtechceu.gtceu.client.util.StaticFaceBakery; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; -import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; - import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -275,7 +274,7 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl // we have to recalculate CTM ourselves. // this is the slowest part by a long shot because the LDLib quad logic isn't very optimized. if (level != null && pos != null && blockState != null) { - return CustomBakedModel.reBakeCustomQuads(quads, level, pos, blockState, side, 0.0f); + return QuadUtils.buildCTMQuads(quads, level, pos, blockState, side); } return quads; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java index d45a95e5663..24907a997a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java @@ -2,6 +2,7 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.TextureStitchEvent; @@ -31,7 +32,7 @@ default Class eventClass() { @FunctionalInterface interface BakedModelReplacement { - BakedModel modifyBakedModel(ResourceLocation modelLocation, BakedModel model, ModelBakery modelBakery); + BakedModel modifyBakedModel(ResourceLocation modelLocation, BakedModel model, UnbakedModel rootModel, ModelBakery modelBakery); } @FunctionalInterface diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java index 717cf048a8d..f9749f0fced 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java @@ -3,9 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; -import com.gregtechceu.gtceu.integration.modernfix.GTModernFixIntegration; -import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; import net.minecraft.ChatFormatting; @@ -33,6 +31,10 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.ApiStatus; @@ -46,7 +48,18 @@ private ModelUtils() {} @ApiStatus.Internal public static final List> EVENT_LISTENERS = new ArrayList<>(); - public static final Map CTM_SPRITE_CACHE = new ConcurrentHashMap<>(); + @ApiStatus.Internal + public static final Map CTM_SPRITE_CACHE = new ConcurrentHashMap<>(); + + @ApiStatus.Internal + public static final Multimap SCRAPED_TEXTURES = HashMultimap.create(); + @ApiStatus.Internal + public static final Object2BooleanMap WRAPPED_MODELS = new Object2BooleanLinkedOpenHashMap<>(); + + @ApiStatus.Internal + public static void textureScraped(ResourceLocation modelLocation, Material material) { + SCRAPED_TEXTURES.put(modelLocation, material); + } public static List getBakedModelQuads(BakedModel model, BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side, RandomSource rand) { @@ -57,6 +70,11 @@ public static BakedModel getModelForState(BlockState state) { return Minecraft.getInstance().getBlockRenderer().getBlockModel(state); } + @SuppressWarnings("deprecation") + public static TextureAtlasSprite getBlockSprite(ResourceLocation textureLocation) { + return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(textureLocation); + } + public static String getPropertyValueString(Map.Entry, Comparable> entry) { Property property = entry.getKey(); Comparable value = entry.getValue(); @@ -110,14 +128,15 @@ public void onResourceManagerReload(@NotNull ResourceManager resourceManager) { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onAtlasStitched(TextureStitchEvent.Post event) { if (event.getAtlas().location().equals(TextureAtlas.LOCATION_BLOCKS)) { + // Cache all textures' CTM metadata + // TODO lazy CTM_SPRITE_CACHE.clear(); for (ResourceLocation location : event.getAtlas().getTextureLocations()) { ResourceLocation absLoc = LDLMetadataSection.spriteToAbsolute(location); LDLMetadataSection section = LDLMetadataSection.getMetadata(absLoc); if (section.connection != null) { - TextureAtlasSprite baseSprite = event.getAtlas().getSprite(location); TextureAtlasSprite ctmSprite = event.getAtlas().getSprite(section.connection); - CTM_SPRITE_CACHE.put(baseSprite, ctmSprite); + CTM_SPRITE_CACHE.put(location, ctmSprite); } } } @@ -140,26 +159,20 @@ public static void onAtlasStitched(TextureStitchEvent.Post event) { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onModifyBakingResult(ModelEvent.ModifyBakingResult event) { - // don't process baked model replacement here if modernfix dynamic resources is enabled - if (GTCEu.Mods.isModernFixLoaded() && GTModernFixIntegration.isDynamicResourcesEnabled()) return; + // don't process baked model replacement here if modernfix is loaded, as + // GTModernFixIntegration#onBakedModelLoad does the same thing & it's always called + if (GTCEu.Mods.isModernFixLoaded()) return; for (var entry : event.getModels().entrySet()) { BakedModel model = entry.getValue(); - // run through all model replacers first + // process all model replacers for (var listener : EVENT_LISTENERS) { if (!(listener.listener instanceof AssetEventListener.BakedModelReplacement modelReplacement)) continue; - model = modelReplacement.modifyBakedModel(entry.getKey(), model, event.getModelBakery()); + model = modelReplacement.modifyBakedModel(entry.getKey(), model, + event.getModelBakery().getModel(entry.getKey()), event.getModelBakery()); } entry.setValue(model); - - // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins - // Also, the caching they have stops our models from updating properly - if (model instanceof CustomBakedModel ctmModel) { - if (ctmModel.getParent() instanceof MachineModel machineModel) { - entry.setValue(machineModel); - } - } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java b/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java index 7116e3fcc5a..9718d5c6451 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.client.util; -import com.lowdragmc.lowdraglib.client.bakedpipeline.ISubmap; -import com.lowdragmc.lowdraglib.client.bakedpipeline.Submap; -import com.lowdragmc.lowdraglib.client.model.custommodel.Connection; -import com.lowdragmc.lowdraglib.client.model.custommodel.Connections; +import com.gregtechceu.gtceu.client.model.connected.ISubmap; +import com.gregtechceu.gtceu.client.model.connected.OctagonalOrientation; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -13,20 +11,21 @@ import net.minecraftforge.client.model.IQuadTransformer; import it.unimi.dsi.fastutil.Pair; -import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector3f; +import static com.gregtechceu.gtceu.client.model.connected.OctagonalOrientation.*; + public record QuadInfo(TextureAtlasSprite sprite, int tintIndex, Direction direction, boolean shade, boolean ao, int blockLight, int skyLight, Vector3f[] vertices, Vector2f[] uvs, Vector2f minUV, Vector2f maxUV) { // Mapping the different corner indices to their respective dirs - private static final Connection[][] SUBMAP_MAP = new Connection[][] { - { Connection.DOWN, Connection.LEFT, Connection.DOWN_LEFT }, - { Connection.DOWN, Connection.RIGHT, Connection.DOWN_RIGHT }, - { Connection.UP, Connection.RIGHT, Connection.UP_RIGHT }, - { Connection.UP, Connection.LEFT, Connection.UP_LEFT } + private static final OctagonalOrientation[][] SUBMAP_MAP = new OctagonalOrientation[][] { + { BOTTOM, LEFT, BOTTOM_LEFT }, + { BOTTOM, RIGHT, BOTTOM_RIGHT }, + { TOP, RIGHT, TOP_RIGHT }, + { TOP, LEFT, TOP_LEFT } }; public QuadInfo(TextureAtlasSprite sprite, int tintIndex, Direction direction, boolean shade, boolean ao, @@ -91,7 +90,7 @@ public Vector2f[] normalizeUVQuadrant() { public Vector2f[] transformUVData(TextureAtlasSprite other, ISubmap submap) { Vector2f[] normalized = normalizeUVs(); var maxUVs = QuadUtils.findMinMaxUVs(normalized); - submap = submap.normalize(); + submap = submap.unitScale(); float width = maxUVs.second().x() - maxUVs.first().x(); float height = maxUVs.second().y() - maxUVs.first().y(); @@ -104,43 +103,26 @@ public Vector2f[] transformUVData(TextureAtlasSprite other, ISubmap submap) { float maxU = minU + (width * submap.getWidth()); float maxV = minV + (height * submap.getHeight()); - Vector2f[] newUvs = new Vector2f[4]; + Vector2f[] newUVs = new Vector2f[4]; for (int i = 0; i < 4; i++) { Vector2f uv = new Vector2f(this.uvs[i]); - // same as sprite.getX(oldSprite.getXOffset(x)), but we don't multiply and divide in between + // same as sprite.getU(oldSprite.getUOffset(uv.x)), but we don't multiply and divide in between + // NOTE: can be simplified to ^ on 1.21 uv.x = Mth.map(uv.x, this.sprite.getU0(), this.sprite.getU1(), other.getU0(), other.getU1()); uv.y = Mth.map(uv.y, this.sprite.getV0(), this.sprite.getV1(), other.getV0(), other.getV1()); - newUvs[i] = uv; + newUVs[i] = uv; } // FIXME this... isn't all that great. - Vector2f[] newUVs = { - new Vector2f(newUvs[0].x() == this.minUV.x() ? minU : maxU, newUvs[0].y() == this.minUV.y() ? minV : maxV), - new Vector2f(newUvs[1].x() == this.minUV.x() ? minU : maxU, newUvs[1].y() == this.minUV.y() ? minV : maxV), - new Vector2f(newUvs[2].x() == this.minUV.x() ? minU : maxU, newUvs[2].y() == this.minUV.y() ? minV : maxV), - new Vector2f(newUvs[3].x() == this.minUV.x() ? minU : maxU, newUvs[3].y() == this.minUV.y() ? minV : maxV) + newUVs = new Vector2f[] { + new Vector2f(newUVs[0].x() == this.minUV.x() ? minU : maxU, newUVs[0].y() == this.minUV.y() ? minV : maxV), + new Vector2f(newUVs[1].x() == this.minUV.x() ? minU : maxU, newUVs[1].y() == this.minUV.y() ? minV : maxV), + new Vector2f(newUVs[2].x() == this.minUV.x() ? minU : maxU, newUVs[2].y() == this.minUV.y() ? minV : maxV), + new Vector2f(newUVs[3].x() == this.minUV.x() ? minU : maxU, newUVs[3].y() == this.minUV.y() ? minV : maxV) }; return QuadUtils.relativizeUVs(other, newUVs); } - public @Nullable Submap findSubmap(Connections connections) { - Vector2f uv = QuadUtils.normalizeUV(sprite, maxUV); - int xPos = uv.x() <= 0.5f ? 0 : 1; - int yPos = uv.y() <= 0.5f ? 0 : 1; - - Connection[] toConnect = SUBMAP_MAP[xPos + yPos]; - if (connections.connectedOr(toConnect[0], toConnect[1])) { - // If all dirs are connected, we use the fully connected face, the base offset value. - if (!connections.connectedAnd(toConnect)) { - // if a location isn't connected on all sides, the edge submap is at base+2 in the submap table - xPos += connections.contains(toConnect[0]) ? 2 : 0; - yPos += connections.contains(toConnect[1]) ? 2 : 0; - } - return Submap.X4[xPos][yPos]; - } - return null; - } - public Vector2f[] copyUVs() { Vector2f[] result = new Vector2f[uvs.length]; for (int i = 0; i < uvs.length; ++i) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java index 31130f730c3..90960bd6880 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.client.util; -import com.lowdragmc.lowdraglib.client.bakedpipeline.Submap; -import com.lowdragmc.lowdraglib.client.model.custommodel.Connections; +import com.gregtechceu.gtceu.client.model.connected.CTMCache; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -12,6 +11,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.IQuadTransformer; +import it.unimi.dsi.fastutil.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; @@ -62,6 +62,19 @@ public static QuadInfo[] subdivide(BakedQuad baked) { return quad.subdivide(); } + public static Pair findMinMaxUVs(Vector2f[] uvs) { + float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE, maxU = Float.MIN_VALUE, maxV = Float.MIN_VALUE; + + for (int i = 0; i < 4; i++) { + Vector2f uv = uvs[i]; + minU = Math.min(minU, uv.x()); + minV = Math.min(minV, uv.y()); + maxU = Math.max(maxU, uv.x()); + maxV = Math.max(maxV, uv.y()); + } + return Pair.of(new Vector2f(minU, minV), new Vector2f(maxU, maxV)); + } + private static void putVertexData(int[] vertices, int index, Vector3f pos, Vector2f uv) { int posOffset = index * IQuadTransformer.STRIDE + IQuadTransformer.POSITION; vertices[posOffset] = Float.floatToRawIntBits(pos.x()); @@ -108,11 +121,16 @@ public static Vector2f relativizeUV(TextureAtlasSprite sprite, Vector2f vec) { } public static List buildCTMQuads(List quads, BlockAndTintGetter level, BlockPos pos, - @NotNull BlockState state, @Nullable Direction elementSide) { - return buildCTMQuads(Connections.checkConnections(level, pos, state, elementSide), quads); + @NotNull BlockState state, @Nullable Direction side) { + CTMCache ctmCache = CTMCache.getInstance(); + if (side != null) { + ctmCache.getSubmapIds(level, pos, state, side); + } + + return buildCTMQuads(ctmCache, quads); } - public static List buildCTMQuads(Connections connections, List base) { + public static List buildCTMQuads(CTMCache cachedConnections, List base) { List result = new ArrayList<>(); for (BakedQuad originalQuad : base) { TextureAtlasSprite connection = CTM_SPRITE_CACHE.get(originalQuad.getSprite()); @@ -120,18 +138,18 @@ public static List buildCTMQuads(Connections connections, List 15 ? originalQuad.getSprite() : connection; - subdivided[j] = quad.grow().transformUVs(ctmSprite, submap); + subdivided[j] = quad.grow().transformUVs(ctmSprite, CTMCache.uvs[ctm[quadrant]].unitScale()); } } result.addAll(Arrays.stream(subdivided).filter(Objects::nonNull).map(QuadInfo::rebake).toList()); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java b/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java new file mode 100644 index 00000000000..81b8ba41c5a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java @@ -0,0 +1,28 @@ +package com.gregtechceu.gtceu.client.util; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.Material; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.Function; + +public class SpriteFunctionWrapper implements Function { + + private final Function internal; + private final ResourceLocation modelLocation; + + public SpriteFunctionWrapper(Function internal, ResourceLocation modelLocation) { + if (internal instanceof SpriteFunctionWrapper wrapper) { + this.internal = wrapper.internal; + } else { + this.internal = internal; + } + this.modelLocation = modelLocation; + } + + @Override + public TextureAtlasSprite apply(Material material) { + ModelUtils.textureScraped(modelLocation, material); + return internal.apply(material); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java index 33028c2a399..baee251db2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java @@ -97,7 +97,7 @@ private static void registerEventListener(LampBlockItem toWrap) { if (registeredListener) return; registeredListener = true; - ModelUtils.registerBakeEventListener(false, (modelLocation, model, modelBakery) -> { + ModelUtils.registerBakeEventListener(false, (modelLocation, model, unbakedModel, modelBakery) -> { // handle both cases 1.20 can have passed here. 1.21 *only* has the ModelResourceLocation case. ResourceLocation possibleItemId; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java new file mode 100644 index 00000000000..c2587e92896 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java @@ -0,0 +1,29 @@ +package com.gregtechceu.gtceu.core.mixins.client; + +import com.gregtechceu.gtceu.client.util.SpriteFunctionWrapper; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelState; +import net.minecraft.resources.ResourceLocation; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import java.util.function.Function; + +@Mixin(targets = {"net.minecraft.client.resources.model.ModelBakery$ModelBakerImpl"}) +public abstract class ModelBakerImplMixin { + + // Note: We don't remap this method as it's added by forge + @ModifyVariable(at = @At("HEAD"), + method = "bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;", + argsOnly = true, + remap = false) + private Function ldlib$scrapeTextures(Function sprites, + ResourceLocation modelLocation, + ModelState modelState) { + return new SpriteFunctionWrapper(sprites, modelLocation); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java b/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java index 4cf15c7b130..370482a12b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java @@ -1,10 +1,7 @@ package com.gregtechceu.gtceu.integration.modernfix; -import com.gregtechceu.gtceu.client.model.machine.MachineModel; - import com.gregtechceu.gtceu.client.util.AssetEventListener; import com.gregtechceu.gtceu.client.util.ModelUtils; -import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.*; @@ -46,17 +43,10 @@ public void onDynamicResourcesStatusChange(boolean enabled) { public BakedModel onBakedModelLoad(ResourceLocation modelLocation, UnbakedModel baseModel, BakedModel model, ModelState state, ModelBakery bakery, Function textureGetter) { - // run through all model replacers first + // process all model replacers for (var listener : ModelUtils.EVENT_LISTENERS) { if (!(listener.listener() instanceof AssetEventListener.BakedModelReplacement modelReplacement)) continue; - model = modelReplacement.modifyBakedModel(modelLocation, model, bakery); - } - - if (model instanceof CustomBakedModel ctmModel) { - // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins - if (ctmModel.getParent() instanceof MachineModel machineModel) { - return machineModel; - } + model = modelReplacement.modifyBakedModel(modelLocation, model, baseModel, bakery); } return model; } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 5661b433819..200c8d9795b 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -17,6 +17,7 @@ "client.GuiHeartTypeMixin", "client.HumanoidArmorLayerMixin", "client.LevelRendererMixin", + "client.ModelBakerImplMixin", "client.ModelManagerMixin", "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", From 96721b397e2f3ae42b43c5feb39d6669f63d07cc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 11:37:27 +0300 Subject: [PATCH 090/269] Move CTM things to `client.model.ctm` --- src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java | 2 +- .../gtceu/client/model/{ => ctm}/CTMBakedModel.java | 3 +-- .../gtceu/client/model/{connected => ctm}/CTMCache.java | 4 ++-- .../client/model/{connected => ctm}/ConnectionCheck.java | 4 ++-- .../gtceu/client/model/{connected => ctm}/ISubmap.java | 2 +- .../model/{connected => ctm}/OctagonalOrientation.java | 2 +- .../gtceu/client/model/{connected => ctm}/Submap.java | 2 +- .../gtceu/client/model/{connected => ctm}/package-info.java | 2 +- .../java/com/gregtechceu/gtceu/client/util/QuadInfo.java | 6 +++--- .../java/com/gregtechceu/gtceu/client/util/QuadUtils.java | 2 +- 10 files changed, 14 insertions(+), 15 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/model/{ => ctm}/CTMBakedModel.java (96%) rename src/main/java/com/gregtechceu/gtceu/client/model/{connected => ctm}/CTMCache.java (98%) rename src/main/java/com/gregtechceu/gtceu/client/model/{connected => ctm}/ConnectionCheck.java (97%) rename src/main/java/com/gregtechceu/gtceu/client/model/{connected => ctm}/ISubmap.java (98%) rename src/main/java/com/gregtechceu/gtceu/client/model/{connected => ctm}/OctagonalOrientation.java (99%) rename src/main/java/com/gregtechceu/gtceu/client/model/{connected => ctm}/Submap.java (98%) rename src/main/java/com/gregtechceu/gtceu/client/model/{connected => ctm}/package-info.java (56%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index c521efcc894..642db33f11d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; -import com.gregtechceu.gtceu.client.model.CTMBakedModel; +import com.gregtechceu.gtceu.client.model.ctm.CTMBakedModel; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index 5806e3dfec0..23a76d05806 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -1,6 +1,5 @@ -package com.gregtechceu.gtceu.client.model; +package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.client.model.connected.CTMCache; import com.gregtechceu.gtceu.client.util.QuadUtils; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/client/model/connected/CTMCache.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index be75c64be9a..294a4cc8e1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/connected/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.model.connected; +package com.gregtechceu.gtceu.client.model.ctm; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; import org.jetbrains.annotations.Nullable; -import static com.gregtechceu.gtceu.client.model.connected.OctagonalOrientation.*; +import static com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation.*; // @formatter:off /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/ConnectionCheck.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/client/model/connected/ConnectionCheck.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java index afa0242ec85..489ebf6c1c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/connected/ConnectionCheck.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java @@ -1,6 +1,6 @@ -package com.gregtechceu.gtceu.client.model.connected; +package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.client.model.connected.CTMCache.StateComparisonCallback; +import com.gregtechceu.gtceu.client.model.ctm.CTMCache.StateComparisonCallback; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/ISubmap.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/client/model/connected/ISubmap.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java index ccd66874017..4e9716492a9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/connected/ISubmap.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.model.connected; +package com.gregtechceu.gtceu.client.model.ctm; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/OctagonalOrientation.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/model/connected/OctagonalOrientation.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java index 300d90dc3bf..2aa94bf3f17 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/connected/OctagonalOrientation.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.model.connected; +package com.gregtechceu.gtceu.client.model.ctm; import net.createmod.catnip.math.DirectionHelper; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/Submap.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/client/model/connected/Submap.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java index 4d7db40e1b2..bea4f7531d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/connected/Submap.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.model.connected; +package com.gregtechceu.gtceu.client.model.ctm; import lombok.Getter; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/connected/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/package-info.java similarity index 56% rename from src/main/java/com/gregtechceu/gtceu/client/model/connected/package-info.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/package-info.java index a7df99e25f9..ca86d8adbbc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/connected/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/package-info.java @@ -1,4 +1,4 @@ @NotNullByDefault -package com.gregtechceu.gtceu.client.model.connected; +package com.gregtechceu.gtceu.client.model.ctm; import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java b/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java index 9718d5c6451..fe84750b075 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.util; -import com.gregtechceu.gtceu.client.model.connected.ISubmap; -import com.gregtechceu.gtceu.client.model.connected.OctagonalOrientation; +import com.gregtechceu.gtceu.client.model.ctm.ISubmap; +import com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -14,7 +14,7 @@ import org.joml.Vector2f; import org.joml.Vector3f; -import static com.gregtechceu.gtceu.client.model.connected.OctagonalOrientation.*; +import static com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation.*; public record QuadInfo(TextureAtlasSprite sprite, int tintIndex, Direction direction, boolean shade, boolean ao, int blockLight, int skyLight, diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java index 90960bd6880..72b5d52cc59 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.util; -import com.gregtechceu.gtceu.client.model.connected.CTMCache; +import com.gregtechceu.gtceu.client.model.ctm.CTMCache; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; From e86f96520264b917882f310218c56e8394452667 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 11:58:31 +0300 Subject: [PATCH 091/269] Clean up CTMBakedModel#getQuads --- .../gtceu/client/model/ctm/CTMBakedModel.java | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index 23a76d05806..ec1f14c5de8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -36,15 +36,21 @@ public BakedModel getParent() { @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) { + ModelData parentModelData = data.has(PARENT_MODEL_DATA) ? data.get(PARENT_MODEL_DATA) : data; + if (state == null || side == null) { + return super.getQuads(state, side, rand, parentModelData, renderType); + } BlockAndTintGetter level = data.get(LEVEL); BlockPos pos = data.get(POS); - ModelData parentData = data.has(PARENT_MODEL_DATA) ? data.get(PARENT_MODEL_DATA) : data; - - if (level != null && pos != null && state != null) { - return getCustomQuads(level, pos, state, side, rand, parentData, renderType); - } else { - return super.getQuads(state, side, rand, parentData, renderType); + if (level == null || pos == null) { + return super.getQuads(state, side, rand, parentModelData, renderType); } + + CTMCache ctmCache = CTMCache.getInstance(); + ctmCache.getSubmapIds(level, pos, state, side); + return this.sideCache.computeIfAbsent(side, $ -> new ConcurrentHashMap<>()) + .computeIfAbsent(ctmCache, cache -> QuadUtils.buildCTMQuads(cache, + super.getQuads(state, side, rand, parentModelData, renderType))); } @Override @@ -56,18 +62,4 @@ public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState .with(PARENT_MODEL_DATA, parentModelData) .build(); } - - public List getCustomQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, - @Nullable Direction side, RandomSource rand, - ModelData modelData, @Nullable RenderType renderType) { - if (side == null) { - return super.getQuads(state, null, rand, modelData, renderType); - } - - CTMCache ctmCache = CTMCache.getInstance(); - ctmCache.getSubmapIds(level, pos, state, side); - return this.sideCache.computeIfAbsent(side, $ -> new ConcurrentHashMap<>()) - .computeIfAbsent(ctmCache, cache -> QuadUtils.buildCTMQuads(cache, - super.getQuads(state, side, rand, modelData, renderType))); - } } From a15039cd6e977c7efbdc675fd3cf3e90ab2a264f Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:52:14 +0300 Subject: [PATCH 092/269] Remove duplicates of vanilla blockstate properties --- .../api/block/property/GTBlockStateProperties.java | 2 -- .../gregtechceu/gtceu/common/block/LampBlock.java | 14 ++++++-------- .../gtceu/common/data/models/GTModels.java | 7 ++++--- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java b/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java index b0cc876857f..12c81cd9a26 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/property/GTBlockStateProperties.java @@ -13,8 +13,6 @@ public class GTBlockStateProperties { Direction.Plane.VERTICAL); public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); - public static final BooleanProperty BLOOM = BooleanProperty.create("bloom"); - public static final BooleanProperty INVERTED = BooleanProperty.create("inverted"); public static final BooleanProperty NATURAL = BooleanProperty.create("natural"); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java index 881fa053d09..a8614e46927 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.common.block; -import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -34,9 +32,9 @@ @MethodsReturnNonnullByDefault public class LampBlock extends Block { - public static final BooleanProperty BLOOM = GTBlockStateProperties.BLOOM; + public static final BooleanProperty BLOOM = BlockStateProperties.BLOOM; public static final BooleanProperty LIGHT = BlockStateProperties.LIT; - public static final BooleanProperty INVERTED = GTBlockStateProperties.INVERTED; + public static final BooleanProperty INVERTED = BlockStateProperties.INVERTED; public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final String TAG_INVERTED = "inverted"; @@ -56,7 +54,7 @@ public LampBlock(Properties properties, DyeColor color, boolean bordered) { this.color = color; this.bordered = bordered; registerDefaultState(defaultBlockState() - .setValue(GTBlockStateProperties.BLOOM, true) + .setValue(BLOOM, true) .setValue(LIGHT, true) .setValue(INVERTED, false) .setValue(POWERED, false)); @@ -75,7 +73,7 @@ public static boolean isLightEnabled(BlockState state) { } public static boolean isBloomEnabled(BlockState state) { - return state.getValue(GTBlockStateProperties.BLOOM); + return state.getValue(BLOOM); } public static boolean isInverted(CompoundTag tag) { @@ -92,7 +90,7 @@ public static boolean isBloomEnabled(CompoundTag tag) { public CompoundTag getTagFromState(BlockState state) { CompoundTag tag = new CompoundTag(); - tag.putBoolean(TAG_BLOOM, state.getValue(GTBlockStateProperties.BLOOM)); + tag.putBoolean(TAG_BLOOM, state.getValue(BLOOM)); tag.putBoolean(TAG_LIT, state.getValue(LIGHT)); tag.putBoolean(TAG_INVERTED, state.getValue(INVERTED)); return tag; @@ -110,7 +108,7 @@ public ItemStack getStackFromIndex(int i) { @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder.add(INVERTED, GTBlockStateProperties.BLOOM, LIGHT, POWERED)); + super.createBlockStateDefinition(builder.add(INVERTED, BLOOM, LIGHT, POWERED)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java index 6065874b12c..3f425bb11c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java @@ -23,6 +23,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.material.Fluid; import net.minecraftforge.client.model.generators.*; @@ -94,17 +95,17 @@ public static NonNullBiConsumer, RegistrateBloc if (state.getValue(LampBlock.LIGHT)) { ModelBuilder model = prov.models() .getBuilder(ctx.getName() + - (state.getValue(GTBlockStateProperties.BLOOM) ? "_bloom" : "")) + (state.getValue(BlockStateProperties.BLOOM) ? "_bloom" : "")) .parent(parentOn); if (border) { model.texture("active", "block/lamps/" + color.getName()); - if (state.getValue(GTBlockStateProperties.BLOOM)) { + if (state.getValue(BlockStateProperties.BLOOM)) { model.texture("active_overlay", "block/lamps/" + color.getName() + "_emissive"); } else { model.texture("active_overlay", "block/lamps/" + color.getName()); } } else { - if (state.getValue(GTBlockStateProperties.BLOOM)) { + if (state.getValue(BlockStateProperties.BLOOM)) { model.texture("active", "block/lamps/" + color.getName() + "_borderless_emissive"); } else { From 04c9cb085350d972b15c0668420c0b89bb0fec4b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:20:36 +0300 Subject: [PATCH 093/269] Reuse existing code instead of copypasting the same stuff over and over and --- .../gtceu/common/block/LampBlock.java | 56 +++++++++---------- .../gtceu/common/data/models/GTModels.java | 30 +++++----- 2 files changed, 39 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java index a8614e46927..b1963400c8d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java @@ -39,12 +39,11 @@ public class LampBlock extends Block { public static final String TAG_INVERTED = "inverted"; public static final String TAG_BLOOM = "bloom"; - public static final String TAG_LIT = "lit"; + public static final String TAG_LIGHT = "lit"; - public static final int BLOOM_FLAG = 1; - public static final int LIGHT_FLAG = 2; - public static final int INVERTED_FLAG = 4; - public static final int POWERED_FLAG = 8; + public static final int BLOOM_FLAG = 0b001; + public static final int LIGHT_FLAG = 0b010; + public static final int INVERTED_FLAG = 0b100; public final DyeColor color; public final boolean bordered; @@ -61,7 +60,7 @@ public LampBlock(Properties properties, DyeColor color, boolean bordered) { } public static boolean isLightActive(BlockState state) { - return state.getValue(INVERTED) != state.getValue(POWERED); + return isInverted(state) != state.getValue(POWERED); } public static boolean isInverted(BlockState state) { @@ -81,7 +80,7 @@ public static boolean isInverted(CompoundTag tag) { } public static boolean isLightEnabled(CompoundTag tag) { - return tag.getBoolean(TAG_LIT); + return tag.getBoolean(TAG_LIGHT); } public static boolean isBloomEnabled(CompoundTag tag) { @@ -91,16 +90,16 @@ public static boolean isBloomEnabled(CompoundTag tag) { public CompoundTag getTagFromState(BlockState state) { CompoundTag tag = new CompoundTag(); tag.putBoolean(TAG_BLOOM, state.getValue(BLOOM)); - tag.putBoolean(TAG_LIT, state.getValue(LIGHT)); + tag.putBoolean(TAG_LIGHT, state.getValue(LIGHT)); tag.putBoolean(TAG_INVERTED, state.getValue(INVERTED)); return tag; } public ItemStack getStackFromIndex(int i) { CompoundTag tag = new CompoundTag(); - tag.putBoolean(LampBlock.TAG_INVERTED, (i & LampBlock.INVERTED_FLAG) == 0); - tag.putBoolean(LampBlock.TAG_BLOOM, (i & LampBlock.BLOOM_FLAG) == 0); - tag.putBoolean(LampBlock.TAG_LIT, (i & LampBlock.LIGHT_FLAG) == 0); + tag.putBoolean(LampBlock.TAG_INVERTED, (i & LampBlock.INVERTED_FLAG) != 0); + tag.putBoolean(LampBlock.TAG_BLOOM, (i & LampBlock.BLOOM_FLAG) != 0); + tag.putBoolean(LampBlock.TAG_LIGHT, (i & LampBlock.LIGHT_FLAG) != 0); ItemStack stack = new ItemStack(this); stack.setTag(tag); return stack; @@ -108,12 +107,12 @@ public ItemStack getStackFromIndex(int i) { @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder.add(INVERTED, BLOOM, LIGHT, POWERED)); + builder.add(INVERTED, BLOOM, LIGHT, POWERED); } @Override public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { - return state.getValue(LIGHT) && isLightActive(state) ? 15 : 0; + return isLightEnabled(state) && isLightActive(state) ? 15 : 0; } @Override @@ -122,14 +121,18 @@ public BlockState getAppearance(BlockState state, BlockAndTintGetter level, Bloc return state.getBlock().defaultBlockState(); } + public void update(BlockState state, Level level, BlockPos pos) { + if (state.getValue(POWERED) != level.hasNeighborSignal(pos)) { + level.setBlock(pos, state.cycle(POWERED), + state.getValue(LIGHT) ? Block.UPDATE_ALL_IMMEDIATE : Block.UPDATE_ALL); + } + } + @Override @SuppressWarnings("deprecation") public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { if (!level.isClientSide) { - boolean powered = state.getValue(POWERED); - if (powered != level.hasNeighborSignal(pos)) { - level.setBlock(pos, state.setValue(POWERED, !powered), state.getValue(LIGHT) ? 2 | 8 : 2); - } + update(state, level, pos); } super.onPlace(state, level, pos, oldState, movedByPiston); } @@ -139,19 +142,14 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldS public void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { if (!level.isClientSide) { - boolean powered = state.getValue(POWERED); - if (powered != level.hasNeighborSignal(pos)) { - level.setBlock(pos, state.setValue(POWERED, !powered), state.getValue(LIGHT) ? 2 | 8 : 2); - } + update(state, level, pos); } } @Override @SuppressWarnings("deprecation") public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { - if (state.getValue(POWERED) && !level.hasNeighborSignal(pos)) { - level.setBlock(pos, state.cycle(POWERED), state.getValue(LIGHT) ? 2 | 8 : 2); - } + update(state, level, pos); } @Override @@ -167,12 +165,10 @@ public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List contex public static NonNullBiConsumer, RegistrateBlockstateProvider> lampModel(DyeColor color, boolean border) { return (ctx, prov) -> { + final String colorName = color.getSerializedName(); final String borderPart = (border ? "" : "_borderless"); ModelFile parentOn = prov.models().getExistingFile(prov.modLoc("block/lamp" + borderPart)); ModelFile parentOff = prov.models().getExistingFile(prov.modLoc("block/lamp" + borderPart + "_off")); prov.getVariantBuilder(ctx.getEntry()) - .forAllStates(state -> { - if (state.getValue(LampBlock.LIGHT)) { + .forAllStatesExcept(state -> { + if (LampBlock.isLightActive(state)) { ModelBuilder model = prov.models() - .getBuilder(ctx.getName() + - (state.getValue(BlockStateProperties.BLOOM) ? "_bloom" : "")) + .getBuilder(ctx.getName() + (state.getValue(LampBlock.BLOOM) ? "_bloom" : "")) .parent(parentOn); if (border) { - model.texture("active", "block/lamps/" + color.getName()); - if (state.getValue(BlockStateProperties.BLOOM)) { - model.texture("active_overlay", "block/lamps/" + color.getName() + "_emissive"); + model.texture("active", "block/lamps/" + colorName); + if (state.getValue(LampBlock.BLOOM)) { + model.texture("active_overlay", "block/lamps/" + colorName + "_emissive"); } else { - model.texture("active_overlay", "block/lamps/" + color.getName()); + model.texture("active_overlay", "block/lamps/" + colorName); } } else { - if (state.getValue(BlockStateProperties.BLOOM)) { - model.texture("active", - "block/lamps/" + color.getName() + "_borderless_emissive"); + if (state.getValue(LampBlock.BLOOM)) { + model.texture("active", "block/lamps/" + colorName + "_borderless_emissive"); } else { - model.texture("active", - "block/lamps/" + color.getName() + "_borderless"); + model.texture("active", "block/lamps/" + colorName + "_borderless"); } } return ConfiguredModel.builder() @@ -121,11 +118,10 @@ public static NonNullBiConsumer, RegistrateBloc .modelFile(prov.models() .getBuilder(ctx.getName() + "_off") .parent(parentOff) - .texture("inactive", - "block/lamps/" + color.getName() + "_off" + borderPart)) + .texture("inactive", "block/lamps/" + colorName + "_off" + borderPart)) .build(); } - }); + }, LampBlock.LIGHT); }; } From 968b5d70e73bfbe917937237fe0c8d3666baa9ef Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:21:08 +0300 Subject: [PATCH 094/269] Datagen --- .../blockstates/black_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/black_lamp.json | 40 ++++--------------- .../blockstates/blue_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/blue_lamp.json | 40 ++++--------------- .../blockstates/brown_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/brown_lamp.json | 40 ++++--------------- .../blockstates/cyan_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/cyan_lamp.json | 40 ++++--------------- .../blockstates/gray_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/gray_lamp.json | 40 ++++--------------- .../blockstates/green_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/green_lamp.json | 40 ++++--------------- .../light_blue_borderless_lamp.json | 40 ++++--------------- .../gtceu/blockstates/light_blue_lamp.json | 40 ++++--------------- .../light_gray_borderless_lamp.json | 40 ++++--------------- .../gtceu/blockstates/light_gray_lamp.json | 40 ++++--------------- .../blockstates/lime_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/lime_lamp.json | 40 ++++--------------- .../blockstates/magenta_borderless_lamp.json | 40 ++++--------------- .../gtceu/blockstates/magenta_lamp.json | 40 ++++--------------- .../blockstates/orange_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/orange_lamp.json | 40 ++++--------------- .../blockstates/pink_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/pink_lamp.json | 40 ++++--------------- .../blockstates/purple_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/purple_lamp.json | 40 ++++--------------- .../blockstates/red_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/red_lamp.json | 40 ++++--------------- .../blockstates/white_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/white_lamp.json | 40 ++++--------------- .../blockstates/yellow_borderless_lamp.json | 40 ++++--------------- .../assets/gtceu/blockstates/yellow_lamp.json | 40 ++++--------------- 32 files changed, 256 insertions(+), 1024 deletions(-) diff --git a/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json index 65fa8c3d44e..2653760bdab 100644 --- a/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/black_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/black_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/black_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/black_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/black_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/black_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/black_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/black_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/black_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/black_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/black_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/black_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/black_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/black_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/black_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/black_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/black_lamp.json b/src/generated/resources/assets/gtceu/blockstates/black_lamp.json index cd4e0f92574..2ec244991e9 100644 --- a/src/generated/resources/assets/gtceu/blockstates/black_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/black_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/black_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/black_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/black_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/black_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/black_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/black_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/black_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/black_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/black_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/black_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/black_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/black_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/black_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/black_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/black_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/black_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json index 45abae047a8..cf0137a72f6 100644 --- a/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/blue_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/blue_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/blue_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/blue_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/blue_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/blue_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/blue_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/blue_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/blue_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/blue_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/blue_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/blue_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/blue_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/blue_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/blue_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/blue_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json b/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json index 5ccc078cfcb..551d3d7ea75 100644 --- a/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/blue_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/blue_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/blue_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/blue_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/blue_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/blue_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/blue_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/blue_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/blue_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/blue_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/blue_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/blue_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/blue_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/blue_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/blue_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/blue_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json index d8b79bb47b1..648d1fc0c31 100644 --- a/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/brown_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/brown_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/brown_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/brown_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/brown_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/brown_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/brown_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/brown_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/brown_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/brown_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/brown_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/brown_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/brown_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/brown_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/brown_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/brown_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json b/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json index 7209c021b21..416b65492b9 100644 --- a/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/brown_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/brown_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/brown_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/brown_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/brown_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/brown_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/brown_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/brown_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/brown_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/brown_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/brown_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/brown_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/brown_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/brown_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/brown_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/brown_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json index 5d8399dd750..dcc9951a482 100644 --- a/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/cyan_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/cyan_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/cyan_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/cyan_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/cyan_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/cyan_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/cyan_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/cyan_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/cyan_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/cyan_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/cyan_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/cyan_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/cyan_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/cyan_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/cyan_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/cyan_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json b/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json index 99f8b154d65..f99b1adf611 100644 --- a/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/cyan_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/cyan_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/cyan_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/cyan_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/cyan_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/cyan_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/cyan_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/cyan_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/cyan_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/cyan_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/cyan_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/cyan_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/cyan_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/cyan_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/cyan_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/cyan_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json index 5edfd0e79ec..90e7a09ad9b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/gray_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/gray_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/gray_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/gray_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/gray_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/gray_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/gray_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/gray_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/gray_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/gray_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/gray_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/gray_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/gray_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/gray_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/gray_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/gray_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json b/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json index 2a297aa3b1a..fe235c636c8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/gray_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/gray_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/gray_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/gray_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/gray_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/gray_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/gray_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/gray_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/gray_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/gray_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/gray_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/gray_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/gray_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/gray_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/gray_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/gray_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json index 20aa48033b5..2ba1217b905 100644 --- a/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/green_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/green_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/green_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/green_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/green_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/green_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/green_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/green_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/green_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/green_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/green_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/green_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/green_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/green_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/green_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/green_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/green_lamp.json b/src/generated/resources/assets/gtceu/blockstates/green_lamp.json index d3fc044531e..a399f46cc5b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/green_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/green_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/green_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/green_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/green_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/green_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/green_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/green_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/green_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/green_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/green_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/green_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/green_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/green_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/green_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/green_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/green_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/green_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json index 3b2d626b772..04a4c1c3598 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/light_blue_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/light_blue_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/light_blue_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/light_blue_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_blue_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/light_blue_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_blue_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/light_blue_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_blue_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_blue_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/light_blue_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/light_blue_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json index 789777c4058..5efb2370466 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/light_blue_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/light_blue_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/light_blue_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/light_blue_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_blue_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/light_blue_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_blue_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_blue_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_blue_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/light_blue_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_blue_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_blue_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_blue_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/light_blue_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/light_blue_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/light_blue_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json index 25408c7c723..35a06427bfc 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/light_gray_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/light_gray_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/light_gray_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/light_gray_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_gray_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/light_gray_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_gray_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/light_gray_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_gray_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_gray_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/light_gray_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/light_gray_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json index 077535ad407..1273f8861b2 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/light_gray_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/light_gray_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/light_gray_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/light_gray_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_gray_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/light_gray_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_gray_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_gray_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_gray_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/light_gray_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_gray_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_gray_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/light_gray_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/light_gray_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/light_gray_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/light_gray_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json index b48cdc08daa..609090bca1a 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/lime_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/lime_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/lime_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/lime_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/lime_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/lime_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/lime_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/lime_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/lime_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/lime_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/lime_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/lime_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/lime_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/lime_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/lime_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/lime_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json b/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json index d36a7c3e3a1..004a8210c98 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/lime_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/lime_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/lime_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/lime_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/lime_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/lime_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/lime_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/lime_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/lime_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/lime_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/lime_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/lime_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/lime_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/lime_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/lime_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/lime_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json index 4c25a94fcdb..662ea54a7d9 100644 --- a/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/magenta_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/magenta_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/magenta_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/magenta_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/magenta_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/magenta_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/magenta_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/magenta_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/magenta_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/magenta_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/magenta_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/magenta_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/magenta_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/magenta_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/magenta_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/magenta_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json b/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json index e3bfd66936c..709aa6b8536 100644 --- a/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/magenta_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/magenta_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/magenta_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/magenta_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/magenta_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/magenta_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/magenta_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/magenta_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/magenta_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/magenta_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/magenta_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/magenta_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/magenta_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/magenta_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/magenta_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/magenta_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json index c82a39e4c91..8d3f051ad00 100644 --- a/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/orange_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/orange_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/orange_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/orange_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/orange_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/orange_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/orange_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/orange_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/orange_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/orange_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/orange_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/orange_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/orange_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/orange_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/orange_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/orange_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json b/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json index d4f1841d14e..fe41b1e40a8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/orange_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/orange_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/orange_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/orange_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/orange_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/orange_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/orange_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/orange_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/orange_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/orange_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/orange_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/orange_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/orange_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/orange_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/orange_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/orange_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json index 277ac18c6bb..4a417644bef 100644 --- a/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/pink_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/pink_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/pink_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/pink_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/pink_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/pink_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/pink_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/pink_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/pink_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/pink_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/pink_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/pink_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/pink_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/pink_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/pink_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/pink_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json b/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json index a480a15edff..139d3938687 100644 --- a/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/pink_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/pink_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/pink_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/pink_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/pink_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/pink_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/pink_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/pink_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/pink_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/pink_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/pink_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/pink_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/pink_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/pink_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/pink_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/pink_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json index 9328f5d1855..9061ec60bfd 100644 --- a/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/purple_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/purple_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/purple_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/purple_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/purple_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/purple_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/purple_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/purple_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/purple_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/purple_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/purple_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/purple_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/purple_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/purple_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/purple_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/purple_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json b/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json index 0ea9e2c4bc8..a2b8df6d91d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/purple_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/purple_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/purple_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/purple_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/purple_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/purple_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/purple_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/purple_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/purple_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/purple_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/purple_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/purple_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/purple_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/purple_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/purple_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/purple_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json index a89947daaa0..f34d00b2679 100644 --- a/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/red_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/red_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/red_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/red_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/red_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/red_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/red_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/red_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/red_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/red_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/red_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/red_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/red_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/red_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/red_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/red_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/red_lamp.json b/src/generated/resources/assets/gtceu/blockstates/red_lamp.json index 5c68690f6bb..ed2b42645b0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/red_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/red_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/red_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/red_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/red_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/red_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/red_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/red_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/red_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/red_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/red_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/red_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/red_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/red_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/red_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/red_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/red_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/red_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json index 329c333d42e..4445a730db2 100644 --- a/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/white_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/white_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/white_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/white_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/white_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/white_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/white_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/white_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/white_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/white_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/white_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/white_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/white_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/white_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/white_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/white_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/white_lamp.json b/src/generated/resources/assets/gtceu/blockstates/white_lamp.json index 38298650c47..285658d5da1 100644 --- a/src/generated/resources/assets/gtceu/blockstates/white_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/white_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/white_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/white_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/white_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/white_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/white_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/white_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/white_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/white_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/white_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/white_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/white_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/white_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/white_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/white_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/white_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/white_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json index cdf49a3e281..7260b08a785 100644 --- a/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/yellow_borderless_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/yellow_borderless_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/yellow_borderless_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/yellow_borderless_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/yellow_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/yellow_borderless_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/yellow_borderless_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/yellow_borderless_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/yellow_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/yellow_borderless_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/yellow_borderless_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/yellow_borderless_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/yellow_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/yellow_borderless_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/yellow_borderless_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/yellow_borderless_lamp_bloom" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json b/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json index 43509ebf6a3..2baa9b42b3f 100644 --- a/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json @@ -1,52 +1,28 @@ { "variants": { - "bloom=false,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=false,powered=false": { "model": "gtceu:block/yellow_lamp_off" }, - "bloom=false,inverted=false,lit=false,powered=true": { - "model": "gtceu:block/yellow_lamp_off" - }, - "bloom=false,inverted=false,lit=true,powered=false": { - "model": "gtceu:block/yellow_lamp" - }, - "bloom=false,inverted=false,lit=true,powered=true": { - "model": "gtceu:block/yellow_lamp" - }, - "bloom=false,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/yellow_lamp_off" - }, - "bloom=false,inverted=true,lit=false,powered=true": { - "model": "gtceu:block/yellow_lamp_off" - }, - "bloom=false,inverted=true,lit=true,powered=false": { + "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/yellow_lamp" }, - "bloom=false,inverted=true,lit=true,powered=true": { + "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/yellow_lamp" }, - "bloom=true,inverted=false,lit=false,powered=false": { + "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/yellow_lamp_off" }, - "bloom=true,inverted=false,lit=false,powered=true": { + "bloom=true,inverted=false,powered=false": { "model": "gtceu:block/yellow_lamp_off" }, - "bloom=true,inverted=false,lit=true,powered=false": { + "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/yellow_lamp_bloom" }, - "bloom=true,inverted=false,lit=true,powered=true": { + "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/yellow_lamp_bloom" }, - "bloom=true,inverted=true,lit=false,powered=false": { - "model": "gtceu:block/yellow_lamp_off" - }, - "bloom=true,inverted=true,lit=false,powered=true": { + "bloom=true,inverted=true,powered=true": { "model": "gtceu:block/yellow_lamp_off" - }, - "bloom=true,inverted=true,lit=true,powered=false": { - "model": "gtceu:block/yellow_lamp_bloom" - }, - "bloom=true,inverted=true,lit=true,powered=true": { - "model": "gtceu:block/yellow_lamp_bloom" } } } \ No newline at end of file From 3d21cdf755ddb3cd4450b843ee7f1dd46ec40b90 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 12:39:56 +0300 Subject: [PATCH 095/269] Move quad utils to `client.util.quad` --- .../gregtechceu/gtceu/client/model/TextureOverrideModel.java | 2 +- .../com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java | 2 +- .../gregtechceu/gtceu/client/model/machine/MachineModel.java | 4 ++-- .../gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java | 2 +- .../gtceu/client/renderer/cover/FacadeCoverRenderer.java | 4 ++-- .../gtceu/client/renderer/cover/IOCoverRenderer.java | 2 +- .../gtceu/client/renderer/cover/SimpleCoverRenderer.java | 2 +- .../gtceu/client/util/{ => quad}/GTQuadTransformers.java | 2 +- .../gregtechceu/gtceu/client/util/{ => quad}/QuadInfo.java | 2 +- .../gregtechceu/gtceu/client/util/{ => quad}/QuadUtils.java | 2 +- .../gtceu/client/util/{ => quad}/StaticFaceBakery.java | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/util/{ => quad}/GTQuadTransformers.java (99%) rename src/main/java/com/gregtechceu/gtceu/client/util/{ => quad}/QuadInfo.java (99%) rename src/main/java/com/gregtechceu/gtceu/client/util/{ => quad}/QuadUtils.java (99%) rename src/main/java/com/gregtechceu/gtceu/client/util/{ => quad}/StaticFaceBakery.java (99%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java index 652d19bbba8..0b34bcf432b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.model; -import com.gregtechceu.gtceu.client.util.GTQuadTransformers; +import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index ec1f14c5de8..a172baec992 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.client.util.QuadUtils; +import com.gregtechceu.gtceu.client.util.quad.QuadUtils; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; 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 803f4094a5a..5b15c2087f6 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 @@ -12,8 +12,8 @@ import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartBakedModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; -import com.gregtechceu.gtceu.client.util.QuadUtils; -import com.gregtechceu.gtceu.client.util.StaticFaceBakery; +import com.gregtechceu.gtceu.client.util.quad.QuadUtils; +import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java index 3553bd37510..a4bd08d99b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.client.model.GTModelProperties; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; -import com.gregtechceu.gtceu.client.util.GTQuadTransformers; +import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java index ce935bc334a..a5f833941d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java @@ -6,8 +6,8 @@ import com.gregtechceu.gtceu.client.model.ItemBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; import com.gregtechceu.gtceu.client.util.FacadeBlockAndTintGetter; -import com.gregtechceu.gtceu.client.util.GTQuadTransformers; -import com.gregtechceu.gtceu.client.util.StaticFaceBakery; +import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; +import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.cover.FacadeCover; import com.gregtechceu.gtceu.common.item.behavior.FacadeItemBehaviour; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java index 28f0c8d5cc9..da7c4336a31 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.IIOCover; import com.gregtechceu.gtceu.client.util.ModelUtils; -import com.gregtechceu.gtceu.client.util.StaticFaceBakery; +import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java index 472597cafcd..ab2913318c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.client.util.ModelUtils; -import com.gregtechceu.gtceu.client.util.StaticFaceBakery; +import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GTQuadTransformers.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java rename to src/main/java/com/gregtechceu/gtceu/client/util/quad/GTQuadTransformers.java index 7b6d077d821..ccb3dd07099 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/GTQuadTransformers.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GTQuadTransformers.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util; +package com.gregtechceu.gtceu.client.util.quad; import net.minecraft.client.renderer.FaceInfo; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadInfo.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java rename to src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadInfo.java index fe84750b075..3b65c349ba0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/QuadInfo.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadInfo.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util; +package com.gregtechceu.gtceu.client.util.quad; import com.gregtechceu.gtceu.client.model.ctm.ISubmap; import com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java rename to src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 72b5d52cc59..2aa41be3880 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util; +package com.gregtechceu.gtceu.client.util.quad; import com.gregtechceu.gtceu.client.model.ctm.CTMCache; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/StaticFaceBakery.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/StaticFaceBakery.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/util/StaticFaceBakery.java rename to src/main/java/com/gregtechceu/gtceu/client/util/quad/StaticFaceBakery.java index dd7b1c9a7c0..200eee8b51a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/StaticFaceBakery.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/StaticFaceBakery.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util; +package com.gregtechceu.gtceu.client.util.quad; import com.lowdragmc.lowdraglib.client.bakedpipeline.FaceQuad; From 75c5a96779d9270d3ec8f5058a768507ef892479 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:23:51 +0300 Subject: [PATCH 096/269] Rename `ModelUtils` to `ModelEventHelper` and move unrelated utility methods out of it --- .../gtceu/api/machine/MetaMachine.java | 10 ++- .../gregtechceu/gtceu/client/ClientProxy.java | 65 ++++++++++++++++++- .../client/model/machine/MachineModel.java | 3 +- .../client/model/pipe/BakedPipeModel.java | 3 +- .../renderer/block/LampItemRenderer.java | 6 +- .../renderer/cover/FacadeCoverRenderer.java | 16 ++++- .../renderer/cover/IOCoverRenderer.java | 4 +- .../renderer/cover/SimpleCoverRenderer.java | 4 +- .../machine/impl/BoilerMultiPartRender.java | 8 +-- ...{ModelUtils.java => ModelEventHelper.java} | 30 +-------- .../gtceu/client/util/RenderUtil.java | 4 ++ .../client/util/SpriteFunctionWrapper.java | 2 +- .../gtceu/client/util/quad/QuadUtils.java | 2 +- .../gtceu/common/item/LampBlockItem.java | 7 +- .../modernfix/GTModernFixIntegration.java | 4 +- .../gtceu/utils/GTStringUtils.java | 17 +++++ 16 files changed, 124 insertions(+), 61 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/util/{ModelUtils.java => ModelEventHelper.java} (88%) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index b6564371097..455502a441f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -38,7 +38,7 @@ import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.cover.FluidFilterCover; import com.gregtechceu.gtceu.common.cover.ItemFilterCover; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; @@ -46,6 +46,7 @@ import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; +import com.gregtechceu.gtceu.utils.GTStringUtils; import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -53,8 +54,6 @@ import com.lowdragmc.lowdraglib.utils.DummyWorld; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -615,7 +614,7 @@ public void addDebugOverlayText(Consumer lines) { // add render state info MachineRenderState renderState = this.getRenderState(); for (var property : renderState.getValues().entrySet()) { - lines.accept(ModelUtils.getPropertyValueString(property)); + lines.accept(GTStringUtils.getPropertyValueString(property)); } } @@ -847,8 +846,7 @@ public int getDefaultPaintingColor() { @OnlyIn(Dist.CLIENT) @Override public AABB getRenderBoundingBox() { - BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer(); - BakedModel model = blockRenderDispatcher.getBlockModel(this.getBlockState()); + BakedModel model = RenderUtil.getModelForState(this.getBlockState()); if (model instanceof IBlockEntityRendererBakedModel modelWithBER) { if (modelWithBER.getBlockEntityType() == this.getType()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 642db33f11d..b09008d5c95 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -31,7 +31,7 @@ import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderManager; import com.gregtechceu.gtceu.client.renderer.machine.impl.*; import com.gregtechceu.gtceu.client.renderer.machine.impl.BoilerMultiPartRender; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.ModelEventHelper; import com.gregtechceu.gtceu.common.CommonEventListener; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; @@ -191,8 +191,67 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); // register CTM model (un)wrapper - ModelUtils.registerBakeEventListener(false, (modelLocation, model, rootModel, modelBakery) -> { - if (model == null) return null; + ModelEventUtils.registerBakeEventListener(false, (modelLocation, baked, rootModel, modelBakery) -> { + if (!(modelLocation instanceof ModelResourceLocation) || baked instanceof CTMBakedModel || baked.isCustomRenderer()) { + return baked; + } + Deque dependencies = new ArrayDeque<>(); + Set seenModels = new HashSet<>(); + dependencies.push(modelLocation); + seenModels.add(modelLocation); + + // each model is (should be) processed once, so caching what models have been wrapped is a waste of RAM, + // especially when the cache is only updated after wrapping a model + boolean shouldWrap = false; + Set> errors = new HashSet<>(); + // Breadth-first loop through dependencies, exiting as soon as a CTM texture is found, + // and skipping duplicates/cycles + PARENT_LOOP: + while (!shouldWrap && !dependencies.isEmpty()) { + ResourceLocation dep = dependencies.pop(); + UnbakedModel model; + try { + model = dep == modelLocation ? rootModel : modelBakery.getModel(dep); + } catch (Exception e) { + continue; + } + + // have to copy because the set is updated during this loop + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") + Set textures = new HashSet<>(ModelEventUtils.getModelUsedCTMTextures(dep)); + for (Material tex : textures) { + IMetadataSectionCTM meta = null; + // Cache all dependent texture metadata + // TODO make lazy + try { + meta = ResourceUtil.getMetadata(ResourceUtil.spriteToAbsolute(tex.texture())).orElse(null); + } catch (IOException ignored) {} // Fallthrough + if (meta != null) { + // At least one texture has CTM metadata, so we should wrap this model + shouldWrap = true; + break PARENT_LOOP; + } + } + // shouldWrap is always false here because of the `break` above + Collection newDependencies = model.getDependencies(); + for (ResourceLocation newDep : newDependencies) { + if (seenModels.add(newDep)) { + dependencies.push(newDep); + } + } + } + if (shouldWrap) { + try { + baked = new CTMBakedModel<>(baked); + handleInit(modelLocation, baked, bakery); + dependencies.clear(); + } catch (IOException e) { + GTCEu.LOGGER.error("Could not wrap model {}. Aborting...", modelLocation, e); + } + } + return baked; + + if (baked == null) return null; // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins if (model instanceof CustomBakedModel ctmModel) { 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 5b15c2087f6..2d556585382 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 @@ -12,6 +12,7 @@ import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartBakedModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.client.util.quad.QuadUtils; import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.data.models.GTModels; @@ -297,7 +298,7 @@ public List replacePartBaseModel(List originalQuads, IMult var controllers = part.getControllers(); for (MultiblockControllerMachine controller : controllers) { var state = controller.getBlockState(); - BakedModel model = Minecraft.getInstance().getBlockRenderer().getBlockModel(state); + BakedModel model = RenderUtil.getModelForState(state); List newQuads = null; // spotless:off diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java index a4bd08d99b5..cb8e67085b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.client.model.GTModelProperties; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.utils.GTUtil; @@ -103,7 +104,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction return quads; } BlockState frameState = frameBlockEntry.getDefaultState(); - BakedModel frameModel = Minecraft.getInstance().getBlockRenderer().getBlockModel(frameState); + BakedModel frameModel = RenderUtil.getModelForState(frameState); modelData = frameModel.getModelData(level, pos, frameState, modelData); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java index 268af12e43c..ee64e9830b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java @@ -1,11 +1,11 @@ package com.gregtechceu.gtceu.client.renderer.block; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.item.LampBlockItem; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.world.item.ItemDisplayContext; @@ -32,13 +32,11 @@ public static LampItemRenderer getInstance() { } protected final ItemRenderer itemRenderer; - protected final BlockRenderDispatcher blockRenderer; protected LampItemRenderer() { super(Minecraft.getInstance().getBlockEntityRenderDispatcher(), Minecraft.getInstance().getEntityModels()); this.itemRenderer = Minecraft.getInstance().getItemRenderer(); - this.blockRenderer = Minecraft.getInstance().getBlockRenderer(); } @Override @@ -49,7 +47,7 @@ public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext d return; } BlockState state = item.getStateFromStack(stack, null); - BakedModel p_model = blockRenderer.getBlockModel(state); + BakedModel p_model = RenderUtil.getModelForState(state); for (var model : p_model.getRenderPasses(stack, true)) { for (var rendertype : model.getRenderTypes(stack, true)) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java index a5f833941d9..c5d1094b28f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.client.model.ItemBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; import com.gregtechceu.gtceu.client.util.FacadeBlockAndTintGetter; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.cover.FacadeCover; @@ -187,14 +188,23 @@ public void renderCover(List quads, Direction side, RandomSource rand Direction attachedSide = coverBehavior.attachedSide; - BakedModel model = Minecraft.getInstance().getBlockRenderer().getBlockModel(state); - ModelData extraData = model.getModelData(level, pos, state, modelData); + BakedModel model = RenderUtil.getModelForState(state); + ModelData facadeModelData = model.getModelData(level, pos, state, modelData); - List facadeQuads = model.getQuads(state, attachedSide, rand, extraData, renderType); + + if (renderType != null && !facadeModel.getRenderTypes(facadeState, rand, facadeModelData).contains(renderType)) { + return; + } + + List facadeQuads = model.getQuads(state, attachedSide, rand, facadeModelData, renderType); facadeQuads = new LinkedList<>(facadeQuads); List coverQuads = new ArrayList<>(); if (side == attachedSide) { + for (BakedQuad quad : facadeQuads) { + // clamp the facade quads' vertices into the model + coverQuads.add(FACADE_PLANE_TRANSFORMER.process(quad)); + } coverQuads.addAll(facadeQuads); } else if (side == null && coverBehavior.coverHolder.shouldRenderBackSide()) { AABB cube = COVER_BACK_CUBES.get(attachedSide); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java index da7c4336a31..317e5e10285 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.IIOCover; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.ModelEventHelper; import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import net.minecraft.client.renderer.RenderType; @@ -46,7 +46,7 @@ public IOCoverRenderer(@Nullable ResourceLocation overlay, @Nullable ResourceLocation invertedOverlay, @Nullable ResourceLocation emissiveOverlay, @Nullable ResourceLocation invertedEmissiveOverlay) { - ModelUtils.registerAtlasStitchedEventListener(false, InventoryMenu.BLOCK_ATLAS, event -> { + ModelEventHelper.registerAtlasStitchedEventListener(false, InventoryMenu.BLOCK_ATLAS, event -> { var atlas = event.getAtlas(); if (overlay != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java index ab2913318c6..a7ae78de074 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.renderer.cover; import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.ModelEventHelper; import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import net.minecraft.client.renderer.RenderType; @@ -34,7 +34,7 @@ public SimpleCoverRenderer(ResourceLocation texture) { } public SimpleCoverRenderer(ResourceLocation texture, ResourceLocation emissiveTexture) { - ModelUtils.registerAtlasStitchedEventListener(false, InventoryMenu.BLOCK_ATLAS, event -> { + ModelEventHelper.registerAtlasStitchedEventListener(false, InventoryMenu.BLOCK_ATLAS, event -> { var atlas = event.getAtlas(); sprite = atlas.getSprite(texture); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java index dc4dcd9b5c4..f450e986b41 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.client.model.machine.IControllerModelRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.common.block.BoilerFireboxType; import com.gregtechceu.gtceu.common.data.GTBlocks; @@ -96,13 +96,13 @@ public void renderPartModel(List quads, MultiblockControllerMachine c Direction frontFacing, @Nullable Direction side, RandomSource rand, @NotNull ModelData modelData, @Nullable RenderType renderType) { if (this.fireboxIdleModel == null) { - this.fireboxIdleModel = ModelUtils.getModelForState(fireboxIdle); + this.fireboxIdleModel = RenderUtil.getModelForState(fireboxIdle); } if (this.fireboxActiveModel == null) { - this.fireboxActiveModel = ModelUtils.getModelForState(fireboxActive); + this.fireboxActiveModel = RenderUtil.getModelForState(fireboxActive); } if (this.casingModel == null) { - this.casingModel = ModelUtils.getModelForState(casing); + this.casingModel = RenderUtil.getModelForState(casing); } BlockPos partPos = part.self().getBlockPos(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java similarity index 88% rename from src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java rename to src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java index f9749f0fced..ed79654826d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -35,16 +35,15 @@ import com.google.common.collect.Multimap; import it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; -import org.jetbrains.annotations.NotNull; +import lombok.experimental.UtilityClass; import org.jetbrains.annotations.ApiStatus; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +@UtilityClass @Mod.EventBusSubscriber(modid = GTCEu.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) -public class ModelUtils { - - private ModelUtils() {} +public class ModelEventHelper { @ApiStatus.Internal public static final List> EVENT_LISTENERS = new ArrayList<>(); @@ -66,29 +65,6 @@ public static List getBakedModelQuads(BakedModel model, BlockAndTintG return model.getQuads(state, side, rand, model.getModelData(level, pos, state, ModelData.EMPTY), null); } - public static BakedModel getModelForState(BlockState state) { - return Minecraft.getInstance().getBlockRenderer().getBlockModel(state); - } - - @SuppressWarnings("deprecation") - public static TextureAtlasSprite getBlockSprite(ResourceLocation textureLocation) { - return Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(textureLocation); - } - - public static String getPropertyValueString(Map.Entry, Comparable> entry) { - Property property = entry.getKey(); - Comparable value = entry.getValue(); - - String valueString = Util.getPropertyName(property, value); - if (Boolean.TRUE.equals(value)) { - valueString = ChatFormatting.GREEN + valueString; - } else if (Boolean.FALSE.equals(value)) { - valueString = ChatFormatting.RED + valueString; - } - - return property.getName() + ": " + valueString; - } - public static void registerAtlasStitchedEventListener(boolean removeOnReload, AssetEventListener.AtlasStitched listener) { EVENT_LISTENERS.add(new EventListenerHolder<>(listener, removeOnReload)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java index f1dec39d941..663c823b530 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java @@ -61,6 +61,10 @@ @OnlyIn(Dist.CLIENT) public class RenderUtil { + public static BakedModel getModelForState(BlockState state) { + return Minecraft.getInstance().getBlockRenderer().getBlockModel(state); + } + public enum FluidTextureType { STILL((fluidTypeExtensions, fluidStack) -> { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java b/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java index 81b8ba41c5a..67341b88e87 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java @@ -22,7 +22,7 @@ public SpriteFunctionWrapper(Function internal, Re @Override public TextureAtlasSprite apply(Material material) { - ModelUtils.textureScraped(modelLocation, material); + ModelEventHelper.textureScraped(modelLocation, material); return internal.apply(material); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 2aa41be3880..d51c30ea856 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Objects; -import static com.gregtechceu.gtceu.client.util.ModelUtils.*; +import static com.gregtechceu.gtceu.client.util.ModelEventHelper.*; public class QuadUtils { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java index baee251db2e..05e8f0f5df4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java @@ -2,11 +2,11 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.renderer.block.LampItemRenderer; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.ModelEventHelper; import com.gregtechceu.gtceu.common.block.LampBlock; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; -import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; + import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.NonNullList; @@ -26,7 +26,6 @@ import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.function.Consumer; import javax.annotation.ParametersAreNonnullByDefault; @@ -97,7 +96,7 @@ private static void registerEventListener(LampBlockItem toWrap) { if (registeredListener) return; registeredListener = true; - ModelUtils.registerBakeEventListener(false, (modelLocation, model, unbakedModel, modelBakery) -> { + ModelEventHelper.registerBakeEventListener(false, (modelLocation, model, unbakedModel, modelBakery) -> { // handle both cases 1.20 can have passed here. 1.21 *only* has the ModelResourceLocation case. ResourceLocation possibleItemId; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java b/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java index 370482a12b6..6946e0c45b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/modernfix/GTModernFixIntegration.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.modernfix; import com.gregtechceu.gtceu.client.util.AssetEventListener; -import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.ModelEventHelper; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.*; @@ -44,7 +44,7 @@ public BakedModel onBakedModelLoad(ResourceLocation modelLocation, UnbakedModel BakedModel model, ModelState state, ModelBakery bakery, Function textureGetter) { // process all model replacers - for (var listener : ModelUtils.EVENT_LISTENERS) { + for (var listener : ModelEventHelper.EVENT_LISTENERS) { if (!(listener.listener() instanceof AssetEventListener.BakedModelReplacement modelReplacement)) continue; model = modelReplacement.modifyBakedModel(modelLocation, model, baseModel, bakery); } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java b/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java index 70912110719..32d503a7f57 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.utils; import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; @@ -8,6 +9,7 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraftforge.fluids.FluidStack; import org.jetbrains.annotations.NotNull; @@ -15,6 +17,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; public class GTStringUtils { @@ -222,4 +225,18 @@ public static Component toComponent(ListTag arr) { component.append("]"); return component; } + + public static String getPropertyValueString(Map.Entry, Comparable> entry) { + Property property = entry.getKey(); + Comparable value = entry.getValue(); + + String valueString = Util.getPropertyName(property, value); + if (Boolean.TRUE.equals(value)) { + valueString = ChatFormatting.GREEN + valueString; + } else if (Boolean.FALSE.equals(value)) { + valueString = ChatFormatting.RED + valueString; + } + + return property.getName() + ": " + valueString; + } } From ee18024f594a340b75478f4c337f76eced4f3c01 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:43:10 +0300 Subject: [PATCH 097/269] Fix up the CTM reload listener in ClientProxy --- .../gregtechceu/gtceu/client/ClientProxy.java | 173 ++++++------------ .../gtceu/client/util/AssetEventListener.java | 3 +- .../gtceu/client/util/ModelEventHelper.java | 34 +--- .../client/util/SpriteFunctionWrapper.java | 2 +- .../mixins/client/ModelBakerImplMixin.java | 10 +- .../gregtechceu/gtceu/utils/ResourceUtil.java | 81 ++++++++ 6 files changed, 160 insertions(+), 143 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index b09008d5c95..29f6b91575f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -54,11 +54,11 @@ import com.gregtechceu.gtceu.integration.map.layer.Layers; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; +import com.gregtechceu.gtceu.utils.ResourceUtil; import com.gregtechceu.gtceu.utils.data.RuntimeBlockstateProvider; import com.gregtechceu.gtceu.utils.input.SyncedKeyMapping; import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; -import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; @@ -80,10 +80,8 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.HashSet; -import java.util.Set; +import java.io.IOException; +import java.util.*; public class ClientProxy extends CommonProxy { @@ -191,131 +189,80 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); // register CTM model (un)wrapper - ModelEventUtils.registerBakeEventListener(false, (modelLocation, baked, rootModel, modelBakery) -> { - if (!(modelLocation instanceof ModelResourceLocation) || baked instanceof CTMBakedModel || baked.isCustomRenderer()) { + ModelEventHelper.registerBakeEventListener(false, (originalModelName, baked, rootUnbaked, modelBakery) -> { + // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins + if (baked instanceof CustomBakedModel ctmModel) { + if (ctmModel.getParent() instanceof MachineModel machineModel) { + return machineModel; + } else { + // Skip LDLib CTM models + return baked; + } + } + if (baked.isCustomRenderer()) { + // 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 (!(originalModelName instanceof ModelResourceLocation) || rootUnbaked == null || baked instanceof CTMBakedModel) { return baked; } Deque dependencies = new ArrayDeque<>(); Set seenModels = new HashSet<>(); - dependencies.push(modelLocation); - seenModels.add(modelLocation); - - // each model is (should be) processed once, so caching what models have been wrapped is a waste of RAM, - // especially when the cache is only updated after wrapping a model - boolean shouldWrap = false; - Set> errors = new HashSet<>(); - // Breadth-first loop through dependencies, exiting as soon as a CTM texture is found, - // and skipping duplicates/cycles + dependencies.push(originalModelName); + seenModels.add(originalModelName); + + boolean shouldWrap = ModelEventHelper.WRAPPED_MODELS.getOrDefault(originalModelName, false); + // Breadth-first loop through dependencies + // exiting as soon as a CTM texture is found, and skipping duplicates/cycles PARENT_LOOP: while (!shouldWrap && !dependencies.isEmpty()) { - ResourceLocation dep = dependencies.pop(); - UnbakedModel model; + ResourceLocation dependencyModelName = dependencies.pop(); + UnbakedModel unbaked; try { - model = dep == modelLocation ? rootModel : modelBakery.getModel(dep); + unbaked = dependencyModelName == originalModelName ? rootUnbaked + : modelBakery.getModel(dependencyModelName); } catch (Exception e) { continue; } - - // have to copy because the set is updated during this loop - @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") - Set textures = new HashSet<>(ModelEventUtils.getModelUsedCTMTextures(dep)); - for (Material tex : textures) { - IMetadataSectionCTM meta = null; - // Cache all dependent texture metadata - // TODO make lazy - try { - meta = ResourceUtil.getMetadata(ResourceUtil.spriteToAbsolute(tex.texture())).orElse(null); - } catch (IOException ignored) {} // Fallthrough - if (meta != null) { - // At least one texture has CTM metadata, so we should wrap this model - shouldWrap = true; - break PARENT_LOOP; - } - } - // shouldWrap is always false here because of the `break` above - Collection newDependencies = model.getDependencies(); - for (ResourceLocation newDep : newDependencies) { - if (seenModels.add(newDep)) { - dependencies.push(newDep); - } - } - } - if (shouldWrap) { try { - baked = new CTMBakedModel<>(baked); - handleInit(modelLocation, baked, bakery); - dependencies.clear(); - } catch (IOException e) { - GTCEu.LOGGER.error("Could not wrap model {}. Aborting...", modelLocation, e); - } - } - return baked; - - if (baked == null) return null; - - // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins - if (model instanceof CustomBakedModel ctmModel) { - if (ctmModel.getParent() instanceof MachineModel machineModel) { - return machineModel; - } - } - // do not register automatic CTM for machine models, they handle it themselves - if (model instanceof MachineModel) { - return model; - } - - - if (modelLocation instanceof ModelResourceLocation && rootModel != null) { - if (model.isCustomRenderer()) { // Nothing we can add to builtin models - return model; - } - Deque dependencies = new ArrayDeque<>(); - Set seenModels = new HashSet<>(); - dependencies.push(modelLocation); - seenModels.add(modelLocation); - boolean shouldWrap = ModelUtils.WRAPPED_MODELS.getOrDefault(modelLocation, false); - // Breadth-first loop through dependencies - // exiting as soon as a CTM texture is found, and skipping duplicates/cycles - while (!shouldWrap && !dependencies.isEmpty()) { - ResourceLocation dep = dependencies.pop(); - UnbakedModel unbaked; - try { - unbaked = dep == modelLocation ? rootModel : modelBakery.getModel(dep); - } catch (Exception e) { - continue; - } - try { - // have to copy because the set is updated during this loop - @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") - Set textures = new HashSet<>(ModelUtils.SCRAPED_TEXTURES.get(dep)); - for (Material tex : textures) { - // Cache all dependent texture metadata - // TODO lazy - if (!LDLMetadataSection.getMetadata(LDLMetadataSection.spriteToAbsolute(tex.texture())).isMissing()) { - // At least one texture has CTM metadata, so we should wrap this model - shouldWrap = true; - break; - } + // have to copy because the set is updated during this loop + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") + Set textures = new HashSet<>(ModelEventHelper.getModelUsedCTMTextures(dependencyModelName)); + for (Material tex : textures) { + Optional meta = Optional.empty(); + // Cache all dependent texture metadata + // TODO lazy + try { + meta = ResourceUtil.getMetadata(ResourceUtil.spriteToAbsolute(tex.texture())); + } catch (IOException ignored) {} // Fallthrough + if (meta.isPresent()) { + // At least one texture has CTM metadata, so we should wrap this model + shouldWrap = true; + break PARENT_LOOP; } - if (!shouldWrap) { - for (ResourceLocation newDep : unbaked.getDependencies()) { - if (seenModels.add(newDep)) { - dependencies.push(newDep); - } - } + } + // shouldWrap is always false here because of the `break` above + for (ResourceLocation newDep : unbaked.getDependencies()) { + if (seenModels.add(newDep)) { + dependencies.push(newDep); } - } catch (Exception e) { - GTCEu.LOGGER.error("Error loading baked dependency {} for baked {}. Skipping...", - dep, modelLocation, e); } - } - ModelUtils.WRAPPED_MODELS.put(modelLocation, shouldWrap); - if (shouldWrap) { - return new CTMBakedModel<>(model); + } catch (Exception e) { + GTCEu.LOGGER.error("Error loading dependency {} for model {}. Skipping...", + dependencyModelName, originalModelName, e); } } + ModelEventHelper.WRAPPED_MODELS.put(originalModelName, shouldWrap); + if (shouldWrap) { + return new CTMBakedModel<>(baked); + } - return model; + return baked; }); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java index 24907a997a0..ffdc9caed12 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/AssetEventListener.java @@ -32,7 +32,8 @@ default Class eventClass() { @FunctionalInterface interface BakedModelReplacement { - BakedModel modifyBakedModel(ResourceLocation modelLocation, BakedModel model, UnbakedModel rootModel, ModelBakery modelBakery); + BakedModel modifyBakedModel(ResourceLocation modelLocation, BakedModel model, + @Nullable UnbakedModel rootModel, ModelBakery modelBakery); } @FunctionalInterface 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 ed79654826d..c7a1cfb23ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -6,35 +6,24 @@ import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; -import net.minecraft.ChatFormatting; -import net.minecraft.Util; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.*; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.Property; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; import net.minecraftforge.client.event.TextureStitchEvent; -import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import lombok.experimental.UtilityClass; import org.jetbrains.annotations.ApiStatus; @@ -50,19 +39,18 @@ public class ModelEventHelper { @ApiStatus.Internal public static final Map CTM_SPRITE_CACHE = new ConcurrentHashMap<>(); + private static final Multimap SCRAPED_TEXTURES = HashMultimap.create(); @ApiStatus.Internal - public static final Multimap SCRAPED_TEXTURES = HashMultimap.create(); - @ApiStatus.Internal - public static final Object2BooleanMap WRAPPED_MODELS = new Object2BooleanLinkedOpenHashMap<>(); + public static final Object2BooleanMap WRAPPED_MODELS = new Object2BooleanOpenHashMap<>(); @ApiStatus.Internal - public static void textureScraped(ResourceLocation modelLocation, Material material) { + public static void markTextureUsedForModel(ResourceLocation modelLocation, Material material) { SCRAPED_TEXTURES.put(modelLocation, material); } - public static List getBakedModelQuads(BakedModel model, BlockAndTintGetter level, BlockPos pos, - BlockState state, Direction side, RandomSource rand) { - return model.getQuads(state, side, rand, model.getModelData(level, pos, state, ModelData.EMPTY), null); + @ApiStatus.Internal + public static Collection getModelUsedCTMTextures(ResourceLocation modelLocation) { + return SCRAPED_TEXTURES.get(modelLocation); } public static void registerAtlasStitchedEventListener(boolean removeOnReload, @@ -94,7 +82,7 @@ public static void registerReloadListener(RegisterClientReloadListenersEvent eve event.registerReloadListener(new ResourceManagerReloadListener() { @Override - public void onResourceManagerReload(@NotNull ResourceManager resourceManager) { + public void onResourceManagerReload(ResourceManager resourceManager) { EVENT_LISTENERS.removeIf(EventListenerHolder::removeOnReload); } }); @@ -103,7 +91,8 @@ public void onResourceManagerReload(@NotNull ResourceManager resourceManager) { @SuppressWarnings({ "unchecked", "deprecation" }) @SubscribeEvent(priority = EventPriority.LOWEST) public static void onAtlasStitched(TextureStitchEvent.Post event) { - if (event.getAtlas().location().equals(TextureAtlas.LOCATION_BLOCKS)) { + TextureAtlas atlas = event.getAtlas(); + if (atlas.location().equals(TextureAtlas.LOCATION_BLOCKS)) { // Cache all textures' CTM metadata // TODO lazy CTM_SPRITE_CACHE.clear(); @@ -115,10 +104,7 @@ public static void onAtlasStitched(TextureStitchEvent.Post event) { CTM_SPRITE_CACHE.put(location, ctmSprite); } } - } - TextureAtlas atlas = event.getAtlas(); - if (atlas.location() == TextureAtlas.LOCATION_BLOCKS) { MachineModel.initSprites(atlas); ICoverableRenderer.initSprites(atlas); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java b/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java index 67341b88e87..452b46b9540 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/SpriteFunctionWrapper.java @@ -22,7 +22,7 @@ public SpriteFunctionWrapper(Function internal, Re @Override public TextureAtlasSprite apply(Material material) { - ModelEventHelper.textureScraped(modelLocation, material); + ModelEventHelper.markTextureUsedForModel(this.modelLocation, material); return internal.apply(material); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java index c2587e92896..6cf2c33db95 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java @@ -16,14 +16,16 @@ @Mixin(targets = {"net.minecraft.client.resources.model.ModelBakery$ModelBakerImpl"}) public abstract class ModelBakerImplMixin { + // the parameters aren't remapped because Parchment can't remap Forge's patches + @SuppressWarnings("NameDoesntMatchTargetClass") // Note: We don't remap this method as it's added by forge @ModifyVariable(at = @At("HEAD"), method = "bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;", argsOnly = true, remap = false) - private Function ldlib$scrapeTextures(Function sprites, - ResourceLocation modelLocation, - ModelState modelState) { - return new SpriteFunctionWrapper(sprites, modelLocation); + private Function gtceu$injectTextureScraper(Function spriteGetter, + ResourceLocation modelLocation, + ModelState transform) { + return new SpriteFunctionWrapper(spriteGetter, modelLocation); } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java new file mode 100644 index 00000000000..f8bb663cdae --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java @@ -0,0 +1,81 @@ +package com.gregtechceu.gtceu.utils; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; + +import com.google.gson.JsonParseException; +import lombok.experimental.UtilityClass; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Optional; + +@UtilityClass +public class ResourceUtil { + + public static Resource getResource(TextureAtlasSprite sprite) throws IOException { + return getResource(spriteToAbsolute(sprite.contents().name())); + } + + public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { + if (!sprite.getPath().startsWith("textures/")) { + sprite = sprite.withPrefix("textures/"); + } + if (!sprite.getPath().endsWith(".png")) { + sprite = sprite.withSuffix(".png"); + } + return sprite; + } + + public static Resource getResource(ResourceLocation res) throws FileNotFoundException { + return Minecraft.getInstance().getResourceManager().getResourceOrThrow(res); + } + + public static Resource getResourceUnsafe(ResourceLocation res) { + try { + return getResource(res); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static final Map metadataCache = new HashMap<>(); + private static final IMetadataSectionCTM.Serializer SERIALIZER = new IMetadataSectionCTM.Serializer(); + + public static Optional getMetadata(ResourceLocation res) throws IOException { + // Note, semantically different from computeIfAbsent, as we DO care about keys mapped to null values + if (metadataCache.containsKey(res)) { + return Optional.ofNullable(metadataCache.get(res)); + } + Optional ret; + try { + Resource resource = getResource(res); + ret = resource.metadata().getSection(SERIALIZER); + } catch (FileNotFoundException e) { + ret = Optional.empty(); + } catch (JsonParseException e) { + throw new IOException("Error loading metadata for location " + res, e); + } + ret.ifPresentOrElse(r -> metadataCache.put(res, r), () -> metadataCache.put(res, null)); + return ret; + } + + public static Optional getMetadata(TextureAtlasSprite sprite) throws IOException { + return getMetadata(spriteToAbsolute(sprite.contents().name())); + } + + public static Optional getMetadataUnsafe(TextureAtlasSprite sprite) { + try { + return getMetadata(sprite); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void invalidateCaches() { + metadataCache.clear(); + } +} \ No newline at end of file From 2bb52f8dbfda0398a31596f28504521fdf7c6383 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 16:56:47 +0300 Subject: [PATCH 098/269] Add copyright headers to all the classes I copied from CTM --- .../gtceu/client/model/ctm/CTMCache.java | 18 ++++++++++++++++++ .../client/model/ctm/ConnectionCheck.java | 18 ++++++++++++++++++ .../gtceu/client/model/ctm/ISubmap.java | 18 ++++++++++++++++++ .../client/model/ctm/OctagonalOrientation.java | 18 ++++++++++++++++++ .../gtceu/client/model/ctm/Submap.java | 18 ++++++++++++++++++ .../gtceu/client/model/package-info.java | 7 ++----- .../gtceu/client/util/package-info.java | 4 ++++ 7 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 294a4cc8e1d..fd0733ae276 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -1,3 +1,21 @@ +/* + * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). + * Copyright (c) 2023 Chisel Team. + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * ConnectedTexturesMod is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with ConnectedTexturesMod; if not, If not, see . + */ + package com.gregtechceu.gtceu.client.model.ctm; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java index 489ebf6c1c0..a316143f23f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java @@ -1,3 +1,21 @@ +/* + * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). + * Copyright (c) 2023 Chisel Team. + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * ConnectedTexturesMod is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with ConnectedTexturesMod; if not, If not, see . + */ + package com.gregtechceu.gtceu.client.model.ctm; import com.gregtechceu.gtceu.client.model.ctm.CTMCache.StateComparisonCallback; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java index 4e9716492a9..2bd1818daa9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java @@ -1,3 +1,21 @@ +/* + * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). + * Copyright (c) 2023 Chisel Team. + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * ConnectedTexturesMod is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with ConnectedTexturesMod; if not, If not, see . + */ + package com.gregtechceu.gtceu.client.model.ctm; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java index 2aa94bf3f17..4b0a682568e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java @@ -1,3 +1,21 @@ +/* + * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). + * Copyright (c) 2023 Chisel Team. + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * ConnectedTexturesMod is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with ConnectedTexturesMod; if not, If not, see . + */ + package com.gregtechceu.gtceu.client.model.ctm; import net.createmod.catnip.math.DirectionHelper; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java index bea4f7531d6..3253750ebf1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java @@ -1,3 +1,21 @@ +/* + * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). + * Copyright (c) 2023 Chisel Team. + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * ConnectedTexturesMod is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with ConnectedTexturesMod; if not, If not, see . + */ + package com.gregtechceu.gtceu.client.model.ctm; import lombok.Getter; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/model/package-info.java index 756fd4d977e..9c694981ff8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/package-info.java @@ -1,7 +1,4 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault +@NotNullByDefault package com.gregtechceu.gtceu.client.model; -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/util/package-info.java new file mode 100644 index 00000000000..1bc08b04b82 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.client.util; + +import org.jetbrains.annotations.NotNullByDefault; From 6fc6f1417e2b6ca66576668fb39089a6fc95e937 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 17:08:40 +0300 Subject: [PATCH 099/269] Add a simplified version of Fabric's dynamic model API --- .../gtceu/client/util/TextureHelper.java | 117 +++++ .../client/util/quad/EncodingFormat.java | 86 ++++ .../client/util/quad/GeometryHelper.java | 198 ++++++++ .../gtceu/client/util/quad/Mesh.java | 49 ++ .../gtceu/client/util/quad/MeshBuilder.java | 83 ++++ .../client/util/quad/MutableQuadView.java | 467 ++++++++++++++++++ .../gtceu/client/util/quad/QuadTransform.java | 20 + .../gtceu/client/util/quad/QuadView.java | 355 +++++++++++++ .../gtceu/client/util/quad/SpriteFinder.java | 177 +++++++ .../gtceu/client/util/quad/package-info.java | 4 + .../quad/transformers/QuadCornerKicker.java | 209 ++++++++ .../core/mixins/client/TextureAtlasMixin.java | 56 +++ src/main/resources/gtceu.mixins.json | 1 + 13 files changed, 1822 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/EncodingFormat.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/Mesh.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/MeshBuilder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/MutableQuadView.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadTransform.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadView.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/SpriteFinder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java new file mode 100644 index 00000000000..1c893d6799f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.client.util; + +import com.gregtechceu.gtceu.client.util.quad.MutableQuadView; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; + +import lombok.experimental.UtilityClass; + +/** + * Handles most texture-baking use cases for model loaders and model libraries via + * {@link #bakeSprite(MutableQuadView, TextureAtlasSprite, int)}. + */ +@UtilityClass +public class TextureHelper { + + public static final float NORMALIZER = 1f / 16f; + + private static final int BAKE_ROTATE_ANY = 3; + + /** + * Bakes textures in the provided vertex data, handling UV locking, rotation, interpolation, etc. + * Textures must not be already baked. + */ + public static void bakeSprite(MutableQuadView quad, TextureAtlasSprite sprite, int bakeFlags) { + if (quad.nominalFace() != null && (MutableQuadView.BAKE_LOCK_UV & bakeFlags) != 0) { + // Assigns normalized UV coordinates based on vertex positions + applyModifier(quad, UV_LOCKERS[quad.nominalFace().get3DDataValue()]); + } else if ((MutableQuadView.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; + + if (rotation != 0) { + // Rotates texture around the center of sprite. + // Assumes normalized coordinates. + applyModifier(quad, ROTATIONS[rotation]); + } + + if ((MutableQuadView.BAKE_FLIP_U & bakeFlags) != 0) { + // Inverts U coordinates. Assumes normalized (0-1) values. + applyModifier(quad, (q, i) -> q.uv(i, 1 - q.u(i), q.v(i))); + } + + if ((MutableQuadView.BAKE_FLIP_V & bakeFlags) != 0) { + // Inverts V coordinates. Assumes normalized (0-1) values. + applyModifier(quad, (q, i) -> q.uv(i, q.u(i), 1 - q.v(i))); + } + + interpolate(quad, sprite); + } + + /** + * Faster than sprite method. Sprite computes span and normalizes inputs each call, so we'd have to denormalize + * before we called, only to have the sprite renormalize immediately. + */ + private static void interpolate(MutableQuadView q, TextureAtlasSprite sprite) { + final float uMin = sprite.getU0(); + final float uSpan = sprite.getU1() - uMin; + final float vMin = sprite.getV0(); + final float vSpan = sprite.getV1() - vMin; + + for (int i = 0; i < 4; i++) { + q.uv(i, uMin + q.u(i) * uSpan, vMin + q.v(i) * vSpan); + } + } + + @FunctionalInterface + private interface VertexModifier { + void apply(MutableQuadView quad, int vertexIndex); + } + + private static void applyModifier(MutableQuadView quad, VertexModifier modifier) { + for (int i = 0; i < 4; i++) { + modifier.apply(quad, i); + } + } + + private static final VertexModifier[] ROTATIONS = new VertexModifier[] { + (q, i) -> {}, // 0 + (q, i) -> q.uv(i, q.v(i), 1 - q.u(i)), // 90 + (q, i) -> q.uv(i, 1 - q.u(i), 1 - q.v(i)), // 180 + (q, i) -> q.uv(i, 1 - q.v(i), q.u(i)) // 270 + }; + + private static final VertexModifier[] UV_LOCKERS = new VertexModifier[6]; + + static { + UV_LOCKERS[Direction.EAST.get3DDataValue()] = (q, i) -> q.uv(i, 1 - q.z(i), 1 - q.y(i)); + UV_LOCKERS[Direction.WEST.get3DDataValue()] = (q, i) -> q.uv(i, q.z(i), 1 - q.y(i)); + UV_LOCKERS[Direction.NORTH.get3DDataValue()] = (q, i) -> q.uv(i, 1 - q.x(i), 1 - q.y(i)); + UV_LOCKERS[Direction.SOUTH.get3DDataValue()] = (q, i) -> q.uv(i, q.x(i), 1 - q.y(i)); + UV_LOCKERS[Direction.DOWN.get3DDataValue()] = (q, i) -> q.uv(i, q.x(i), 1 - q.z(i)); + UV_LOCKERS[Direction.UP.get3DDataValue()] = (q, i) -> q.uv(i, q.x(i), q.z(i)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/EncodingFormat.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/EncodingFormat.java new file mode 100644 index 00000000000..18eaa10ef2c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/EncodingFormat.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.client.util.quad; + +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraftforge.client.model.IQuadTransformer; + +import java.util.Objects; + +/** + * Holds all the array offsets and bit-wise encoders/decoders for packing/unpacking quad data in an array of integers. + * All of this is implementation-specific - that's why it isn't a "helper" class. + */ +@SuppressWarnings("PointlessArithmeticExpression") +@UtilityClass +public class EncodingFormat { + + static final int VERTEX_X = IQuadTransformer.POSITION + 0; + static final int VERTEX_Y = IQuadTransformer.POSITION + 1; + static final int VERTEX_Z = IQuadTransformer.POSITION + 2; + static final int VERTEX_COLOR = IQuadTransformer.COLOR; + static final int VERTEX_U = IQuadTransformer.UV0 + 0; + static final int VERTEX_V = IQuadTransformer.UV0 + 1; + static final int VERTEX_LIGHTMAP = IQuadTransformer.UV2; + static final int VERTEX_NORMAL = IQuadTransformer.NORMAL; + public static final int VERTEX_STRIDE = IQuadTransformer.STRIDE; + + public static final int QUAD_STRIDE = VERTEX_STRIDE * 4; + + /** used for quick clearing of quad buffers. */ + static final int[] EMPTY = new int[QUAD_STRIDE]; + + private static final int DIRECTION_MASK = Mth.smallestEncompassingPowerOfTwo(GeometryHelper.NULL_FACE_ID) - 1; + private static final int DIRECTION_BIT_COUNT = Integer.bitCount(DIRECTION_MASK); + private static final int CULL_SHIFT = 0; + private static final int CULL_INVERSE_MASK = ~(DIRECTION_MASK << CULL_SHIFT); + private static final int LIGHT_SHIFT = CULL_SHIFT + DIRECTION_BIT_COUNT; + private static final int LIGHT_INVERSE_MASK = ~(DIRECTION_MASK << LIGHT_SHIFT); + private static final int NORMALS_SHIFT = LIGHT_SHIFT + DIRECTION_BIT_COUNT; + private static final int NORMALS_COUNT = 4; + private static final int NORMALS_MASK = (1 << NORMALS_COUNT) - 1; + private static final int NORMALS_INVERSE_MASK = ~(NORMALS_MASK << NORMALS_SHIFT); + + static @Nullable Direction cullFace(long bits) { + return GeometryHelper.faceFromIndex((int) ((bits >> CULL_SHIFT) & DIRECTION_MASK)); + } + + static long cullFace(long bits, @Nullable Direction face) { + return (bits & CULL_INVERSE_MASK) | (GeometryHelper.toFaceIndex(face) << CULL_SHIFT); + } + + static Direction lightFace(long bits) { + return Objects.requireNonNull(GeometryHelper.faceFromIndex((int) ((bits >> LIGHT_SHIFT) & DIRECTION_MASK))); + } + + static long lightFace(long bits, Direction face) { + return (bits & LIGHT_INVERSE_MASK) | ((long) GeometryHelper.toFaceIndex(face) << LIGHT_SHIFT); + } + + /** indicate if vertex normal has been set - bits correspond to vertex ordinals. */ + static int normalFlags(long bits) { + return (int) ((bits >> NORMALS_SHIFT) & NORMALS_MASK); + } + + static long normalFlags(long bits, int normalFlags) { + return (bits & NORMALS_INVERSE_MASK) | ((long) (normalFlags & NORMALS_MASK) << NORMALS_SHIFT); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java new file mode 100644 index 00000000000..58cf95bfa34 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.client.util.quad; + +import com.gregtechceu.gtceu.utils.GTUtil; + +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; + +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; + +/** + * Static routines of general utility for renderer implementations. + * Renderers are not required to use these helpers, but they were designed to be usable without the default renderer. + */ +@UtilityClass +public class GeometryHelper { + + /** Result from {@link #toFaceIndex(Direction)} for null values. */ + public static final int NULL_FACE_ID = 6; + + /** + * Convenient way to encode faces that may be null. Null is returned as {@link #NULL_FACE_ID}. + * Use {@link #faceFromIndex(int)} to retrieve encoded face. + */ + public static int toFaceIndex(@Nullable Direction face) { + return face == null ? NULL_FACE_ID : face.get3DDataValue(); + } + + /** + * Use to decode a result from {@link #toFaceIndex(Direction)}. Return value will be null if encoded value was null. + */ + @Contract("null -> null") + public static @Nullable Direction faceFromIndex(int faceIndex) { + return GTUtil.DIRECTIONS_WITH_NULL[faceIndex]; + } + + /** + * Identifies the face to which the quad is most closely aligned. This mimics the value that + * {@link BakedQuad#getDirection()} returns, and is used in the vanilla renderer for all diffuse lighting. + * + *

+ * Derived from the quad face normal and expects convex quads with all points co-planar. + */ + public static Direction lightFace(QuadView quad) { + final Vector3f normal = quad.faceNormal(); + return switch (GeometryHelper.longestAxis(normal)) { + case X -> normal.x() > 0 ? Direction.EAST : Direction.WEST; + case Y -> normal.y() > 0 ? Direction.UP : Direction.DOWN; + case Z -> normal.z() > 0 ? Direction.SOUTH : Direction.NORTH; + }; + } + + /** + * @see #longestAxis(float, float, float) + */ + public static Axis longestAxis(Vector3f vec) { + return longestAxis(vec.x(), vec.y(), vec.z()); + } + + /** + * Identifies the largest (max absolute magnitude) component (X, Y, Z) in the given vector. + */ + public static Axis longestAxis(float normalX, float normalY, float normalZ) { + Axis result = Axis.Y; + float longest = Math.abs(normalY); + float a = Math.abs(normalX); + + if (a > longest) { + result = Axis.X; + longest = a; + } + + return Math.abs(normalZ) > longest ? Axis.Z : result; + } + + /** + * Stores a normal plus an extra value as a quartet of signed bytes. This is the same normal format that vanilla + * item rendering expects. The extra value is for use by shaders. + */ + public static int packNormal(float x, float y, float z, float w) { + x = Mth.clamp(x, -1, 1); + y = Mth.clamp(y, -1, 1); + z = Mth.clamp(z, -1, 1); + w = Mth.clamp(w, -1, 1); + + return ((int) (x * 127) & 255) + | (((int) (y * 127) & 255) << 8) + | (((int) (z * 127) & 255) << 16) + | (((int) (w * 127) & 255) << 24); + } + + /** + * Version of {@link #packNormal(float, float, float, float)} that accepts a vector type. + */ + public static int packNormal(Vector3f normal, float w) { + return packNormal(normal.x(), normal.y(), normal.z(), w); + } + + /** + * Retrieves values packed by {@link #packNormal(float, float, float, float)}. + * + *

+ * Components are x, y, z, w - zero based. + */ + public static float getPackedNormalComponent(int packedNormal, int component) { + return ((byte) (packedNormal >> (8 * component))) / 127f; + } + + /** + * Computes the face normal of the given quad and saves it in the provided non-null vector. + * If {@link QuadView#nominalFace()} is set will optimize by confirming quad is parallel to that face and, + * if so, use the standard normal for that face direction. + * + *

+ * Will work with triangles also. Assumes counter-clockwise winding order, which is the norm. Expects convex quads + * with all points co-planar. + */ + public static void computeFaceNormal(Vector3f saveTo, QuadView q) { + final Direction nominalFace = q.nominalFace(); + + if (isQuadParallelToFace(nominalFace, q)) { + Vec3i vec = nominalFace.getNormal(); + saveTo.set(vec.getX(), vec.getY(), vec.getZ()); + return; + } + + final float x0 = q.x(0); + final float y0 = q.y(0); + final float z0 = q.z(0); + final float x1 = q.x(1); + final float y1 = q.y(1); + final float z1 = q.z(1); + final float x2 = q.x(2); + final float y2 = q.y(2); + final float z2 = q.z(2); + final float x3 = q.x(3); + final float y3 = q.y(3); + final float z3 = q.z(3); + + final float dx0 = x2 - x0; + final float dy0 = y2 - y0; + final float dz0 = z2 - z0; + final float dx1 = x3 - x1; + final float dy1 = y3 - y1; + final float dz1 = z3 - z1; + + float normX = dy0 * dz1 - dz0 * dy1; + float normY = dz0 * dx1 - dx0 * dz1; + float normZ = dx0 * dy1 - dy0 * dx1; + + float l = (float) Math.sqrt(normX * normX + normY * normY + normZ * normZ); + + if (l != 0) { + normX /= l; + normY /= l; + normZ /= l; + } + + saveTo.set(normX, normY, normZ); + } + + /** + * Returns true if quad is parallel to the given face. Does not validate quad winding order. Expects convex quads + * with all points co-planar. + */ + public static boolean isQuadParallelToFace(@Nullable Direction face, QuadView quad) { + if (face == null) { + return false; + } + + int i = face.getAxis().ordinal(); + final float val = quad.posByIndex(0, i); + return Mth.equal(val, quad.posByIndex(1, i)) + && Mth.equal(val, quad.posByIndex(2, i)) + && Mth.equal(val, quad.posByIndex(3, i)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/Mesh.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/Mesh.java new file mode 100644 index 00000000000..a9a6f5ca2de --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/Mesh.java @@ -0,0 +1,49 @@ +package com.gregtechceu.gtceu.client.util.quad; + +import java.util.function.Consumer; + +/** + * A bundle of one or more {@link QuadView} instances encoded by the renderer. + * + *

+ * Similar in purpose to the {@code List} instances returned by BakedModel, but affords the renderer the + * ability to optimize the format for performance and memory allocation. + * + *

+ * Only the renderer should implement or extend this interface. + * + * @implNote The way we encode meshes makes it very simple. + */ +public class Mesh { + /** Used to satisfy external calls to {@link #forEach(Consumer)}. */ + ThreadLocal POOL = ThreadLocal.withInitial(QuadView::new); + + final int[] data; + + Mesh(int[] data) { + this.data = data; + } + + public int[] data() { + return data; + } + + public void forEach(Consumer consumer) { + forEach(consumer, POOL.get()); + } + + /** + * The renderer will call this with its own cursor to avoid the performance hit of a thread-local lookup. Also + * means renderer can hold final references to quad buffers. + */ + void forEach(Consumer consumer, QuadView cursor) { + final int limit = data.length; + int index = 0; + + while (index < limit) { + cursor.load(data, index); + consumer.accept(cursor); + index += EncodingFormat.QUAD_STRIDE; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/MeshBuilder.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/MeshBuilder.java new file mode 100644 index 00000000000..4d7384acb01 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/MeshBuilder.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.client.util.quad; + + +/** + * Similar in purpose to {@link com.mojang.blaze3d.vertex.BufferBuilder} but simpler and not tied to NIO + * or any other specific implementation, plus designed to handle both static and dynamic building. + * + *

+ * Decouples models from the vertex format(s) used by ModelRenderer to allow compatibility across diverse + * implementations. + * + * @implNote Not much to it - mainly it just needs to grow the int[] array as quads are appended and + * maintain/provide a properly-configured {@link MutableQuadView} instance. + * All the encoding and other work is handled in the quad base classes. + * The one interesting bit is in {@link Maker#emit()}. + */ +public class MeshBuilder { + + private int[] data = new int[256]; + private final Maker maker = new Maker(); + private int index = 0; + private int limit = data.length; + + public static MeshBuilder getInstance() { + return new MeshBuilder(); + } + + protected void ensureCapacity() { + if (EncodingFormat.QUAD_STRIDE > limit - index) { + limit *= 2; + final int[] bigger = new int[limit]; + System.arraycopy(data, 0, bigger, 0, index); + data = bigger; + maker.data = bigger; + } + } + + public Mesh build() { + final int[] packed = new int[index]; + System.arraycopy(data, 0, packed, 0, index); + index = 0; + maker.begin(data, index); + return new Mesh(packed); + } + + public MutableQuadView getEmitter() { + ensureCapacity(); + maker.begin(data, index); + return maker; + } + + /** + * Our base classes are used differently so we define final encoding steps in subtypes. This will be a static mesh + * used at render time so we want to capture all geometry now and apply non-location-dependent lighting. + */ + private class Maker extends MutableQuadView { + @Override + public Maker emit() { + computeGeometry(); + index += EncodingFormat.QUAD_STRIDE; + ensureCapacity(); + baseIndex = index; + clear(); + return this; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/MutableQuadView.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/MutableQuadView.java new file mode 100644 index 00000000000..1b6fd9c2b4a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/MutableQuadView.java @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.client.util.quad; + +import com.gregtechceu.gtceu.client.util.TextureHelper; + +import org.jetbrains.annotations.Nullable; +import org.joml.Vector2f; +import org.joml.Vector3f; + +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.minecraftforge.client.model.QuadTransformers; + +import static com.gregtechceu.gtceu.client.util.quad.EncodingFormat.*; +/** + * A mutable {@link QuadView} instance. + * + *

+ * Instances of {@link MutableQuadView} will practically always be thread local and/or reused - do not retain references. + * + *

+ * Only the renderer should implement or extend this interface. + * + * @implNote Almost-concrete implementation of a mutable quad. + */ +public abstract class MutableQuadView extends QuadView { + + /** + * Causes texture to appear with no rotation. + * Pass in bakeFlags parameter to {@link #spriteBake(TextureAtlasSprite, int)}. + */ + public static final int BAKE_ROTATE_NONE = 0b000000; + + /** + * Causes texture to appear rotated 90 deg. clockwise relative to nominal face. Pass in bakeFlags parameter to + * {@link #spriteBake(TextureAtlasSprite, int)}. + */ + public static final int BAKE_ROTATE_90 = 0b000001; + + /** + * Causes texture to appear rotated 180 deg. relative to nominal face. Pass in bakeFlags parameter to + * {@link #spriteBake(TextureAtlasSprite, int)}. + */ + public static final int BAKE_ROTATE_180 = 0b000010; + + /** + * Causes texture to appear rotated 270 deg. clockwise relative to nominal face. Pass in bakeFlags parameter to + * {@link #spriteBake(TextureAtlasSprite, int)}. + */ + public static final int BAKE_ROTATE_270 = 0b000011; + + /** + * When enabled, texture coordinate are assigned based on vertex position. Any existing UV coordinates will be + * replaced. Pass in bakeFlags parameter to {@link #spriteBake(TextureAtlasSprite, int)}. + * + *

+ * UV lock always derives texture coordinates based on nominal face, even when the quad is not co-planar with that + * face, and the result is the same as if the quad were projected onto the nominal face, which is usually the + * desired result. + */ + public static final int BAKE_LOCK_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 + * both can be applied. Pass in bakeFlags parameter to {@link #spriteBake(TextureAtlasSprite, int)}. + */ + public static final int BAKE_FLIP_U = 0b001000; + + /** + * Same as {@link #BAKE_FLIP_U} but for V coordinate. + */ + 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)}. + */ + public static final int BAKE_NORMALIZED = 0b100000; + + public static MutableQuadView getInstance() { + return MutableQuadView.THREAD_LOCAL.get(); + } + + + public static final ThreadLocal THREAD_LOCAL = ThreadLocal.withInitial(() -> new MutableQuadView() { + { + begin(new int[QUAD_STRIDE], 0); + } + + @Override + public MutableQuadView emit() { + throw new UnsupportedOperationException(); + } + }); + + public final void begin(int[] data, int baseIndex) { + this.data = data; + this.baseIndex = baseIndex; + clear(); + } + + @Override + protected void computeGeometry() { + this.populateMissingNormals(); + super.computeGeometry(); + } + + public void clear() { + System.arraycopy(EMPTY, 0, data, baseIndex, QUAD_STRIDE); + isGeometryInvalid = true; + nominalFace = null; + tintIndex(-1); + cullFace(null); + } + + /** + * Sets the geometric vertex position for the given vertex, relative to block origin, (0,0,0). Minecraft rendering + * is designed for models that fit within a single block space and is recommended that coordinates remain in the 0-1 + * range, with multi-block meshes split into multiple per-block models. + */ + public MutableQuadView pos(int vertexIndex, float x, float y, float z) { + final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; + data[index] = Float.floatToRawIntBits(x); + data[index + 1] = Float.floatToRawIntBits(y); + data[index + 2] = Float.floatToRawIntBits(z); + isGeometryInvalid = true; + return this; + } + + /** + * Same as {@link #pos(int, float, float, float)} but accepts a vector type. + */ + public MutableQuadView pos(int vertexIndex, Vector3f pos) { + return pos(vertexIndex, pos.x(), pos.y(), pos.z()); + } + + /** + * Set vertex color. + */ + public MutableQuadView color(int vertexIndex, int color) { + data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR] = color; + return this; + } + + /** + * Convenience: set vertex color for all vertices at once. + */ + public MutableQuadView color(int c0, int c1, int c2, int c3) { + color(0, c0); + color(1, c1); + color(2, c2); + color(3, c3); + return this; + } + + /** + * Set texture coordinates. + */ + public MutableQuadView uv(int vertexIndex, float u, float v) { + final int i = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U; + data[i] = Float.floatToRawIntBits(u); + data[i + 1] = Float.floatToRawIntBits(v); + return this; + } + + /** + * Set texture coordinates. + * + *

+ * Only use this function if you already have a {@link Vector2f}. + * Otherwise, see {@link MutableQuadView#uv(int, float, float)}. + * + * @see MutableQuadView#uv(int, float, float) + */ + public MutableQuadView uv(int vertexIndex, Vector2f uv) { + return uv(vertexIndex, uv.x, uv.y); + } + + /** + * Assigns sprite atlas u,v coordinates to this quad for the given sprite. + * Can handle UV locking, rotation, interpolation, etc. + * Control this behavior by passing additive combinations of the BAKE_ flags defined in this interface. + */ + public MutableQuadView spriteBake(TextureAtlasSprite sprite, int bakeFlags) { + TextureHelper.bakeSprite(this, sprite, bakeFlags); + return this; + } + + /** + * Accept vanilla lightmap values. + * Input values will override lightmap values computed from world state if input values are higher. + */ + public MutableQuadView lightmap(int vertexIndex, int lightmap) { + data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_LIGHTMAP] = lightmap; + return this; + } + + /** + * Convenience: set lightmap for all vertices at once. + * + * @see #lightmap(int, int) + */ + public MutableQuadView lightmap(int b0, int b1, int b2, int b3) { + lightmap(0, b0); + lightmap(1, b1); + lightmap(2, b2); + lightmap(3, b3); + return this; + } + + protected void normalFlags(int flags) { + this.flags = EncodingFormat.normalFlags(this.flags, flags); + } + + /** + * Adds a vertex normal. + * Models that have per-vertex normals should include them to get correct lighting when it matters. + * Computed face normal is used when no vertex normal is provided. + */ + public MutableQuadView normal(int vertexIndex, float x, float y, float z) { + normalFlags(normalFlags() | (1 << vertexIndex)); + data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL] = GeometryHelper.packNormal(x, y, z, 0); + return this; + } + + /** + * Same as {@link #normal(int, float, float, float)} but accepts a vector type. + */ + public MutableQuadView normal(int vertexIndex, Vector3f normal) { + return normal(vertexIndex, normal.x(), normal.y(), normal.z()); + } + + /** + * Internal helper method. Copies face normals to vertex normals lacking one. + */ + public final void populateMissingNormals() { + final int normalFlags = this.normalFlags(); + if (normalFlags == 0b1111) + return; + + final int packedFaceNormal = GeometryHelper.packNormal(faceNormal(), 0); + + for (int v = 0; v < 4; v++) { + if ((normalFlags & (1 << v)) == 0) { + data[baseIndex + v * VERTEX_STRIDE + VERTEX_NORMAL] = packedFaceNormal; + } + } + + normalFlags(0b1111); + } + + /** + * If non-null, quad is coplanar with a block face which, if known, simplifies or shortcuts geometric analysis + * that might otherwise be needed. Set to null if quad is not coplanar or if this is not known. + * Also controls face culling during block rendering. + * + *

+ * Null by default. + * + *

+ * When called with a non-null value, also sets {@link #nominalFace(Direction)} to the same value. + * + *

+ * This is different from the value reported by {@link BakedQuad#getDirection()}. That value is computed based on + * face geometry and must be non-null in vanilla quads. That computed value is returned by {@link #lightFace()}. + */ + public final MutableQuadView cullFace(@Nullable Direction face) { + flags = EncodingFormat.cullFace(flags, face); + nominalFace(face); + return this; + } + + /** + * Provides a hint to renderer about the facing of this quad. + * Not required, but if provided can shortcut some geometric analysis if the quad is parallel to a block face. + * Should be the expected value of {@link #lightFace()}. + * Value will be confirmed and if invalid the correct light face will be calculated. + * + *

+ * Null by default, and set automatically by {@link #cullFace()}. + * + *

+ * Models may also find this useful as the face for texture UV locking and rotation semantics. + * + *

+ * Note: This value is not persisted independently when the quad is encoded. + * When reading encoded quads, this value will always be the same as {@link #lightFace()}. + */ + public final MutableQuadView nominalFace(@Nullable Direction face) { + this.nominalFace = face; + return this; + } + + /** + * Value functions identically to {@link BakedQuad#getTintIndex()} + * and is used by renderer / model builder in same way.
+ * Default value is -1. + */ + public final MutableQuadView tintIndex(int tintIndex) { + this.tintIndex = tintIndex; + return this; + } + + /** + * Value functions identically to {@link BakedQuad#isShade()} + * and is used by renderer / model builder in the same way.
+ * Default value is true. + */ + public final MutableQuadView shade(boolean shade) { + this.shade = shade; + return this; + } + + /** + * Value functions identically to {@link BakedQuad#hasAmbientOcclusion()} + * and is used by renderer / model builder in the same way.
+ * Default value is true. + */ + public final MutableQuadView ambientOcclusion(boolean ao) { + this.ambientOcclusion = ao; + return this; + } + + /** + * Enables bulk vertex data transfer using the standard Minecraft vertex formats. Only the + * {@link BakedQuad#getVertices() quad vertex data} is copied. This method should be performant whenever caller's + * vertex representation makes it feasible. + * + *

+ * Use {@link #fromVanilla(BakedQuad, Direction) the other overload} which has better encapsulation + * unless you have a specific reason to use this one. + * + *

+ * Calling this method does not emit the quad. + */ + public final MutableQuadView fromVanilla(int[] quadData, int startIndex) { + clear(); + System.arraycopy(quadData, startIndex, this.data, this.baseIndex, QUAD_STRIDE); + this.isGeometryInvalid = true; + + int colorIndex = baseIndex + VERTEX_COLOR; + + for (int i = 0; i < 4; i++) { + // ARGB -> ABGR is a transitive process, e.g. it can be reversed and works fine. + this.data[colorIndex] = QuadTransformers.toABGR(this.data[colorIndex]); + colorIndex += VERTEX_STRIDE; + } + + return this; + } + + /** + * Enables bulk vertex data transfer using the standard Minecraft quad format. + * + *

+ * Calling this method does not emit the quad. + */ + public final MutableQuadView fromVanilla(BakedQuad quad, @Nullable Direction cullFace) { + fromVanilla(quad.getVertices(), 0); + flags = EncodingFormat.cullFace(0, cullFace); + + nominalFace(quad.getDirection()); + tintIndex(quad.getTintIndex()); + shade(quad.isShade()); + ambientOcclusion(quad.hasAmbientOcclusion()); + + return this; + } + + /** + * In static mesh building, causes quad to be appended to the mesh being built. In a dynamic render context, create + * a new quad to be output to rendering. In both cases, current instance is reset to default values. + */ + public abstract MutableQuadView emit(); + + + /** + * Tolerance for determining if the depth parameter to {@link #square(Direction, float, float, float, float, float)} + * is effectively zero - meaning the face is a cull face. + */ + private static final float CULL_FACE_EPSILON = Mth.EPSILON; + + /** + * Helper method to assign vertex coordinates for a square aligned with the given face. Ensures that vertex order is + * consistent with vanilla convention. (Incorrect order can lead to bad AO lighting unless enhanced lighting logic + * is available/enabled.) + * + *

+ * Square will be parallel to the given face and coplanar with the face (and culled if the face is occluded) if the + * depth parameter is approximately zero. See {@link #CULL_FACE_EPSILON}. + * + *

+ * All coordinates should be normalized (0-1). + */ + public MutableQuadView square(Direction nominalFace, float left, float bottom, float right, float top, float depth) { + if (Math.abs(depth) < CULL_FACE_EPSILON) { + cullFace(nominalFace); + depth = 0; // avoid any inconsistency for face quads + } else { + cullFace(null); + } + + nominalFace(nominalFace); + switch (nominalFace) { + case UP: + depth = 1 - depth; + top = 1 - top; + bottom = 1 - bottom; + // Fallthrough + + case DOWN: + pos(0, left, depth, top); + pos(1, left, depth, bottom); + pos(2, right, depth, bottom); + pos(3, right, depth, top); + break; + + case EAST: + depth = 1 - depth; + left = 1 - left; + right = 1 - right; + // Fallthrough + + case WEST: + pos(0, depth, top, left); + pos(1, depth, bottom, left); + pos(2, depth, bottom, right); + pos(3, depth, top, right); + break; + + case SOUTH: + depth = 1 - depth; + left = 1 - left; + right = 1 - right; + // Fallthrough + + case NORTH: + pos(0, 1 - left, top, depth); + pos(1, 1 - left, bottom, depth); + pos(2, 1 - right, bottom, depth); + pos(3, 1 - right, top, depth); + break; + } + + return this; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadTransform.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadTransform.java new file mode 100644 index 00000000000..de76ed61ea6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadTransform.java @@ -0,0 +1,20 @@ +package com.gregtechceu.gtceu.client.util.quad; + +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraftforge.client.model.IQuadTransformer; + +@FunctionalInterface +public interface QuadTransform extends IQuadTransformer { + /** + * Return false to filter out quads from rendering. When more than one transform is in effect, returning false + * means unapplied transforms will not receive the quad. + */ + boolean transform(MutableQuadView quad); + + @Override + default void processInPlace(BakedQuad quad) { + MutableQuadView quadView = MutableQuadView.getInstance().fromVanilla(quad.getVertices(), 0); + this.transform(quadView); + quadView.toVanilla(quad.getVertices(), 0); + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadView.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadView.java new file mode 100644 index 00000000000..9bbe29be364 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadView.java @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.client.util.quad; + +import lombok.Getter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; +import org.joml.Vector2f; +import org.joml.Vector3f; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; +import net.minecraftforge.client.model.QuadTransformers; + +import static com.gregtechceu.gtceu.client.util.quad.EncodingFormat.*; + +/** + * Interface for reading quad data encoded by {@link MeshBuilder}. + * Enables models to do analysis, re-texturing or translation + * without knowing the renderer's vertex formats and without retaining redundant information. + * + * @implNote Base class for all quads / quad makers. Handles the ugly bits of maintaining and encoding the quad state. + */ +@Accessors(fluent = true, chain = true) +public class QuadView { + /** + * See {@link MutableQuadView#nominalFace(Direction)}. + */ + @Getter + protected @Nullable Direction nominalFace; + /** True when geometry flags or light face may not match geometry. */ + protected boolean isGeometryInvalid = true; + protected final Vector3f faceNormal = new Vector3f(); + /** + * Equivalent to {@link BakedQuad#isShade()}. If false, quad should not have shadows cast on it. + * + * @see MutableQuadView#shade(boolean) + */ + @Getter + protected boolean shade = true; + /** + * Equivalent to {@link BakedQuad#hasAmbientOcclusion()}. If false, quad should not have AO. + * + * @see MutableQuadView#ambientOcclusion(boolean) + */ + @Getter + protected boolean ambientOcclusion = true; + /** + * The quad color index serialized with the quad. + */ + @Getter + protected int tintIndex; + + protected long flags = 0; + /** Size and where it comes from will vary in subtypes. But in all cases quad is fully encoded to array. */ + protected int @UnknownNullability [] data; + + /** Beginning of the quad. Also the header index. */ + protected int baseIndex = 0; + + /** + * Use when subtype is "attached" to a pre-existing array. Sets data reference and index and decodes state from + * array. + */ + final void load(int[] data, int baseIndex) { + this.data = data; + this.baseIndex = baseIndex; + load(); + } + + /** + * Like {@link #load(int[], int)} but assumes array and index already set. Only does the decoding part. + */ + public final void load() { + isGeometryInvalid = false; + nominalFace = lightFace(); + + // face normal isn't encoded + GeometryHelper.computeFaceNormal(faceNormal, this); + } + + /** Reference to underlying array. Use with caution. Meant for fast renderer access */ + public int[] data() { + return data; + } + + public int normalFlags() { + return EncodingFormat.normalFlags(flags); + } + + /** True if any vertex normal has been set. */ + public boolean hasVertexNormals() { + return normalFlags() != 0; + } + + protected void computeGeometry() { + if (isGeometryInvalid) { + isGeometryInvalid = false; + + GeometryHelper.computeFaceNormal(faceNormal, this); + + // depends on face normal + flags = EncodingFormat.lightFace(flags, GeometryHelper.lightFace(this)); + } + } + + /** + * Equivalent to {@link BakedQuad#getDirection()}. This is the face used for vanilla lighting calculations and will + * be the block face to which the quad is most closely aligned. + * Always the same as cull face for quads that are on a block face, but never null. + */ + public final Direction lightFace() { + computeGeometry(); + return EncodingFormat.lightFace(flags); + } + + /** + * If non-null, quad should not be rendered in-world if the opposite face of a neighbor block occludes it. + * + * @see MutableQuadView#cullFace(Direction) + */ + public final @Nullable Direction cullFace() { + computeGeometry(); + return EncodingFormat.cullFace(flags); + } + + /** + * Normal of the quad as implied by geometry. Will be invalid if quad vertices are not co-planar. Typically computed + * lazily on demand and not encoded. + * + *

+ * Not typically needed by models. Exposed to enable standard lighting utility functions for use by renderers. + */ + public final Vector3f faceNormal() { + computeGeometry(); + return faceNormal; + } + + /** + * Extracts all quad properties except material to the given {@link MutableQuadView} instance. Must be used before + * calling {link QuadEmitter#emit()} on the target instance. Meant for re-texturing, analysis and static + * transformation use cases. + */ + public void copyTo(MutableQuadView quad) { + computeGeometry(); + + // copy everything except the material + System.arraycopy(data, baseIndex, quad.data, quad.baseIndex, QUAD_STRIDE); + quad.faceNormal.set(faceNormal.x(), faceNormal.y(), faceNormal.z()); + quad.nominalFace = this.nominalFace; + quad.isGeometryInvalid = false; + quad.shade(this.shade); + quad.flags = this.flags; + } + + /** + * Pass a non-null target to avoid allocation - will be returned with values. Otherwise returns a new instance. + */ + public Vector3f copyPos(int vertexIndex, @Nullable Vector3f target) { + if (target == null) { + target = new Vector3f(); + } + + final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; + target.set(Float.intBitsToFloat(data[index]), Float.intBitsToFloat(data[index + 1]), + Float.intBitsToFloat(data[index + 2])); + return target; + } + + /** + * Pass a non-null target to avoid allocation - will be returned with values. Otherwise, returns a new instance. + * Returns null if normal not present. + */ + public @Nullable Vector3f copyNormal(int vertexIndex, @Nullable Vector3f target) { + if (hasNormal(vertexIndex)) { + if (target == null) { + target = new Vector3f(); + } + + final int normal = data[normalIndex(vertexIndex)]; + target.set(GeometryHelper.getPackedNormalComponent(normal, 0), + GeometryHelper.getPackedNormalComponent(normal, 1), + GeometryHelper.getPackedNormalComponent(normal, 2)); + return target; + } else { + return null; + } + } + + /** + * Pass a non-null target to avoid allocation - will be returned with values. Otherwise returns a new instance. + */ + public Vector2f copyUv(int vertexIndex, @Nullable Vector2f target) { + if (target == null) { + target = new Vector2f(); + } + + target.set(u(vertexIndex), v(vertexIndex)); + return target; + } + + /** + * Retrieve geometric position, x coordinate. + */ + public float x(int vertexIndex) { + return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X]); + } + + + /** + * Retrieve geometric position, y coordinate. + */ + public float y(int vertexIndex) { + return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Y]); + } + + /** + * Retrieve geometric position, z coordinate. + */ + public float z(int vertexIndex) { + return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Z]); + } + + /** + * Retrieve vertex color. + */ + public int color(int vertexIndex) { + return data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR]; + } + + /** + * Convenience: access x, y, z by index 0-2. + */ + public float posByIndex(int vertexIndex, int coordinateIndex) { + return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X + coordinateIndex]); + } + + /** + * If false, no vertex normal was provided. Lighting should use face normal in that case. + */ + public boolean hasNormal(int vertexIndex) { + return (normalFlags() & (1 << vertexIndex)) != 0; + } + + protected final int normalIndex(int vertexIndex) { + return baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL; + } + + /** + * Will return {@link Float#NaN} if normal not present. + */ + public float normalX(int vertexIndex) { + return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 0) + : Float.NaN; + } + + /** + * Will return {@link Float#NaN} if normal not present. + */ + public float normalY(int vertexIndex) { + return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 1) + : Float.NaN; + } + + /** + * Will return {@link Float#NaN} if normal not present. + */ + public float normalZ(int vertexIndex) { + return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 2) + : Float.NaN; + } + + /** + * Minimum block brightness. Zero if not set. + */ + public int lightmap(int vertexIndex) { + return data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_LIGHTMAP]; + } + + /** + * Retrieve horizontal texture coordinates. + */ + public float u(int vertexIndex) { + return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U]); + } + + /** + * Retrieve vertical texture coordinates. + */ + public float v(int vertexIndex) { + return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_V]); + } + + /** + * Reads baked vertex data and outputs standard {@link BakedQuad#getVertices() baked quad vertex data} in the given + * array and location. + * + * @param target Target array for the baked quad data. + * + * @param targetIndex Starting position in target array - array must have at least 28 elements available at this + * index. + */ + public final void toVanilla(int[] target, int targetIndex) { + System.arraycopy(data, baseIndex, target, targetIndex, QUAD_STRIDE); + + // The color is the fourth integer in each vertex. + // EncodingFormat.VERTEX_COLOR is not used because it also + // contains the header size; vanilla quads do not have a header. + int colorIndex = targetIndex + 3; + + for (int i = 0; i < 4; i++) { + target[colorIndex] = QuadTransformers.toABGR(target[colorIndex]); + colorIndex += VERTEX_STRIDE; + } + } + + /** + * Generates a new BakedQuad instance with texture coordinates and colors from the given sprite. + * + * @param sprite {@link MutableQuadView} does not serialize sprites so the sprite must be provided by the caller. + * + * @return A new baked quad instance with the closest-available appearance supported by vanilla features. Will + * retain emissive light maps, for example, but the standard Minecraft renderer will not use them. + */ + public BakedQuad toBakedQuad(TextureAtlasSprite sprite) { + int[] vertexData = new int[QUAD_STRIDE]; + toVanilla(vertexData, 0); + return new BakedQuad(vertexData, tintIndex(), lightFace(), sprite, shade()); + } + + @SuppressWarnings("deprecation") + public BakedQuad toBlockBakedQuad() { + var finder = SpriteFinder.get(Minecraft.getInstance().getModelManager() + .getAtlas(TextureAtlas.LOCATION_BLOCKS)); + return toBakedQuad(finder.find(this)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/SpriteFinder.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/SpriteFinder.java new file mode 100644 index 00000000000..6ed318dee77 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/SpriteFinder.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.client.util.quad; + +import java.util.Map; +import java.util.function.Consumer; + +import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +import org.jetbrains.annotations.Nullable; + +/** + * Indexes a texture atlas to allow fast lookup of Sprites from baked vertex coordinates. + * Main use is for {@link Mesh}-based models to generate vanilla quads on demand + * without tracking and retaining the sprites that were baked into the mesh. + * In other words, this class supplies the sprite parameter for + * {@link QuadView#toBakedQuad(TextureAtlasSprite)}. + * + * @implNote Implementation is a straightforward quad tree. + * Other options that were considered were linear search (slow) and direct indexing of fixed-size cells. + * Direct indexing would be fastest but would be memory-intensive for large atlases + * and unsuitable for any atlas that isn't consistently aligned to a fixed cell size. + */ +public class SpriteFinder { + + /** + * Retrieves or creates the finder for the given atlas. Instances should not be retained as fields or they must be + * refreshed whenever there is a resource reload or other event that causes atlas textures to be re-stitched. + */ + public static SpriteFinder get(TextureAtlas atlas) { + return ((SpriteFinderAccess) atlas).gtceu$spriteFinder(); + } + + private final Node root; + private final TextureAtlas spriteAtlasTexture; + + public SpriteFinder(Map sprites, TextureAtlas spriteAtlasTexture) { + root = new Node(0.5f, 0.5f, 0.25f); + this.spriteAtlasTexture = spriteAtlasTexture; + sprites.values().forEach(root::add); + } + + /** + * Finds the atlas sprite containing the vertex centroid of the quad. Vertex centroid is essentially the mean u,v + * coordinate - the intent being to find a point that is unambiguously inside the sprite (vs on an edge.) + * + *

+ * Should be reliable for any convex quad or triangle. May fail for non-convex quads. Note that all the above refers + * to u,v coordinates. Geometric vertex does not matter, except to the extent it was used to determine u,v. + */ + public TextureAtlasSprite find(QuadView quad) { + float u = 0; + float v = 0; + + for (int i = 0; i < 4; i++) { + u += quad.u(i); + v += quad.v(i); + } + + return find(u * 0.25f, v * 0.25f); + } + + /** + * Alternative to {@link #find(QuadView)} when vertex centroid is already known or unsuitable. + * Expects normalized (0-1) coordinates on the atlas texture, which should already be the case for u,v values + * in vanilla baked quads and in {@link QuadView} after calling + * {@link MutableQuadView#spriteBake(TextureAtlasSprite, int)}. + * + *

+ * Coordinates must be in the sprite interior for reliable results. + * Generally it'll be easier to use {@link #find(QuadView)} unless you know + * the vertex centroid will somehow not be in the quad interior. + * This method will be slightly faster if you already have the centroid or another appropriate value. + */ + public TextureAtlasSprite find(float u, float v) { + return root.find(u, v); + } + + private class Node { + final float midU; + final float midV; + final float cellRadius; + @Nullable Object lowLow = null; + @Nullable Object lowHigh = null; + @Nullable Object highLow = null; + @Nullable Object highHigh = null; + + Node(float midU, float midV, float radius) { + this.midU = midU; + this.midV = midV; + cellRadius = radius; + } + + static final float EPS = Mth.EPSILON; + + void add(TextureAtlasSprite sprite) { + final boolean lowU = sprite.getU0() < midU - EPS; + final boolean highU = sprite.getU1() > midU + EPS; + final boolean lowV = sprite.getV0() < midV - EPS; + final boolean highV = sprite.getV1() > midV + EPS; + + if (lowU && lowV) { + addInner(sprite, lowLow, -1, -1, q -> lowLow = q); + } + + if (lowU && highV) { + addInner(sprite, lowHigh, -1, 1, q -> lowHigh = q); + } + + if (highU && lowV) { + addInner(sprite, highLow, 1, -1, q -> highLow = q); + } + + if (highU && highV) { + addInner(sprite, highHigh, 1, 1, q -> highHigh = q); + } + } + + private void addInner(TextureAtlasSprite sprite, @Nullable Object quadrant, int uStep, int vStep, + Consumer setter) { + if (quadrant == null) { + setter.accept(sprite); + } else if (quadrant instanceof Node node) { + node.add(sprite); + } else { + Node n = new Node(midU + cellRadius * uStep, midV + cellRadius * vStep, cellRadius * 0.5f); + + if (quadrant instanceof TextureAtlasSprite) { + n.add((TextureAtlasSprite) quadrant); + } + + n.add(sprite); + setter.accept(n); + } + } + + private TextureAtlasSprite find(float u, float v) { + if (u < midU) { + return v < midV ? findInner(lowLow, u, v) : findInner(lowHigh, u, v); + } else { + return v < midV ? findInner(highLow, u, v) : findInner(highHigh, u, v); + } + } + + private TextureAtlasSprite findInner(@Nullable Object quadrant, float u, float v) { + if (quadrant instanceof TextureAtlasSprite sprite) { + return sprite; + } else if (quadrant instanceof Node node) { + return node.find(u, v); + } else { + return spriteAtlasTexture.getSprite(MissingTextureAtlasSprite.getLocation()); + } + } + } + + public interface SpriteFinderAccess { + SpriteFinder gtceu$spriteFinder(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/package-info.java new file mode 100644 index 00000000000..f6a6ca48793 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.client.util.quad; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java new file mode 100644 index 00000000000..8d47b277774 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java @@ -0,0 +1,209 @@ +/* + * This file is part of CodeChickenLib. + * Copyright (c) 2018, covers1624, All rights reserved. + * + * CodeChickenLib is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * CodeChickenLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CodeChickenLib. If not, see . + */ +package com.gregtechceu.gtceu.client.util.quad.transformers; + +import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; +import com.gregtechceu.gtceu.client.util.quad.MutableQuadView; +import com.gregtechceu.gtceu.client.util.quad.QuadTransform; + +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; + +import org.jetbrains.annotations.Nullable; + +import static net.minecraft.core.Direction.AxisDirection.*; +import static net.minecraft.core.Direction.*; + +/** + * This transformer is a little complicated. + * Basically, a Facade / Cover can use this to 'kick' the edges of quads in to fix Z-fighting in the corners. + *

+ * Use it by specifying + *

    + *
  • the side of the block you are on,
  • + *
  • the bitmask for where the other Facades / Covers are,
  • + *
  • the bounding box of the facade (NOT the hole piece),
  • + *
  • and the thickness of your Facade / Cover (which is used as the kick amount).
  • + *
+ * + * @author covers1624 + */ +public class QuadCornerKicker implements QuadTransform { + + public static final QuadCornerKicker INSTANCE = new QuadCornerKicker(); + + // Simple horizonal lookups. + public static Direction[][] horizonals = new Direction[][] { + // Around Y axis, NSWE. + { NORTH, SOUTH, WEST, EAST }, + { NORTH, SOUTH, WEST, EAST }, + + // Around Z axis, DUWE. + { DOWN, UP, WEST, EAST }, + { DOWN, UP, WEST, EAST }, + + // Around X axis, DUNS. + { DOWN, UP, NORTH, SOUTH }, + { DOWN, UP, NORTH, SOUTH } }; + + private Direction mySide; + private int facadeMask; + private AABB bounds; + private double thickness; + + public QuadCornerKicker() { + super(); + } + + /** + * Set's the side this Facade / Cover is attached to. + * + * @param side The side. + */ + public void setSide(Direction side) { + this.mySide = side; + } + + /** + * Sets the bitmask of Facades / Covers in the block space. + * This is as simple as {@code mask = (1 << side)}. + * + * @param mask The mask. + */ + public void setFacadeMask(int mask) { + this.facadeMask = mask; + } + + /** + * Sets the bounding box of the Facade / Cover, this should be the full box, not just a piece of the hole's 'ring'. + * + * @param bounds The bounding box. + */ + public void setBounds(AABB bounds) { + this.bounds = bounds; + } + + /** + * Sets the amount to kick the vertex in by, this is your facades thickness. + * + * @param thickness The thickness. + */ + public void setThickness(double thickness) { + this.thickness = thickness; + } + + @Override + public boolean transform(MutableQuadView quad) { + Direction side = quad.nominalFace(); + if (side == this.mySide || side == this.mySide.getOpposite()) { + return true; + } + for (Direction hoz : horizonals[this.mySide.get3DDataValue()]) { + if (side == hoz || side == hoz.getOpposite() || (this.facadeMask & (1 << hoz.ordinal())) == 0) { + continue; + } + Corner corner = Corner.fromSides(this.mySide.getOpposite(), side, hoz); + for (int i = 0; i < 4; i++) { + float x = quad.posByIndex(i, 0); + float y = quad.posByIndex(i, 1); + float z = quad.posByIndex(i, 2); + if (Mth.equal(x, corner.pX(this.bounds)) + && Mth.equal(y, corner.pY(this.bounds)) + && Mth.equal(z, corner.pZ(this.bounds))) { + Vec3i normal = hoz.getNormal(); + x -= normal.getX() * this.thickness; + y -= normal.getY() * this.thickness; + z -= normal.getZ() * this.thickness; + quad.pos(i, x, y, z); + } + } + } + + return true; + } + + @Override + public void processInPlace(BakedQuad quad) { + + } + + public enum Corner { + + MIN_X_MIN_Y_MIN_Z(NEGATIVE, NEGATIVE, NEGATIVE), + MIN_X_MIN_Y_MAX_Z(NEGATIVE, NEGATIVE, POSITIVE), + MIN_X_MAX_Y_MIN_Z(NEGATIVE, POSITIVE, NEGATIVE), + MIN_X_MAX_Y_MAX_Z(NEGATIVE, POSITIVE, POSITIVE), + + MAX_X_MIN_Y_MIN_Z(POSITIVE, NEGATIVE, NEGATIVE), + MAX_X_MIN_Y_MAX_Z(POSITIVE, NEGATIVE, POSITIVE), + MAX_X_MAX_Y_MIN_Z(POSITIVE, POSITIVE, NEGATIVE), + MAX_X_MAX_Y_MAX_Z(POSITIVE, POSITIVE, POSITIVE); + + private final AxisDirection xAxis; + private final AxisDirection yAxis; + private final AxisDirection zAxis; + + public static final Corner[] VALUES = values(); + private static final int[] sideMask = { 0, 2, 0, 1, 0, 4 }; + + Corner(AxisDirection xAxis, AxisDirection yAxis, AxisDirection zAxis) { + this.xAxis = xAxis; + this.yAxis = yAxis; + this.zAxis = zAxis; + } + + /** + * Used to find what corner is at the 3 sides. + * This method assumes you pass in the X axis side, Y axis side, and Z axis side, + * it will NOT complain about an invalid side, you will just get garbage data. + * This method also does not care what order the 3 axes are in. + * + * @param sideA Side one. + * @param sideB Side two. + * @param sideC Side three. + * @return The corner at the 3 sides. + */ + public static Corner fromSides(@Nullable Direction sideA, + @Nullable Direction sideB, + @Nullable Direction sideC) { + int aIndex = GeometryHelper.toFaceIndex(sideA); + int bIndex = GeometryHelper.toFaceIndex(sideB); + int cIndex = GeometryHelper.toFaceIndex(sideC); + + // <3 Chicken-Bones. + return Corner.VALUES[sideMask[aIndex] | sideMask[bIndex] | sideMask[cIndex]]; + } + + public float pX(AABB box) { + return (float) (this.xAxis == NEGATIVE ? box.minX : box.maxX); + } + + public float pY(AABB box) { + return (float) (this.yAxis == NEGATIVE ? box.minY : box.maxY); + } + + public float pZ(AABB box) { + return (float) (this.zAxis == NEGATIVE ? box.minZ : box.maxZ); + } + } + +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java new file mode 100644 index 00000000000..dc1620e49c1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gregtechceu.gtceu.core.mixins.client; + +import com.gregtechceu.gtceu.client.util.quad.SpriteFinder; + +import java.util.Map; + +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.client.renderer.texture.SpriteLoader; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; + +@Mixin(TextureAtlas.class) +public class TextureAtlasMixin implements SpriteFinder.SpriteFinderAccess { + @Shadow + private Map texturesByName; + + @Unique + private SpriteFinder gtceu$spriteFinder = null; + + @Inject(at = @At("TAIL"), method = "upload") + private void uploadHook(SpriteLoader.Preparations preparations, CallbackInfo info) { + gtceu$spriteFinder = null; + } + + @Override + public @NotNull SpriteFinder gtceu$spriteFinder() { + if (this.gtceu$spriteFinder == null) { + this.gtceu$spriteFinder = new SpriteFinder(texturesByName, (TextureAtlas) (Object) this); + } + return this.gtceu$spriteFinder; + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 200c8d9795b..cd2192122ee 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -21,6 +21,7 @@ "client.ModelManagerMixin", "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", + "client.TextureAtlasMixin", "client.VariantDeserializerMixin", "dev.client.KeyboardHandlerMixin", "ftbchunks.FTBChunksClientMixin", From 271e51df310c1dfc4159350e5c41eb89b8417c69 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 17:09:32 +0300 Subject: [PATCH 100/269] Move all internal asset reload listeners (including the CTM model replacer) to ModelEventHelper#initInternalAssetReloadListeners --- .../gregtechceu/gtceu/client/ClientProxy.java | 89 +----------- .../gtceu/client/util/ModelEventHelper.java | 130 +++++++++++++----- .../client/util/TextureMetadataHelper.java | 67 +++++++++ .../gregtechceu/gtceu/utils/ResourceUtil.java | 81 ----------- 4 files changed, 163 insertions(+), 204 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 29f6b91575f..30b452f69c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,9 +8,7 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; -import com.gregtechceu.gtceu.client.model.ctm.CTMBakedModel; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; -import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; @@ -54,20 +52,14 @@ import com.gregtechceu.gtceu.integration.map.layer.Layers; import com.gregtechceu.gtceu.integration.map.layer.builtin.FluidRenderLayer; import com.gregtechceu.gtceu.integration.map.layer.builtin.OreRenderLayer; -import com.gregtechceu.gtceu.utils.ResourceUtil; import com.gregtechceu.gtceu.utils.data.RuntimeBlockstateProvider; import com.gregtechceu.gtceu.utils.input.SyncedKeyMapping; -import com.lowdragmc.lowdraglib.client.model.custommodel.CustomBakedModel; - import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; import net.minecraft.client.renderer.blockentity.HangingSignRenderer; import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer; -import net.minecraft.client.resources.model.Material; -import net.minecraft.client.resources.model.ModelResourceLocation; -import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraftforge.client.ForgeHooksClient; @@ -80,7 +72,6 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -import java.io.IOException; import java.util.*; public class ClientProxy extends CommonProxy { @@ -102,6 +93,7 @@ public static void init() { CommonEventListener.registerCapes(new RegisterGTCapesEvent()); } initializeDynamicRenders(); + ModelEventHelper.initInternalAssetReloadListeners(); } @SubscribeEvent @@ -169,7 +161,7 @@ public void onClientSetup(FMLClientSetupEvent event) { } } - public static void initializeDynamicRenders() { + private static void initializeDynamicRenders() { DynamicRenderManager.register(GTCEu.id("quantum_tank_fluid"), QuantumTankFluidRender.TYPE); DynamicRenderManager.register(GTCEu.id("quantum_chest_item"), QuantumChestItemRender.TYPE); @@ -187,83 +179,6 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register(MachineModelLoader.ID.getPath(), MachineModelLoader.INSTANCE); event.register(PipeModelLoader.ID.getPath(), PipeModelLoader.INSTANCE); event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); - - // register CTM model (un)wrapper - ModelEventHelper.registerBakeEventListener(false, (originalModelName, baked, rootUnbaked, modelBakery) -> { - // Unwrap all machine models from LDLib CTM models so we don't need to be as aggressive with mixins - if (baked instanceof CustomBakedModel ctmModel) { - if (ctmModel.getParent() instanceof MachineModel machineModel) { - return machineModel; - } else { - // Skip LDLib CTM models - return baked; - } - } - if (baked.isCustomRenderer()) { - // 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 (!(originalModelName instanceof ModelResourceLocation) || rootUnbaked == null || baked instanceof CTMBakedModel) { - return baked; - } - Deque dependencies = new ArrayDeque<>(); - Set seenModels = new HashSet<>(); - dependencies.push(originalModelName); - seenModels.add(originalModelName); - - boolean shouldWrap = ModelEventHelper.WRAPPED_MODELS.getOrDefault(originalModelName, false); - // Breadth-first loop through dependencies - // exiting as soon as a CTM texture is found, and skipping duplicates/cycles - PARENT_LOOP: - while (!shouldWrap && !dependencies.isEmpty()) { - ResourceLocation dependencyModelName = dependencies.pop(); - UnbakedModel unbaked; - try { - unbaked = dependencyModelName == originalModelName ? rootUnbaked - : modelBakery.getModel(dependencyModelName); - } catch (Exception e) { - continue; - } - try { - // have to copy because the set is updated during this loop - @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") - Set textures = new HashSet<>(ModelEventHelper.getModelUsedCTMTextures(dependencyModelName)); - for (Material tex : textures) { - Optional meta = Optional.empty(); - // Cache all dependent texture metadata - // TODO lazy - try { - meta = ResourceUtil.getMetadata(ResourceUtil.spriteToAbsolute(tex.texture())); - } catch (IOException ignored) {} // Fallthrough - if (meta.isPresent()) { - // At least one texture has CTM metadata, so we should wrap this model - shouldWrap = true; - break PARENT_LOOP; - } - } - // shouldWrap is always false here because of the `break` above - for (ResourceLocation newDep : unbaked.getDependencies()) { - if (seenModels.add(newDep)) { - dependencies.push(newDep); - } - } - } catch (Exception e) { - GTCEu.LOGGER.error("Error loading dependency {} for model {}. Skipping...", - dependencyModelName, originalModelName, e); - } - } - ModelEventHelper.WRAPPED_MODELS.put(originalModelName, shouldWrap); - if (shouldWrap) { - return new CTMBakedModel<>(baked); - } - - return baked; - }); } @SubscribeEvent(priority = EventPriority.HIGHEST) 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 c7a1cfb23ab..bd94a742896 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -1,16 +1,14 @@ package com.gregtechceu.gtceu.client.util; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.model.ctm.CTMBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; -import com.lowdragmc.lowdraglib.client.model.custommodel.LDLMetadataSection; - import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.*; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ModelEvent; @@ -30,29 +28,27 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; +@SuppressWarnings("deprecation") @UtilityClass @Mod.EventBusSubscriber(modid = GTCEu.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class ModelEventHelper { + @ApiStatus.Internal + public record EventListenerHolder(T listener, boolean removeOnReload) {} + @ApiStatus.Internal public static final List> EVENT_LISTENERS = new ArrayList<>(); @ApiStatus.Internal public static final Map CTM_SPRITE_CACHE = new ConcurrentHashMap<>(); private static final Multimap SCRAPED_TEXTURES = HashMultimap.create(); - @ApiStatus.Internal - public static final Object2BooleanMap WRAPPED_MODELS = new Object2BooleanOpenHashMap<>(); + private static final Object2BooleanMap WRAPPED_MODELS = new Object2BooleanOpenHashMap<>(); @ApiStatus.Internal public static void markTextureUsedForModel(ResourceLocation modelLocation, Material material) { SCRAPED_TEXTURES.put(modelLocation, material); } - @ApiStatus.Internal - public static Collection getModelUsedCTMTextures(ResourceLocation modelLocation) { - return SCRAPED_TEXTURES.get(modelLocation); - } - public static void registerAtlasStitchedEventListener(boolean removeOnReload, AssetEventListener.AtlasStitched listener) { EVENT_LISTENERS.add(new EventListenerHolder<>(listener, removeOnReload)); @@ -79,36 +75,17 @@ public static void registerAddModelsEventListener(boolean removeOnReload, @SubscribeEvent(priority = EventPriority.HIGH) public static void registerReloadListener(RegisterClientReloadListenersEvent event) { - event.registerReloadListener(new ResourceManagerReloadListener() { + event.registerReloadListener((ResourceManagerReloadListener) resourceManager -> { + EVENT_LISTENERS.removeIf(EventListenerHolder::removeOnReload); - @Override - public void onResourceManagerReload(ResourceManager resourceManager) { - EVENT_LISTENERS.removeIf(EventListenerHolder::removeOnReload); - } + CTM_SPRITE_CACHE.clear(); + TextureMetadataHelper.invalidateCaches(); }); } - @SuppressWarnings({ "unchecked", "deprecation" }) + @SuppressWarnings("unchecked") @SubscribeEvent(priority = EventPriority.LOWEST) public static void onAtlasStitched(TextureStitchEvent.Post event) { - TextureAtlas atlas = event.getAtlas(); - if (atlas.location().equals(TextureAtlas.LOCATION_BLOCKS)) { - // Cache all textures' CTM metadata - // TODO lazy - CTM_SPRITE_CACHE.clear(); - for (ResourceLocation location : event.getAtlas().getTextureLocations()) { - ResourceLocation absLoc = LDLMetadataSection.spriteToAbsolute(location); - LDLMetadataSection section = LDLMetadataSection.getMetadata(absLoc); - if (section.connection != null) { - TextureAtlasSprite ctmSprite = event.getAtlas().getSprite(section.connection); - CTM_SPRITE_CACHE.put(location, ctmSprite); - } - } - - MachineModel.initSprites(atlas); - ICoverableRenderer.initSprites(atlas); - } - for (var listener : EVENT_LISTENERS) { if (!(listener.listener instanceof AssetEventListener assetEventListener)) continue; @@ -121,7 +98,7 @@ public static void onAtlasStitched(TextureStitchEvent.Post event) { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onModifyBakingResult(ModelEvent.ModifyBakingResult event) { - // don't process baked model replacement here if modernfix is loaded, as + // don't process baked model replacement here if ModernFix is loaded, as // GTModernFixIntegration#onBakedModelLoad does the same thing & it's always called if (GTCEu.Mods.isModernFixLoaded()) return; @@ -151,6 +128,87 @@ public static void onRegisterAdditional(ModelEvent.RegisterAdditional event) { } } + // INTERNAL ASSET RELOAD LISTENER REGISTRATION + @ApiStatus.Internal - public record EventListenerHolder(T listener, boolean removeOnReload) {} + public static void initInternalAssetReloadListeners() { + registerAtlasStitchedEventListener(false, TextureAtlas.LOCATION_BLOCKS, event -> { + TextureAtlas atlas = event.getAtlas(); + // Cache all textures' CTM metadata + // TODO lazy + for (ResourceLocation location : atlas.getTextureLocations()) { + var sec = TextureMetadataHelper.getMetadataFromRelativeLocation(location); + sec.ifPresent(section -> { + if (section.connectionTexture() != null) { + TextureAtlasSprite ctmSprite = atlas.getSprite(section.connectionTexture()); + CTM_SPRITE_CACHE.put(location, ctmSprite); + } + }); + } + + MachineModel.initSprites(atlas); + ICoverableRenderer.initSprites(atlas); + }); + + // register CTM model wrapper + ModelEventHelper.registerBakeEventListener(false, (rl, baked, rootModel, modelBakery) -> { + if (baked.isCustomRenderer()) { + // 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 (!(rl instanceof ModelResourceLocation) || rootModel == null || baked instanceof CTMBakedModel) { + return baked; + } + Deque dependencies = new ArrayDeque<>(); + Set seenModels = new HashSet<>(); + dependencies.push(rl); + seenModels.add(rl); + + boolean shouldWrap = ModelEventHelper.WRAPPED_MODELS.getOrDefault(rl, false); + // Breadth-first loop through dependencies + // exiting as soon as a CTM texture is found, and skipping duplicates/cycles + PARENT_LOOP: + while (!shouldWrap && !dependencies.isEmpty()) { + ResourceLocation dependencyName = dependencies.pop(); + UnbakedModel unbaked; + try { + unbaked = dependencyName == rl ? rootModel : modelBakery.getModel(dependencyName); + } catch (Exception e) { + continue; + } + try { + // have to copy because the set is updated during this loop + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") + Set textures = new HashSet<>(SCRAPED_TEXTURES.get(dependencyName)); + for (Material tex : textures) { + if (TextureMetadataHelper.getMetadata(tex).isPresent()) { + // At least one texture has CTM metadata, so we should wrap this model + shouldWrap = true; + break PARENT_LOOP; + } + } + // shouldWrap is always false here because of the `break` above + for (ResourceLocation newDep : unbaked.getDependencies()) { + if (seenModels.add(newDep)) { + dependencies.push(newDep); + } + } + } catch (Exception e) { + GTCEu.LOGGER.error("Error loading dependency {} for model {}. Skipping...", + dependencyName, rl, e); + } + } + ModelEventHelper.WRAPPED_MODELS.put(rl, shouldWrap); + if (shouldWrap) { + return new CTMBakedModel<>(baked); + } + + return baked; + }); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java new file mode 100644 index 00000000000..515e895ec2f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -0,0 +1,67 @@ +package com.gregtechceu.gtceu.client.util; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.model.ctm.GTTextureMetadata; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.Material; +import net.minecraft.resources.ResourceLocation; + +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +@UtilityClass +public class TextureMetadataHelper { + + private static final Map metadataCache = new HashMap<>(); + + public static Optional getMetadata(ResourceLocation res) { + // Note, semantically different from computeIfAbsent, as we DO care about keys mapped to null values + if (metadataCache.containsKey(res)) { + return Optional.ofNullable(metadataCache.get(res)); + } + Optional ret; + try { + ret = Minecraft.getInstance().getResourceManager().getResource(res) + .flatMap(GTTextureMetadata::getForResourceUnsafe); + } catch (Exception e) { + // the real exception that's caught should always be an IOException, + // but @SneakyThrows hides that from us so we catch all exceptions instead. + ret = Optional.empty(); + GTCEu.LOGGER.error("Error loading metadata for location {}", res, e); + } + ret.ifPresentOrElse(r -> metadataCache.put(res, r), () -> metadataCache.put(res, null)); + return ret; + } + + public static Optional getMetadata(TextureAtlasSprite sprite) { + return getMetadata(spriteToAbsolute(sprite.contents().name())); + } + + public static Optional getMetadata(Material material) { + return getMetadata(spriteToAbsolute(material.texture())); + } + + public static Optional getMetadataFromRelativeLocation(ResourceLocation relativeLocation) { + return getMetadata(spriteToAbsolute(relativeLocation)); + } + + public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { + if (!sprite.getPath().startsWith("textures/")) { + sprite = sprite.withPrefix("textures/"); + } + if (!sprite.getPath().endsWith(".png")) { + sprite = sprite.withSuffix(".png"); + } + return sprite; + } + + static void invalidateCaches() { + metadataCache.clear(); + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java deleted file mode 100644 index f8bb663cdae..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/utils/ResourceUtil.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.gregtechceu.gtceu.utils; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.Resource; - -import com.google.gson.JsonParseException; -import lombok.experimental.UtilityClass; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.HashMap; -import java.util.Optional; - -@UtilityClass -public class ResourceUtil { - - public static Resource getResource(TextureAtlasSprite sprite) throws IOException { - return getResource(spriteToAbsolute(sprite.contents().name())); - } - - public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { - if (!sprite.getPath().startsWith("textures/")) { - sprite = sprite.withPrefix("textures/"); - } - if (!sprite.getPath().endsWith(".png")) { - sprite = sprite.withSuffix(".png"); - } - return sprite; - } - - public static Resource getResource(ResourceLocation res) throws FileNotFoundException { - return Minecraft.getInstance().getResourceManager().getResourceOrThrow(res); - } - - public static Resource getResourceUnsafe(ResourceLocation res) { - try { - return getResource(res); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static final Map metadataCache = new HashMap<>(); - private static final IMetadataSectionCTM.Serializer SERIALIZER = new IMetadataSectionCTM.Serializer(); - - public static Optional getMetadata(ResourceLocation res) throws IOException { - // Note, semantically different from computeIfAbsent, as we DO care about keys mapped to null values - if (metadataCache.containsKey(res)) { - return Optional.ofNullable(metadataCache.get(res)); - } - Optional ret; - try { - Resource resource = getResource(res); - ret = resource.metadata().getSection(SERIALIZER); - } catch (FileNotFoundException e) { - ret = Optional.empty(); - } catch (JsonParseException e) { - throw new IOException("Error loading metadata for location " + res, e); - } - ret.ifPresentOrElse(r -> metadataCache.put(res, r), () -> metadataCache.put(res, null)); - return ret; - } - - public static Optional getMetadata(TextureAtlasSprite sprite) throws IOException { - return getMetadata(spriteToAbsolute(sprite.contents().name())); - } - - public static Optional getMetadataUnsafe(TextureAtlasSprite sprite) { - try { - return getMetadata(sprite); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static void invalidateCaches() { - metadataCache.clear(); - } -} \ No newline at end of file From 5eff24fbdd555a0a53a0616ebc17d4d615e847f2 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 17:10:53 +0300 Subject: [PATCH 101/269] Move GTQuadTransformers to `client.util.quad.transformers` --- .../gtceu/client/model/TextureOverrideModel.java | 2 +- .../gtceu/client/model/pipe/BakedPipeModel.java | 2 +- .../gtceu/client/renderer/cover/FacadeCoverRenderer.java | 2 +- .../com/gregtechceu/gtceu/client/util/quad/QuadUtils.java | 1 + .../util/quad/{ => transformers}/GTQuadTransformers.java | 8 ++++---- 5 files changed, 8 insertions(+), 7 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/util/quad/{ => transformers}/GTQuadTransformers.java (95%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java index 0b34bcf432b..b8a0492a13a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.model; -import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; +import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java index cb8e67085b1..c6df01e5622 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/pipe/BakedPipeModel.java @@ -9,7 +9,7 @@ import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.util.RenderUtil; -import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; +import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java index c5d1094b28f..731a05a881c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java @@ -7,7 +7,7 @@ import com.gregtechceu.gtceu.client.model.TextureOverrideModel; import com.gregtechceu.gtceu.client.util.FacadeBlockAndTintGetter; import com.gregtechceu.gtceu.client.util.RenderUtil; -import com.gregtechceu.gtceu.client.util.quad.GTQuadTransformers; +import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.cover.FacadeCover; import com.gregtechceu.gtceu.common.item.behavior.FacadeItemBehaviour; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index d51c30ea856..391a0024726 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.client.util.quad; import com.gregtechceu.gtceu.client.model.ctm.CTMCache; +import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/GTQuadTransformers.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/GTQuadTransformers.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/GTQuadTransformers.java rename to src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/GTQuadTransformers.java index ccb3dd07099..3b56dd4c519 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/GTQuadTransformers.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/GTQuadTransformers.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.util.quad.transformers; import net.minecraft.client.renderer.FaceInfo; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -62,9 +62,9 @@ public static BakedQuad setSprite(BakedQuad quad, TextureAtlasSprite sprite) { vertices[offset] = Float.floatToRawIntBits(u); vertices[offset + 1] = Float.floatToRawIntBits(v); } - BakedQuad newQuad = new BakedQuad(vertices, quad.getTintIndex(), quad.getDirection(), - sprite, quad.isShade(), quad.hasAmbientOcclusion()); - return newQuad.gtceu$setTextureKey(quad.gtceu$getTextureKey()); + return new BakedQuad(vertices, quad.getTintIndex(), quad.getDirection(), + sprite, quad.isShade(), quad.hasAmbientOcclusion()) + .gtceu$setTextureKey(quad.gtceu$getTextureKey()); } public static BakedQuad setColor(BakedQuad quad, int argbColor, boolean clearTintIndex) { From 5226e481f6778fa365194ff38ecfe7291efa21db Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 17:11:12 +0300 Subject: [PATCH 102/269] Add GTTextureMetadata (forgot to commit this) --- .../client/model/ctm/GTTextureMetadata.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java 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 new file mode 100644 index 00000000000..f0e28744fd6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java @@ -0,0 +1,65 @@ +package com.gregtechceu.gtceu.client.model.ctm; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.metadata.MetadataSectionSerializer; +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; +import java.util.function.Function; + +public record GTTextureMetadata(@Nullable ResourceLocation connectionTexture) { + + public static final String SECTION_NAME = GTCEu.MOD_ID; + public static final MetadataSectionSerializer SERIALIZER = new Serializer(); + + /** + * @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 = new ResourceLocation("", ""); + + // spotless:off + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ResourceLocation.CODEC.optionalFieldOf("connection", EMPTY_CONNECTION).forGetter(GTTextureMetadata::connectionTexture) + ).apply(instance, GTTextureMetadata::new)); + // spotless:on + + @Override + public GTTextureMetadata fromJson(@Nullable JsonObject json) throws JsonParseException { + return CODEC.parse(JsonOps.INSTANCE, json).get() + .map(Function.identity(), r -> { + throw new JsonParseException(r.message()); + }); + } + + @Override + public String getMetadataSectionName() { + return SECTION_NAME; + } + } + +} \ No newline at end of file From b327fe685e3dec9e5a9302a9c643962d7c20734a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:48:13 +0300 Subject: [PATCH 103/269] Move classes again --- .../client/{util => model}/quad/EncodingFormat.java | 4 +++- .../gtceu/client/{util => model}/quad/Mesh.java | 2 +- .../gtceu/client/{util => model}/quad/MeshBuilder.java | 2 +- .../client/{util => model}/quad/MutableQuadView.java | 10 +++++----- .../gtceu/client/{util => model}/quad/QuadView.java | 6 ++++-- .../client/{util => model}/quad/SpriteFinder.java | 2 +- .../client/{util => model}/quad/StaticFaceBakery.java | 2 +- .../client/{util => model}/quad/package-info.java | 2 +- .../quad => model/quad/transform}/QuadTransform.java | 4 +++- .../client/renderer/cover/FacadeCoverRenderer.java | 2 +- .../gtceu/client/renderer/cover/IOCoverRenderer.java | 2 +- .../client/renderer/cover/SimpleCoverRenderer.java | 2 +- .../gregtechceu/gtceu/client/util/TextureHelper.java | 2 +- .../gtceu/client/util/quad/GeometryHelper.java | 1 + .../util/quad/transformers/QuadCornerKicker.java | 5 +++-- 15 files changed, 28 insertions(+), 20 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/EncodingFormat.java (97%) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/Mesh.java (96%) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/MeshBuilder.java (98%) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/MutableQuadView.java (97%) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/QuadView.java (98%) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/SpriteFinder.java (99%) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/StaticFaceBakery.java (99%) rename src/main/java/com/gregtechceu/gtceu/client/{util => model}/quad/package-info.java (58%) rename src/main/java/com/gregtechceu/gtceu/client/{util/quad => model/quad/transform}/QuadTransform.java (84%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/EncodingFormat.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/EncodingFormat.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java index 18eaa10ef2c..0005d09728c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/EncodingFormat.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java @@ -14,7 +14,9 @@ * limitations under the License. */ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; + +import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; import lombok.experimental.UtilityClass; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/Mesh.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/Mesh.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java index a9a6f5ca2de..3b1061a62e6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/Mesh.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; import java.util.function.Consumer; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/MeshBuilder.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/MeshBuilder.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java index 4d7384acb01..7201327ac92 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/MeshBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/MutableQuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/MutableQuadView.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java index 1b6fd9c2b4a..7b106d32324 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/MutableQuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MutableQuadView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; import com.gregtechceu.gtceu.client.util.TextureHelper; @@ -28,7 +28,7 @@ import net.minecraft.util.Mth; import net.minecraftforge.client.model.QuadTransformers; -import static com.gregtechceu.gtceu.client.util.quad.EncodingFormat.*; +import static com.gregtechceu.gtceu.client.model.quad.EncodingFormat.*; /** * A mutable {@link QuadView} instance. * @@ -134,9 +134,9 @@ public void clear() { } /** - * Sets the geometric vertex position for the given vertex, relative to block origin, (0,0,0). Minecraft rendering - * is designed for models that fit within a single block space and is recommended that coordinates remain in the 0-1 - * range, with multi-block meshes split into multiple per-block models. + * Sets the geometric vertex position for the given vertex, relative to block origin, (0,0,0). + * Minecraft rendering is designed for models that fit within a single block space and is recommended + * that coordinates remain in the 0-1 range, with multi-block meshes split into multiple per-block models. */ public MutableQuadView pos(int vertexIndex, float x, float y, float z) { final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadView.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java index 9bbe29be364..8a9e6e05e7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java @@ -14,7 +14,9 @@ * limitations under the License. */ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; + +import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; import lombok.Getter; import lombok.experimental.Accessors; @@ -30,7 +32,7 @@ import net.minecraft.core.Direction; import net.minecraftforge.client.model.QuadTransformers; -import static com.gregtechceu.gtceu.client.util.quad.EncodingFormat.*; +import static com.gregtechceu.gtceu.client.model.quad.EncodingFormat.*; /** * Interface for reading quad data encoded by {@link MeshBuilder}. diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/SpriteFinder.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/SpriteFinder.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java index 6ed318dee77..cc912bfc868 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/SpriteFinder.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; import java.util.Map; import java.util.function.Consumer; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/StaticFaceBakery.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/StaticFaceBakery.java similarity index 99% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/StaticFaceBakery.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/StaticFaceBakery.java index 200eee8b51a..f5ab5e077d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/StaticFaceBakery.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/StaticFaceBakery.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; import com.lowdragmc.lowdraglib.client.bakedpipeline.FaceQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/package-info.java similarity index 58% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/package-info.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/package-info.java index f6a6ca48793..04eef27d2b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/package-info.java @@ -1,4 +1,4 @@ @NotNullByDefault -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad; import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadTransform.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java similarity index 84% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadTransform.java rename to src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java index de76ed61ea6..0f7186c3da3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadTransform.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java @@ -1,4 +1,6 @@ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.quad.transform; + +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraftforge.client.model.IQuadTransformer; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java index 731a05a881c..8c1d79c06e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.client.util.FacadeBlockAndTintGetter; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; -import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; +import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.cover.FacadeCover; import com.gregtechceu.gtceu.common.item.behavior.FacadeItemBehaviour; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java index 317e5e10285..ea1e98634bf 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.IIOCover; import com.gregtechceu.gtceu.client.util.ModelEventHelper; -import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; +import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java index a7ae78de074..767a3cad5af 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.client.util.ModelEventHelper; -import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; +import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; 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 1c893d6799f..b77ed10115d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -16,7 +16,7 @@ package com.gregtechceu.gtceu.client.util; -import com.gregtechceu.gtceu.client.util.quad.MutableQuadView; +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java index 58cf95bfa34..dd91c8b60b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java @@ -16,6 +16,7 @@ package com.gregtechceu.gtceu.client.util.quad; +import com.gregtechceu.gtceu.client.model.quad.QuadView; import com.gregtechceu.gtceu.utils.GTUtil; import lombok.experimental.UtilityClass; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java index 8d47b277774..1d62b2f4f55 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java @@ -15,11 +15,12 @@ * You should have received a copy of the GNU Lesser General Public License * along with CodeChickenLib. If not, see . */ + package com.gregtechceu.gtceu.client.util.quad.transformers; +import com.gregtechceu.gtceu.client.model.quad.transform.QuadTransform; import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; -import com.gregtechceu.gtceu.client.util.quad.MutableQuadView; -import com.gregtechceu.gtceu.client.util.quad.QuadTransform; +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.Direction; From 624ee1d1c6f5828e8a60ee098833ae438b5dc8f2 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:48:40 +0300 Subject: [PATCH 104/269] Import CCL quad transformers from AE2 --- .../transformers/InterpolationHelper.java | 121 +++++++++++ .../util/quad/transformers/QuadClamper.java | 107 ++++++++++ .../quad/transformers/QuadReInterpolator.java | 191 ++++++++++++++++++ .../util/quad/transformers/QuadTinter.java | 61 ++++++ 4 files changed, 480 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java new file mode 100644 index 00000000000..275d5fa6a6b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java @@ -0,0 +1,121 @@ +/* + * This file is part of CodeChickenLib. + * Copyright (c) 2018, covers1624, All rights reserved. + * + * CodeChickenLib is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * CodeChickenLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CodeChickenLib. If not, see . + */ + +package com.gregtechceu.gtceu.client.util.quad.transformers; + +import net.minecraft.util.Mth; + +/** + * @author covers1624 + */ +public class InterpolationHelper { + + private final float[][] posCache = new float[4][2]; + private final float[] valCache = new float[4]; + + private float x0; + private float x1; + private float y0; + private float y1; + + private float rX; + private float rY; + + private int p00; + private int p10; + private int p11; + private int p01; + + /** + * Resets the interpolation helper with the given quad. Does not care what order the vertices are in. + */ + public void reset(float dx0, float dy0, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) { + float[] vec0 = this.posCache[0]; + float[] vec1 = this.posCache[1]; + float[] vec2 = this.posCache[2]; + float[] vec3 = this.posCache[3]; + + vec0[0] = dx0; + vec1[0] = dx1; + vec2[0] = dx2; + vec3[0] = dx3; + + vec0[1] = dy0; + vec1[1] = dy1; + vec2[1] = dy2; + vec3[1] = dy3; + } + + /** + * Call when you are ready to use the interpolation helper. + */ + public void setup() { + this.p00 = 0; // Bottom Left is always first. + this.x0 = this.posCache[this.p00][0]; + this.y0 = this.posCache[this.p00][1]; + + for (int i = 1; i < 4; i++) { + float x = this.posCache[i][0]; + float y = this.posCache[i][1]; + + if (this.y0 == y) { + // Bottom right. + this.p10 = i; + this.x1 = x; + } else if (this.x0 == x) { + // Top left. + this.p01 = i; + this.y1 = y; + } else { + // Top right. + this.p11 = i; + } + } + } + + /** + * Computes the coefficients for the interpolation. + * + * @param x X interpolation location. + * @param y Y interpolation location. + */ + public void locate(float x, float y) { + this.rX = Mth.inverseLerp(x, this.x0, this.x1); + this.rY = Mth.inverseLerp(y, this.y0, this.y1); + } + + /** + * Interpolates using the already computed coefficients. + * + * @param q0 Value at dx0 dy0 + * @param q1 Value at dx1 dy1 + * @param q2 Value at dx2 dy2 + * @param q3 Value at dx3 dy3 + * @return The result. + */ + public float interpolate(float q0, float q1, float q2, float q3) { + this.valCache[0] = q0; + this.valCache[1] = q1; + this.valCache[2] = q2; + this.valCache[3] = q3; + float f0 = Mth.lerp(this.rX, this.valCache[this.p00], this.valCache[this.p10]); + float f1 = Mth.lerp(this.rX, this.valCache[this.p01], this.valCache[this.p11]); + + return Mth.lerp(this.rY, f0, f1); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java new file mode 100644 index 00000000000..9e7aa728dae --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java @@ -0,0 +1,107 @@ +/* + * This file is part of CodeChickenLib. + * Copyright (c) 2018, covers1624, All rights reserved. + * + * CodeChickenLib is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * CodeChickenLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CodeChickenLib. If not, see . + */ + +package com.gregtechceu.gtceu.client.util.quad.transformers; + +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; +import com.gregtechceu.gtceu.client.model.quad.transform.QuadTransform; + +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; + +import org.joml.Vector3f; + +/** + * This transformer simply clamps the vertices inside the provided box.
+ * You probably want to Re-Interpolate the UV's, Color, and Lightmap. For that, see {@link QuadReInterpolator}. + * + * @see QuadReInterpolator + * @author covers1624 + */ +public class QuadClamper implements QuadTransform { + + private final AABB clampBounds; + + private final Vector3f pos = new Vector3f(); + + public QuadClamper(AABB clampBounds) { + this.clampBounds = clampBounds; + } + + @Override + public boolean transform(MutableQuadView quad) { + Direction.Axis axis = quad.nominalFace().getAxis(); + + clamp(quad, this.clampBounds); + + // Check if the quad would be invisible and cull it. + float x1 = quad.posByIndex(0, xCoord(axis)); + float x2 = quad.posByIndex(1, xCoord(axis)); + float x3 = quad.posByIndex(2, xCoord(axis)); + float x4 = quad.posByIndex(3, xCoord(axis)); + + float y1 = quad.posByIndex(0, yCoord(axis)); + float y2 = quad.posByIndex(1, yCoord(axis)); + float y3 = quad.posByIndex(2, yCoord(axis)); + float y4 = quad.posByIndex(3, yCoord(axis)); + + // These comparisons are safe as we are comparing clamped values. + boolean flag1 = x1 == x2 && x2 == x3 && x3 == x4; + boolean flag2 = y1 == y2 && y2 == y3 && y3 == y4; + return !flag1 && !flag2; + } + + private void clamp(MutableQuadView quad, AABB bb) { + for (int i = 0; i < 4; i++) { + quad.copyPos(i, pos); + pos.set((float) Mth.clamp(pos.x(), bb.minX, bb.maxX), + (float) Mth.clamp(pos.y(), bb.minY, bb.maxY), + (float) Mth.clamp(pos.z(), bb.minZ, bb.maxZ)); + quad.pos(i, pos); + } + } + + /** + * Gets the 2d X coordinate for the given axis. + * + * @param axis The axis. side >> 1 + * @return The x coordinate. + */ + private static int xCoord(Direction.Axis axis) { + if (axis == Direction.Axis.Y) { + return 0; + } else { + return 2; + } + } + + /** + * Gets the 2d Y coordinate for the given axis. + * + * @param axis The axis. + * @return The y coordinate. + */ + private static int yCoord(Direction.Axis axis) { + if (axis != Direction.Axis.Y) { + return 1; + } else { + return 2; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java new file mode 100644 index 00000000000..4c0849b0c9a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java @@ -0,0 +1,191 @@ +/* + * This file is part of CodeChickenLib. + * Copyright (c) 2018, covers1624, All rights reserved. + * + * CodeChickenLib is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * CodeChickenLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CodeChickenLib. If not, see . + */ + +package com.gregtechceu.gtceu.client.util.quad.transformers; + +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; +import com.gregtechceu.gtceu.client.model.quad.QuadView; +import com.gregtechceu.gtceu.client.model.quad.transform.QuadTransform; + +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.core.Direction; + +/** + * This transformer Re-Interpolates the Color, UV's and LightMaps. Use this after all transformations that translate + * vertices in the pipeline. + *

+ * This Transformation can only be used in the BakedPipeline. + * + * @author covers1624 + */ +public class QuadReInterpolator implements QuadTransform { + + private final InterpolationHelper interpolationHelper = new InterpolationHelper(); + + private final int[] originalSpriteColor = new int[4]; + private final float[] originalSpriteU = new float[4]; + private final float[] originalSpriteV = new float[4]; + private final int[] originalSpriteLightmap = new int[4]; + + public QuadReInterpolator() { + super(); + } + + public void setInputQuad(QuadView quad) { + Direction.Axis axis = quad.nominalFace().getAxis(); + int xIndex = xCoord(axis); + int yIndex = yCoord(axis); + + interpolationHelper.reset( + quad.posByIndex(0, xIndex), quad.posByIndex(0, yIndex), + quad.posByIndex(1, xIndex), quad.posByIndex(1, yIndex), + quad.posByIndex(2, xIndex), quad.posByIndex(2, yIndex), + quad.posByIndex(3, xIndex), quad.posByIndex(3, yIndex)); + + // Save the original properties of the quad's vertices + for (int v = 0; v < 4; v++) { + originalSpriteColor[v] = quad.color(v); + originalSpriteU[v] = quad.u(v); + originalSpriteV[v] = quad.v(v); + originalSpriteLightmap[v] = quad.lightmap(v); + } + } + + @Override + public boolean transform(MutableQuadView quad) { + Direction.Axis axis = quad.nominalFace().getAxis(); + int xIndex = xCoord(axis); + int yIndex = yCoord(axis); + + this.interpolationHelper.setup(); + for (int i = 0; i < 4; i++) { + float x = quad.posByIndex(i, xIndex); + float y = quad.posByIndex(i, yIndex); + this.interpolationHelper.locate(x, y); + interpolateColorFrom(quad, i); + interpolateUVFrom(quad, i); + interpolateLightmapFrom(quad, i); + } + return true; + } + + /** + * Interpolates the new color values for this Vertex using the others as a reference. + */ + public void interpolateColorFrom(MutableQuadView quad, int vertexIndex) { + int p1 = this.originalSpriteColor[0]; + int p2 = this.originalSpriteColor[1]; + int p3 = this.originalSpriteColor[2]; + int p4 = this.originalSpriteColor[3]; + if (p1 == p2 && p2 == p3 && p3 == p4) { + return; // Don't bother for uniformly colored quads + } + + // Interpolate each color component separately + int color = 0; + int mask = 0xFF; + for (int i = 0; i < 4; i++) { + int p1c = p1 & mask; + int p2c = p2 & mask; + int p3c = p3 & mask; + int p4c = p4 & mask; + int interpolated = (int) interpolationHelper.interpolate(p1c, p2c, p3c, p4c); + color |= interpolated & mask; + mask <<= 8; + } + + quad.color(vertexIndex, color); + } + + /** + * Interpolates the new UV values for this Vertex using the others as a reference. + */ + public void interpolateUVFrom(MutableQuadView quad, int vertexIndex) { + float p1 = originalSpriteU[0]; + float p2 = originalSpriteU[1]; + float p3 = originalSpriteU[2]; + float p4 = originalSpriteU[3]; + float u = interpolationHelper.interpolate(p1, p2, p3, p4); + + p1 = originalSpriteV[0]; + p2 = originalSpriteV[1]; + p3 = originalSpriteV[2]; + p4 = originalSpriteV[3]; + float v = interpolationHelper.interpolate(p1, p2, p3, p4); + quad.uv(vertexIndex, u, v); + } + + /** + * Interpolates the new LightMap values for this Vertex using the others as a reference. + * + * @return The same Vertex. + */ + public void interpolateLightmapFrom(MutableQuadView quad, int vertexIndex) { + int p1 = originalSpriteLightmap[0]; + int p2 = originalSpriteLightmap[1]; + int p3 = originalSpriteLightmap[2]; + int p4 = originalSpriteLightmap[3]; + if (p1 == p2 && p2 == p3 && p3 == p4) { + return; // Don't bother for uniformly lit quads + } + + // Interpolate both lightmap components separately + int p1l = LightTexture.block(p1); + int p2l = LightTexture.block(p2); + int p3l = LightTexture.block(p3); + int p4l = LightTexture.block(p4); + int block = (int) interpolationHelper.interpolate(p1l, p2l, p3l, p4l); + + p1l = LightTexture.sky(p1); + p2l = LightTexture.sky(p2); + p3l = LightTexture.sky(p3); + p4l = LightTexture.sky(p4); + int sky = (int) interpolationHelper.interpolate(p1l, p2l, p3l, p4l); + + quad.lightmap(vertexIndex, block, sky); + } + + /** + * Gets the 2d X coordinate for the given axis. + * + * @param axis The axis. side >> 1 + * @return The x coordinate. + */ + private static int xCoord(Direction.Axis axis) { + if (axis == Direction.Axis.Y) { + return 0; + } else { + return 2; + } + } + + /** + * Gets the 2d Y coordinate for the given axis. + * + * @param axis The axis. + * @return The y coordinate. + */ + private static int yCoord(Direction.Axis axis) { + if (axis != Direction.Axis.Y) { + return 1; + } else { + return 2; + } + } + +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java new file mode 100644 index 00000000000..0af06ab6c11 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java @@ -0,0 +1,61 @@ +/* + * This file is part of CodeChickenLib. + * Copyright (c) 2018, covers1624, All rights reserved. + * + * CodeChickenLib is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or + * (at your option) any later version. + * + * CodeChickenLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with CodeChickenLib. If not, see . + */ + +package com.gregtechceu.gtceu.client.util.quad.transformers; + +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; +import com.gregtechceu.gtceu.client.model.quad.transform.QuadTransform; + +/** + * This transformer tints quads. + */ +public class QuadTinter implements QuadTransform { + + private final int argb; + + public QuadTinter(int rgb) { + this.argb = 0xFF000000 | rgb; + } + + @Override + public boolean transform(MutableQuadView quad) { + // Nuke tintIndex. + quad.tintIndex(-1); + for (int i = 0; i < 4; i++) { + int color = quad.color(i); + color = multiplyColor(color, argb); + quad.color(i, color); + } + return true; + } + + private static int multiplyColor(int color1, int color2) { + if (color1 == -1) { + return color2; + } else if (color2 == -1) { + return color1; + } + + final int alpha = ((color1 >> 24) & 0xFF) * ((color2 >> 24) & 0xFF) / 0xFF; + final int red = ((color1 >> 16) & 0xFF) * ((color2 >> 16) & 0xFF) / 0xFF; + final int green = ((color1 >> 8) & 0xFF) * ((color2 >> 8) & 0xFF) / 0xFF; + final int blue = (color1 & 0xFF) * (color2 & 0xFF) / 0xFF; + + return (alpha << 24) | (red << 16) | (green << 8) | blue; + } +} From a6628ea1aab0c95938030a3d992fbaf1d82204cd Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:50:35 +0300 Subject: [PATCH 105/269] Use the Fabric quad modification pipeline for connected textures --- .../client/model/TextureOverrideModel.java | 9 +- .../gtceu/client/model/ctm/CTMBakedModel.java | 2 +- .../client/model/machine/MachineModel.java | 4 +- .../gtceu/client/model/quad/Mesh.java | 18 +- .../client/model/quad/MutableQuadView.java | 52 +++- .../gtceu/client/model/quad/QuadView.java | 12 +- .../gtceu/client/util/TextureHelper.java | 35 ++- .../gtceu/client/util/quad/QuadInfo.java | 264 ------------------ .../gtceu/client/util/quad/QuadUtils.java | 217 +++++++++----- .../core/mixins/client/TextureAtlasMixin.java | 2 +- 10 files changed, 260 insertions(+), 355 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadInfo.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java index b8a0492a13a..d554b30c13f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/TextureOverrideModel.java @@ -14,7 +14,6 @@ import net.minecraftforge.client.model.data.ModelData; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -23,7 +22,6 @@ public class TextureOverrideModel extends BakedModelWrappe public static final IQuadTransformer OVERLAY_OFFSET = GTQuadTransformers.offset(0.002f); - @NotNull @Getter protected final Map textureOverrides; @@ -37,10 +35,9 @@ public BakedModel getChild() { } @Override - public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, - @NotNull RandomSource rand, @NotNull ModelData extraData, - @Nullable RenderType renderType) { - return retextureQuads(super.getQuads(state, side, rand, extraData, renderType), textureOverrides); + public List getQuads(@Nullable BlockState state, @Nullable Direction side, + RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { + return retextureQuads(super.getQuads(state, side, rand, modelData, renderType), textureOverrides); } public static List retextureQuads(List quads, Map overrides) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index a172baec992..0bb2ad76b67 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -50,7 +50,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction ctmCache.getSubmapIds(level, pos, state, side); return this.sideCache.computeIfAbsent(side, $ -> new ConcurrentHashMap<>()) .computeIfAbsent(ctmCache, cache -> QuadUtils.buildCTMQuads(cache, - super.getQuads(state, side, rand, parentModelData, renderType))); + super.getQuads(state, side, rand, parentModelData, renderType), side)); } @Override 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 2d556585382..8d3982fca6f 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 @@ -14,7 +14,7 @@ import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.client.util.quad.QuadUtils; -import com.gregtechceu.gtceu.client.util.quad.StaticFaceBakery; +import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; @@ -275,7 +275,7 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl // we have to recalculate CTM ourselves. // this is the slowest part by a long shot because the LDLib quad logic isn't very optimized. if (level != null && pos != null && blockState != null) { - return QuadUtils.buildCTMQuads(quads, level, pos, blockState, side); + return QuadUtils.buildCTMQuads(level, pos, blockState, quads, side); } return quads; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java index 3b1061a62e6..bb27314165b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java @@ -1,5 +1,11 @@ package com.gregtechceu.gtceu.client.model.quad; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlas; + +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; /** @@ -16,7 +22,7 @@ */ public class Mesh { /** Used to satisfy external calls to {@link #forEach(Consumer)}. */ - ThreadLocal POOL = ThreadLocal.withInitial(QuadView::new); + private static final ThreadLocal POOL = ThreadLocal.withInitial(QuadView::new); final int[] data; @@ -46,4 +52,14 @@ void forEach(Consumer consumer, QuadView cursor) { index += EncodingFormat.QUAD_STRIDE; } } + + @SuppressWarnings("deprecation") + public List toBakedBlockQuads() { + SpriteFinder finder = SpriteFinder.get(Minecraft.getInstance().getModelManager() + .getAtlas(TextureAtlas.LOCATION_BLOCKS)); + + List result = new ArrayList<>(); + forEach(qv -> result.add(qv.toBakedQuad(finder.find(qv)))); + return result; + } } 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 7b106d32324..b65d8a45b6e 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 @@ -17,11 +17,13 @@ package com.gregtechceu.gtceu.client.model.quad; import com.gregtechceu.gtceu.client.util.TextureHelper; +import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector3f; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; @@ -154,6 +156,39 @@ public MutableQuadView pos(int vertexIndex, Vector3f pos) { return pos(vertexIndex, pos.x(), pos.y(), pos.z()); } + /** + * Sets the vertex X position for the given vertex, relative to block origin, (0,0,0). + * Minecraft rendering is designed for models that fit within a single block space and is recommended + * that coordinates remain in the 0-1 range, with multi-block meshes split into multiple per-block models. + */ + public MutableQuadView x(int vertexIndex, float x) { + data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X] = Float.floatToRawIntBits(x); + isGeometryInvalid = true; + return this; + } + + /** + * Sets the vertex Y position for the given vertex, relative to block origin, (0,0,0). + * Minecraft rendering is designed for models that fit within a single block space and is recommended + * that coordinates remain in the 0-1 range, with multi-block meshes split into multiple per-block models. + */ + public MutableQuadView y(int vertexIndex, float y) { + data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Y] = Float.floatToRawIntBits(y); + isGeometryInvalid = true; + return this; + } + + /** + * Sets the vertex Z position for the given vertex, relative to block origin, (0,0,0). + * Minecraft rendering is designed for models that fit within a single block space and is recommended + * that coordinates remain in the 0-1 range, with multi-block meshes split into multiple per-block models. + */ + public MutableQuadView z(int vertexIndex, float z) { + data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_Z] = Float.floatToRawIntBits(z); + isGeometryInvalid = true; + return this; + } + /** * Set vertex color. */ @@ -201,7 +236,7 @@ public MutableQuadView uv(int vertexIndex, Vector2f uv) { * Can handle UV locking, rotation, interpolation, etc. * Control this behavior by passing additive combinations of the BAKE_ flags defined in this interface. */ - public MutableQuadView spriteBake(TextureAtlasSprite sprite, int bakeFlags) { + public MutableQuadView spriteBake(@Nullable TextureAtlasSprite sprite, int bakeFlags) { TextureHelper.bakeSprite(this, sprite, bakeFlags); return this; } @@ -215,6 +250,15 @@ public MutableQuadView lightmap(int vertexIndex, int lightmap) { return this; } + /** + * Accept vanilla lightmap values. + * Input values will override lightmap values computed from world state if input values are higher. + */ + public MutableQuadView lightmap(int vertexIndex, int block, int sky) { + data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_LIGHTMAP] = LightTexture.pack(block, sky); + return this; + } + /** * Convenience: set lightmap for all vertices at once. * @@ -229,7 +273,7 @@ public MutableQuadView lightmap(int b0, int b1, int b2, int b3) { } protected void normalFlags(int flags) { - this.flags = EncodingFormat.normalFlags(this.flags, flags); + headerFlags = EncodingFormat.normalFlags(headerFlags, flags); } /** @@ -285,7 +329,7 @@ public final void populateMissingNormals() { * face geometry and must be non-null in vanilla quads. That computed value is returned by {@link #lightFace()}. */ public final MutableQuadView cullFace(@Nullable Direction face) { - flags = EncodingFormat.cullFace(flags, face); + headerFlags = EncodingFormat.cullFace(headerFlags, face); nominalFace(face); return this; } @@ -377,7 +421,7 @@ public final MutableQuadView fromVanilla(int[] quadData, int startIndex) { */ public final MutableQuadView fromVanilla(BakedQuad quad, @Nullable Direction cullFace) { fromVanilla(quad.getVertices(), 0); - flags = EncodingFormat.cullFace(0, cullFace); + headerFlags = EncodingFormat.cullFace(0, cullFace); nominalFace(quad.getDirection()); tintIndex(quad.getTintIndex()); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java index 8a9e6e05e7f..416b88c33a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java @@ -71,7 +71,7 @@ public class QuadView { @Getter protected int tintIndex; - protected long flags = 0; + protected long headerFlags = 0; /** Size and where it comes from will vary in subtypes. But in all cases quad is fully encoded to array. */ protected int @UnknownNullability [] data; @@ -105,7 +105,7 @@ public int[] data() { } public int normalFlags() { - return EncodingFormat.normalFlags(flags); + return EncodingFormat.normalFlags(headerFlags); } /** True if any vertex normal has been set. */ @@ -120,7 +120,7 @@ protected void computeGeometry() { GeometryHelper.computeFaceNormal(faceNormal, this); // depends on face normal - flags = EncodingFormat.lightFace(flags, GeometryHelper.lightFace(this)); + headerFlags = EncodingFormat.lightFace(headerFlags, GeometryHelper.lightFace(this)); } } @@ -131,7 +131,7 @@ protected void computeGeometry() { */ public final Direction lightFace() { computeGeometry(); - return EncodingFormat.lightFace(flags); + return EncodingFormat.lightFace(headerFlags); } /** @@ -141,7 +141,7 @@ public final Direction lightFace() { */ public final @Nullable Direction cullFace() { computeGeometry(); - return EncodingFormat.cullFace(flags); + return EncodingFormat.cullFace(headerFlags); } /** @@ -170,7 +170,7 @@ public void copyTo(MutableQuadView quad) { quad.nominalFace = this.nominalFace; quad.isGeometryInvalid = false; quad.shade(this.shade); - quad.flags = this.flags; + quad.headerFlags = this.headerFlags; } /** 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 b77ed10115d..cd21ca50246 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -22,6 +22,7 @@ import net.minecraft.core.Direction; import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Nullable; /** * Handles most texture-baking use cases for model loaders and model libraries via @@ -37,8 +38,12 @@ public class TextureHelper { /** * Bakes textures in the provided vertex data, handling UV locking, rotation, interpolation, etc. * Textures must not be already baked. + * + *

+ * If {@code sprite == null}, only the UV modifiers will be applied, but they won't be translated to the sprite's + * atlas coordinates. */ - public static void bakeSprite(MutableQuadView quad, TextureAtlasSprite sprite, int bakeFlags) { + public static void bakeSprite(MutableQuadView quad, @Nullable TextureAtlasSprite sprite, int bakeFlags) { if (quad.nominalFace() != null && (MutableQuadView.BAKE_LOCK_UV & bakeFlags) != 0) { // Assigns normalized UV coordinates based on vertex positions applyModifier(quad, UV_LOCKERS[quad.nominalFace().get3DDataValue()]); @@ -68,14 +73,16 @@ public static void bakeSprite(MutableQuadView quad, TextureAtlasSprite sprite, i applyModifier(quad, (q, i) -> q.uv(i, q.u(i), 1 - q.v(i))); } - interpolate(quad, sprite); + if (sprite != null) { + interpolate(quad, sprite); + } } /** * Faster than sprite method. Sprite computes span and normalizes inputs each call, so we'd have to denormalize * before we called, only to have the sprite renormalize immediately. */ - private static void interpolate(MutableQuadView q, TextureAtlasSprite sprite) { + public static void interpolate(MutableQuadView q, TextureAtlasSprite sprite) { final float uMin = sprite.getU0(); final float uSpan = sprite.getU1() - uMin; final float vMin = sprite.getV0(); @@ -86,8 +93,28 @@ private static void interpolate(MutableQuadView q, TextureAtlasSprite sprite) { } } + /** + * Faster than sprite method. Sprite computes span and normalizes inputs each call, so we'd have to denormalize + * before we called, only to have the sprite renormalize immediately. + */ + public static void normalizeBy(MutableQuadView q, TextureAtlasSprite sprite) { + final float uMin = sprite.getU0(), uMax = sprite.getU1(); + final float uSpan = uMax - uMin; + final float vMin = sprite.getV0(), vMax = sprite.getV1(); + final float vSpan = vMax - vMin; + + for (int i = 0; i < 4; i++) { + final float u = q.u(i), v = q.v(i); + // Skip invalid UV coordinates. + // If the UV is outside the texture's boundaries, this was probably called by mistake. + if (u < uMin || u > uMax || v < vMin || v > vMax) continue; + + q.uv(i, (u - uMin) / uSpan, (v - vMin) / vSpan); + } + } + @FunctionalInterface - private interface VertexModifier { + public interface VertexModifier { void apply(MutableQuadView quad, int vertexIndex); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadInfo.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadInfo.java deleted file mode 100644 index 3b65c349ba0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadInfo.java +++ /dev/null @@ -1,264 +0,0 @@ -package com.gregtechceu.gtceu.client.util.quad; - -import com.gregtechceu.gtceu.client.model.ctm.ISubmap; -import com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation; - -import net.minecraft.client.renderer.LightTexture; -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.minecraftforge.client.model.IQuadTransformer; - -import it.unimi.dsi.fastutil.Pair; -import org.joml.Vector2f; -import org.joml.Vector3f; - -import static com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation.*; - -public record QuadInfo(TextureAtlasSprite sprite, int tintIndex, Direction direction, - boolean shade, boolean ao, int blockLight, int skyLight, - Vector3f[] vertices, Vector2f[] uvs, Vector2f minUV, Vector2f maxUV) { - - // Mapping the different corner indices to their respective dirs - private static final OctagonalOrientation[][] SUBMAP_MAP = new OctagonalOrientation[][] { - { BOTTOM, LEFT, BOTTOM_LEFT }, - { BOTTOM, RIGHT, BOTTOM_RIGHT }, - { TOP, RIGHT, TOP_RIGHT }, - { TOP, LEFT, TOP_LEFT } - }; - - public QuadInfo(TextureAtlasSprite sprite, int tintIndex, Direction direction, boolean shade, boolean ao, - Vector3f[] vertices, Vector2f[] uvs, Vector2f minUV, Vector2f maxUV) { - this(sprite, tintIndex, direction, shade, ao, 0, 0, vertices, uvs, minUV, maxUV); - } - - // region UV operations - - public Vector2f[] normalizeUVs() { - Vector2f[] ret = new Vector2f[uvs.length]; - for (int i = 0; i < ret.length; i++) { - ret[i] = QuadUtils.normalizeUV(sprite, uvs[i]); - } - return ret; - } - - public Vector2f[] relativizeUVs() { - Vector2f[] ret = new Vector2f[uvs.length]; - for (int i = 0; i < uvs.length; i++) { - ret[i] = QuadUtils.relativizeUV(sprite, uvs[i]); - } - return ret; - } - - public int getNormalizedUVQuadrant() { - return getUVQuadrant(QuadUtils.normalizeUV(sprite, maxUV)); - } - - public static int getUVQuadrant(Vector2f uv) { - if (uv.x() <= 0.5f) { - if (uv.y() <= 0.5f) { - return 3; - } else { - return 0; - } - } else { - if (uv.y() <= 0.5f) { - return 2; - } else { - return 1; - } - } - } - - public Vector2f[] normalizeUVQuadrant() { - Vector2f[] normalized = normalizeUVs(); - - int quadrant = getNormalizedUVQuadrant(); - float minUInterp = quadrant == 1 || quadrant == 2 ? 0.5f : 0; - float minVInterp = quadrant < 2 ? 0.5f : 0; - float maxUInterp = quadrant == 0 || quadrant == 3 ? 0.5f : 1; - float maxVInterp = quadrant > 1 ? 0.5f : 1; - - normalized = QuadUtils.normalizeUVs( - new Vector2f(minUInterp, minVInterp), - new Vector2f(maxUInterp, maxVInterp), - normalized); - return QuadUtils.relativizeUVs(sprite, normalized); - } - - public Vector2f[] transformUVData(TextureAtlasSprite other, ISubmap submap) { - Vector2f[] normalized = normalizeUVs(); - var maxUVs = QuadUtils.findMinMaxUVs(normalized); - submap = submap.unitScale(); - - float width = maxUVs.second().x() - maxUVs.first().x(); - float height = maxUVs.second().y() - maxUVs.first().y(); - - float minU = submap.getXOffset(); - float minV = submap.getYOffset(); - minU += maxUVs.first().x() * submap.getWidth(); - minV += maxUVs.first().y() * submap.getHeight(); - - float maxU = minU + (width * submap.getWidth()); - float maxV = minV + (height * submap.getHeight()); - - Vector2f[] newUVs = new Vector2f[4]; - for (int i = 0; i < 4; i++) { - Vector2f uv = new Vector2f(this.uvs[i]); - // same as sprite.getU(oldSprite.getUOffset(uv.x)), but we don't multiply and divide in between - // NOTE: can be simplified to ^ on 1.21 - uv.x = Mth.map(uv.x, this.sprite.getU0(), this.sprite.getU1(), other.getU0(), other.getU1()); - uv.y = Mth.map(uv.y, this.sprite.getV0(), this.sprite.getV1(), other.getV0(), other.getV1()); - newUVs[i] = uv; - } - - // FIXME this... isn't all that great. - newUVs = new Vector2f[] { - new Vector2f(newUVs[0].x() == this.minUV.x() ? minU : maxU, newUVs[0].y() == this.minUV.y() ? minV : maxV), - new Vector2f(newUVs[1].x() == this.minUV.x() ? minU : maxU, newUVs[1].y() == this.minUV.y() ? minV : maxV), - new Vector2f(newUVs[2].x() == this.minUV.x() ? minU : maxU, newUVs[2].y() == this.minUV.y() ? minV : maxV), - new Vector2f(newUVs[3].x() == this.minUV.x() ? minU : maxU, newUVs[3].y() == this.minUV.y() ? minV : maxV) - }; - return QuadUtils.relativizeUVs(other, newUVs); - } - - public Vector2f[] copyUVs() { - Vector2f[] result = new Vector2f[uvs.length]; - for (int i = 0; i < uvs.length; ++i) { - result[i] = new Vector2f(uvs[i]); - } - return result; - } - - // endregion - - // region vertex operations - - public Vector3f[] copyVertices() { - Vector3f[] result = new Vector3f[vertices.length]; - for (int i = 0; i < vertices.length; ++i) { - result[i] = new Vector3f(vertices[i]); - } - return result; - } - - public QuadInfo grow() { - return new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, - copyVertices(), normalizeUVQuadrant(), new Vector2f(minUV), new Vector2f(maxUV)); - } - - public QuadInfo copy() { - return new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, - copyVertices(), copyUVs(), new Vector2f(minUV), new Vector2f(maxUV)); - } - - public QuadInfo transformUVs(TextureAtlasSprite sprite, ISubmap submap) { - return new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, - copyVertices(), transformUVData(sprite, submap), new Vector2f(minUV), new Vector2f(maxUV)); - } - - public QuadInfo[] subdivide() { - QuadInfo[] rects = new QuadInfo[4]; - - var firstDivide = this.divide(false); - var secondDivide = firstDivide.left().divide(true); - rects[0] = secondDivide.left(); - if (firstDivide.right() != null) { - Pair thirdDivide = firstDivide.right().divide(true); - rects[1] = thirdDivide.left(); - rects[2] = thirdDivide.right(); - } - rects[3] = secondDivide.right(); - - return rects; - } - - private Pair divide(boolean vertical) { - Vector2f[] normalizedUvs = this.normalizeUVs(); - float minUV, maxUV; - float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE, maxU = Float.MIN_VALUE, maxV = Float.MIN_VALUE; - - int start = 0; - for (int i = 0; i < 4; i++) { - if (minU >= normalizedUvs[i].x() && minV >= normalizedUvs[i].y()) { - start = i; - } - minU = Math.min(minU, normalizedUvs[i].x()); - minV = Math.min(minV, normalizedUvs[i].y()); - maxU = Math.max(maxU, normalizedUvs[i].x()); - maxV = Math.max(maxV, normalizedUvs[i].y()); - } - if (vertical) { - minUV = minV; - maxUV = maxV; - } else { - minUV = minU; - maxUV = maxU; - } - - if (minUV < 0.5f && maxUV > 0.5f) { - float delta = Mth.inverseLerp(minUV, maxUV, 0.5f); - - Vector2f[] firstUVs = QuadUtils.relativizeUVs(sprite, - new Vector2f(vertical ? minU : 0.5f, vertical ? 0.5f : minV), - new Vector2f(vertical ? minU : 0.5f, maxV), - new Vector2f(maxU, maxV), - new Vector2f(maxU, vertical ? 0.5f : minV)); - Vector2f[] secondUVs = QuadUtils.relativizeUVs(sprite, - new Vector2f(minU, minV), - new Vector2f(minU, vertical ? 0.5f : maxV), - new Vector2f(vertical ? maxU : 0.5f, vertical ? 0.5f : maxV), - new Vector2f(vertical ? maxU : 0.5f, minV)); - - Vector3f[] firstVerts = new Vector3f[4]; - Vector3f[] secondVerts = new Vector3f[4]; - for (int i = 0; i < 4; i++) { - int idx = (start + i) % 4; - firstVerts[i] = new Vector3f(vertices[idx]); - secondVerts[i] = new Vector3f(vertices[idx]); - } - - int i0 = 0; - int i1 = vertical ? 1 : 3; - int i2 = 2; - int i3 = vertical ? 3 : 1; - - firstVerts[i0].lerp(firstVerts[i1], delta); - firstVerts[i3].lerp(firstVerts[i2], delta); - secondVerts[i0].lerp(secondVerts[i1], delta, secondVerts[i1]); - secondVerts[i3].lerp(secondVerts[i2], delta, secondVerts[i2]); - - return Pair.of( - new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, - firstVerts, firstUVs, firstUVs[0], firstUVs[2]), - new QuadInfo(sprite, tintIndex, direction, shade, ao, blockLight, skyLight, - secondVerts, secondUVs, secondUVs[0], secondUVs[2])); - } else { - return Pair.of(this, null); - } - } - - // endregion - - public BakedQuad rebake() { - int[] vertexData = new int[32]; - for (int i = 0; i < 4; ++i) { - Vector3f pos = vertices[i]; - Vector2f uv = uvs[i]; - Vector2f nextUv = uvs[(i + 2) % 4]; - - int v = i * IQuadTransformer.STRIDE; - vertexData[v + IQuadTransformer.POSITION] = Float.floatToRawIntBits(pos.x()); - vertexData[v + IQuadTransformer.POSITION + 1] = Float.floatToRawIntBits(pos.y()); - vertexData[v + IQuadTransformer.POSITION + 2] = Float.floatToRawIntBits(pos.z()); - vertexData[v + IQuadTransformer.COLOR] = 0xffffffff; - vertexData[v + IQuadTransformer.UV0] = Float.floatToRawIntBits( - sprite.getU(uv.x() * 0.999f + nextUv.x() * 0.001f)); - vertexData[v + IQuadTransformer.UV0 + 1] = Float.floatToRawIntBits( - sprite.getV(uv.y() * 0.999f + nextUv.y() * 0.001f)); - vertexData[i * IQuadTransformer.STRIDE + IQuadTransformer.UV2] = LightTexture.pack(blockLight, skyLight); - } - return new BakedQuad(vertexData, tintIndex, direction, sprite, shade, ao); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 391a0024726..83ac4aebefc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -1,7 +1,11 @@ package com.gregtechceu.gtceu.client.util.quad; import com.gregtechceu.gtceu.client.model.ctm.CTMCache; -import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; +import com.gregtechceu.gtceu.client.model.ctm.ISubmap; +import com.gregtechceu.gtceu.client.model.quad.MeshBuilder; +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; +import com.gregtechceu.gtceu.client.util.TextureHelper; +import com.gregtechceu.gtceu.client.util.quad.transformers.QuadReInterpolator; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -13,56 +17,17 @@ import net.minecraftforge.client.model.IQuadTransformer; import it.unimi.dsi.fastutil.Pair; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector3f; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.Objects; +import static com.gregtechceu.gtceu.client.model.quad.MutableQuadView.*; import static com.gregtechceu.gtceu.client.util.ModelEventHelper.*; public class QuadUtils { - public static Vector2f[] getQuadUVs(int[] vertices) { - Vector2f[] uvs = new Vector2f[4]; - - for (int i = 0; i < 4; i++) { - int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.UV0; - float u = Float.intBitsToFloat(vertices[offset]); - float v = Float.intBitsToFloat(vertices[offset + 1]); - uvs[i] = new Vector2f(u, v); - } - return uvs; - } - - public static Vector3f[] getQuadVertices(int[] vertices) { - Vector3f[] vertPos = new Vector3f[4]; - - for (int i = 0; i < 4; i++) { - int offset = i * IQuadTransformer.STRIDE + IQuadTransformer.POSITION; - float x = Float.intBitsToFloat(vertices[offset]); - float y = Float.intBitsToFloat(vertices[offset + 1]); - float z = Float.intBitsToFloat(vertices[offset + 2]); - vertPos[i] = new Vector3f(x, y, z); - } - return vertPos; - } - - public static QuadInfo[] subdivide(BakedQuad baked) { - Vector3f[] vertPos = getQuadVertices(baked.getVertices()); - Vector2f[] uvs = getQuadUVs(baked.getVertices()); - var maxUVs = findMinMaxUVs(uvs); - QuadInfo quad = new QuadInfo(baked.getSprite(), baked.getTintIndex(), baked.getDirection(), - baked.isShade(), baked.hasAmbientOcclusion(), - vertPos, uvs, maxUVs.first(), maxUVs.second()); - - return quad.subdivide(); - } - public static Pair findMinMaxUVs(Vector2f[] uvs) { float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE, maxU = Float.MIN_VALUE, maxV = Float.MIN_VALUE; @@ -76,6 +41,21 @@ public static Pair findMinMaxUVs(Vector2f[] uvs) { return Pair.of(new Vector2f(minU, minV), new Vector2f(maxU, maxV)); } + public static int findMinUVIndex(Vector2f[] uvs) { + int minIndex = 0; + float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE; + + for (int v = 0; v < 4; v++) { + Vector2f uv = uvs[v]; + if (uv.x() <= minU && uv.y() <= minV) { + minIndex = v; + minU = uv.x(); + minV = uv.y(); + } + } + return minIndex; + } + private static void putVertexData(int[] vertices, int index, Vector3f pos, Vector2f uv) { int posOffset = index * IQuadTransformer.STRIDE + IQuadTransformer.POSITION; vertices[posOffset] = Float.floatToRawIntBits(pos.x()); @@ -96,10 +76,9 @@ public static Vector2f[] normalizeUVs(Vector2f min, Vector2f max, Vector2f... uv } public static Vector2f normalizeUV(TextureAtlasSprite sprite, Vector2f vec) { - return normalizeUV( - new Vector2f(sprite.getU0(), sprite.getU1()), - new Vector2f(sprite.getV0(), sprite.getV1()), - vec); + return new Vector2f( + Mth.inverseLerp(vec.x(), sprite.getU0(), sprite.getU1()), + Mth.inverseLerp(vec.y(), sprite.getV0(), sprite.getV1())); } public static Vector2f normalizeUV(Vector2f min, Vector2f max, Vector2f vec) { @@ -121,40 +100,146 @@ public static Vector2f relativizeUV(TextureAtlasSprite sprite, Vector2f vec) { Mth.lerp(vec.y(), sprite.getV0(), sprite.getV1())); } - public static List buildCTMQuads(List quads, BlockAndTintGetter level, BlockPos pos, - @NotNull BlockState state, @Nullable Direction side) { + public static List buildCTMQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, + List quads, @Nullable Direction cullFace) { CTMCache ctmCache = CTMCache.getInstance(); - if (side != null) { - ctmCache.getSubmapIds(level, pos, state, side); + if (cullFace != null) { + ctmCache.getSubmapIds(level, pos, state, cullFace); } - return buildCTMQuads(ctmCache, quads); + return buildCTMQuads(ctmCache, quads, cullFace); } - public static List buildCTMQuads(CTMCache cachedConnections, List base) { - List result = new ArrayList<>(); + public static List buildCTMQuads(CTMCache cachedConnections, List base, + @Nullable Direction cullFace) { + MeshBuilder meshBuilder = MeshBuilder.getInstance(); + var emitter = meshBuilder.getEmitter(); + + QuadReInterpolator interpolator = new QuadReInterpolator(); + for (BakedQuad originalQuad : base) { - TextureAtlasSprite connection = CTM_SPRITE_CACHE.get(originalQuad.getSprite()); + TextureAtlasSprite sprite = originalQuad.getSprite(); + + TextureAtlasSprite connection = CTM_SPRITE_CACHE.get(sprite.contents().name()); if (connection == null) { - result.add(originalQuad); + emitter.fromVanilla(originalQuad, cullFace); + emitter.emit(); continue; } - // make sure to copy the quad here so the original model isn't mutated - BakedQuad newBQ = GTQuadTransformers.derotate().process(originalQuad); - QuadInfo[] subdivided = QuadUtils.subdivide(newBQ); int[] ctm = cachedConnections.getSubmapIndices(); - for (int j = 0; j < subdivided.length; j++) { - QuadInfo quad = subdivided[j]; - if (quad != null) { - int quadrant = quad.getNormalizedUVQuadrant(); - TextureAtlasSprite ctmSprite = ctm[quadrant] > 15 ? originalQuad.getSprite() : connection; - subdivided[j] = quad.grow().transformUVs(ctmSprite, CTMCache.uvs[ctm[quadrant]].unitScale()); - } + for (int quadrant = 0; quadrant < 4; quadrant++) { + TextureAtlasSprite ctmSprite = ctm[quadrant] > 15 ? originalQuad.getSprite() : connection; + + emitter.fromVanilla(originalQuad, cullFace); + TextureHelper.normalizeBy(emitter, sprite); + interpolator.setInputQuad(emitter); + + // slice quad into the current quadrant + subsect(emitter, CTMCache.uvs[ctm[quadrant]].unitScale()); + + interpolator.transform(emitter); + + // derotate quad here + emitter.spriteBake(ctmSprite, BAKE_LOCK_UV | BAKE_NORMALIZED); + + emitter.emit(); } - result.addAll(Arrays.stream(subdivided).filter(Objects::nonNull).map(QuadInfo::rebake).toList()); } - return result; + return meshBuilder.build().toBakedBlockQuads(); + } + + // TODO simplify, this is quite long + public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { + Vector2f[] uvs = new Vector2f[4]; + for (int i = 0; i < 4; i++) { + uvs[i] = quad.copyUv(i, uvs[i]); + } + int firstIndex = findMinUVIndex(uvs); + + Vector3f[] positions = new Vector3f[4]; + for (int i = 0; i < 4; i++) { + int idx = (firstIndex + i) % 4; + positions[i] = quad.copyPos(i, positions[idx]); + } + + Direction normal = quad.nominalFace(); + + Vector2f[] xy = new Vector2f[4]; + Vector2f[] newXy = new Vector2f[4]; + for (int i = 0; i < 4; i++) { + switch (normal.getAxis()) { + case Y -> xy[i] = new Vector2f(positions[i].x, positions[i].z); + case Z -> xy[i] = new Vector2f(positions[i].x, positions[i].y); + case X -> xy[i] = new Vector2f(positions[i].z, positions[i].y); + } + newXy[i] = new Vector2f(); + } + + if (normal.getAxis() != Direction.Axis.Y) { + submap = submap.flipY(); + } + if (normal == Direction.EAST || normal == Direction.NORTH) { + submap = submap.flipX(); + } + + submap = submap.unitScale(); + + if (normal.getAxis() == Direction.Axis.Y || normal.getAxisDirection() == Direction.AxisDirection.POSITIVE) { + // Relative X is the same sign for DOWN, UP, SOUTH, and WEST + newXy[0].x = Math.max(xy[0].x, submap.getXOffset()); // DUSW + newXy[1].x = Math.max(xy[1].x, submap.getXOffset()); // DUSW + newXy[2].x = Math.min(xy[2].x, submap.getXOffset() + submap.getWidth()); // DUSW + newXy[3].x = Math.min(xy[3].x, submap.getXOffset() + submap.getWidth()); // DUSW + } else { + // Flip relative X for NORTH and EAST + newXy[0].x = Math.min(xy[0].x, submap.getXOffset() + submap.getWidth()); // NE + newXy[1].x = Math.min(xy[1].x, submap.getXOffset() + submap.getWidth()); // NE + newXy[2].x = Math.max(xy[2].x, submap.getXOffset()); // NE + newXy[3].x = Math.max(xy[3].x, submap.getXOffset()); // NE + } + if (normal != Direction.UP) { + // Relative Y is the same sign for all but UP + newXy[0].y = Math.min(xy[0].y, submap.getYOffset() + submap.getHeight()); // DNSWE + newXy[1].y = Math.max(xy[1].y, submap.getYOffset()); // DNSWE + newXy[2].y = Math.max(xy[2].y, submap.getYOffset()); // DNSWE + newXy[3].y = Math.min(xy[3].y, submap.getYOffset() + submap.getHeight()); // DNSWE + } else { + // Flip relative Y for UP + newXy[0].y = Math.max(xy[0].y, submap.getYOffset()); // U + newXy[1].y = Math.min(xy[1].y, submap.getYOffset() + submap.getHeight()); // U + newXy[2].y = Math.min(xy[2].y, submap.getYOffset() + submap.getHeight()); // U + newXy[3].y = Math.max(xy[3].y, submap.getYOffset()); // U + } + + float u0 = normalize(xy[0].x, xy[3].x, newXy[0].x); + float v0 = normalize(xy[0].y, xy[1].y, newXy[0].y); + float u1 = normalize(xy[1].x, xy[2].x, newXy[1].x); + float v1 = normalize(xy[1].y, xy[0].y, newXy[1].y); + float u2 = normalize(xy[2].x, xy[1].x, newXy[2].x); + float v2 = normalize(xy[2].y, xy[3].y, newXy[2].y); + float u3 = normalize(xy[3].x, xy[0].x, newXy[3].x); + float v3 = normalize(xy[3].y, xy[2].y, newXy[3].y); + + quad.uv(0, Mth.lerp(uvs[0].x, uvs[3].x, u0), Mth.lerp(uvs[0].y, uvs[1].y, v0)); + quad.uv(1, Mth.lerp(uvs[1].x, uvs[2].x, u1), Mth.lerp(uvs[1].y, uvs[0].y, v1)); + quad.uv(2, Mth.lerp(uvs[2].x, uvs[1].x, u2), Mth.lerp(uvs[2].y, uvs[3].y, v2)); + quad.uv(3, Mth.lerp(uvs[3].x, uvs[0].x, u3), Mth.lerp(uvs[3].y, uvs[2].y, v3)); + + for (int i = 0; i < 4; i++) { + switch (normal.getAxis()) { + case Y -> quad.pos(i, newXy[i].x, quad.y(i), newXy[i].y); + case Z -> quad.pos(i, newXy[i].x, newXy[i].y, quad.z(i)); + case X -> quad.pos(i, quad.x(i), newXy[i].y, newXy[i].x); + } + } + + return quad; + } + + public static float normalize(float min, float max, float x) { + if (min == max) return 0.5f; + return Mth.inverseLerp(x, min, max); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java index dc1620e49c1..1427a97168b 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java @@ -16,7 +16,7 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.client.util.quad.SpriteFinder; +import com.gregtechceu.gtceu.client.model.quad.SpriteFinder; import java.util.Map; From 7c941bc69fe0562496eec74d92cdd6a49e17503c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:50:53 +0300 Subject: [PATCH 106/269] Reformat doc comments --- .../client/model/quad/MutableQuadView.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) 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 b65d8a45b6e..f83c03413ec 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 @@ -69,12 +69,13 @@ public abstract class MutableQuadView extends QuadView { public static final int BAKE_ROTATE_270 = 0b000011; /** - * When enabled, texture coordinate are assigned based on vertex position. Any existing UV coordinates will be - * replaced. Pass in bakeFlags parameter to {@link #spriteBake(TextureAtlasSprite, int)}. + * When enabled, texture coordinates are assigned based on vertex position. + * Any existing UV coordinates will be replaced. + * Pass in bakeFlags parameter to {@link #spriteBake(TextureAtlasSprite, int)}. * *

- * UV lock always derives texture coordinates based on nominal face, even when the quad is not co-planar with that - * face, and the result is the same as if the quad were projected onto the nominal face, which is usually the + * UV lock always derives texture coordinates based on nominal face, even when the quad is not co-planar + * with that face. The result is the same as if the quad were projected onto the nominal face, which is usually the * desired result. */ public static final int BAKE_LOCK_UV = 0b000100; @@ -445,13 +446,13 @@ public final MutableQuadView fromVanilla(BakedQuad quad, @Nullable Direction cul private static final float CULL_FACE_EPSILON = Mth.EPSILON; /** - * Helper method to assign vertex coordinates for a square aligned with the given face. Ensures that vertex order is - * consistent with vanilla convention. (Incorrect order can lead to bad AO lighting unless enhanced lighting logic - * is available/enabled.) + * Helper method to assign vertex coordinates for a square aligned with the given face. + * Ensures that vertex order is consistent with vanilla convention. + * (Incorrect order can lead to bad AO lighting unless enhanced lighting logic is available/enabled.) * *

- * Square will be parallel to the given face and coplanar with the face (and culled if the face is occluded) if the - * depth parameter is approximately zero. See {@link #CULL_FACE_EPSILON}. + * Square will be parallel to the given face and coplanar with the face (and culled if the face is occluded) + * if the depth parameter is approximately zero. See {@link #CULL_FACE_EPSILON}. * *

* All coordinates should be normalized (0-1). From 469b346fc12a35fa2288e5656b145c1f420ce98b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:59:22 +0300 Subject: [PATCH 107/269] Rename the "connection" metadata field to "connection_texture" --- .../gregtechceu/gtceu/client/model/ctm/GTTextureMetadata.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f0e28744fd6..945b3df778b 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 @@ -44,7 +44,7 @@ public static class Serializer implements MetadataSectionSerializer CODEC = RecordCodecBuilder.create(instance -> instance.group( - ResourceLocation.CODEC.optionalFieldOf("connection", EMPTY_CONNECTION).forGetter(GTTextureMetadata::connectionTexture) + ResourceLocation.CODEC.optionalFieldOf("connection_texture", EMPTY_CONNECTION).forGetter(GTTextureMetadata::connectionTexture) ).apply(instance, GTTextureMetadata::new)); // spotless:on From 78a0ad7d5946c721b71018f88bf674b486956851 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:59:31 +0300 Subject: [PATCH 108/269] Fix all the resource files --- .../block/casings/cleanroom/filter_casing.png.mcmeta | 4 ++-- .../textures/block/casings/cleanroom/plascrete.png.mcmeta | 6 +++--- .../cleanroom/sterilizing_filter_casing.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_cupronickel.png.mcmeta | 6 +++--- .../coils/machine_coil_cupronickel_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta | 2 +- .../block/casings/coils/machine_coil_hssg.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_hssg_bloom.png.mcmeta | 7 ++----- .../casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta | 2 +- .../block/casings/coils/machine_coil_kanthal.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_kanthal_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_kanthal_bloom_ctm.png.mcmeta | 2 +- .../coils/machine_coil_molybdenum_disilicide.png.mcmeta | 4 ++-- .../machine_coil_molybdenum_disilicide_bloom.png.mcmeta | 7 ++----- ...achine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta | 2 +- .../block/casings/coils/machine_coil_naquadah.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_naquadah_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_naquadah_bloom_ctm.png.mcmeta | 2 +- .../block/casings/coils/machine_coil_nichrome.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_nichrome_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_nichrome_bloom_ctm.png.mcmeta | 2 +- .../block/casings/coils/machine_coil_rtm_alloy.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta | 2 +- .../casings/coils/machine_coil_superconductor.png.mcmeta | 4 ++-- .../coils/machine_coil_superconductor_bloom.png.mcmeta | 7 ++----- .../machine_coil_superconductor_bloom_ctm.png.mcmeta | 2 +- .../block/casings/coils/machine_coil_trinium.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_trinium_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_trinium_bloom_ctm.png.mcmeta | 2 +- .../block/casings/coils/machine_coil_tritanium.png.mcmeta | 4 ++-- .../casings/coils/machine_coil_tritanium_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_tritanium_bloom_ctm.png.mcmeta | 2 +- .../casings/coils/machine_coil_tungstensteel.png.mcmeta | 4 ++-- .../coils/machine_coil_tungstensteel_bloom.png.mcmeta | 7 ++----- .../coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta | 2 +- .../firebox/machine_casing_firebox_bronze.png.mcmeta | 4 ++-- .../firebox/machine_casing_firebox_steel.png.mcmeta | 4 ++-- .../firebox/machine_casing_firebox_titanium.png.mcmeta | 4 ++-- .../machine_casing_firebox_tungstensteel.png.mcmeta | 4 ++-- .../block/casings/fusion/fusion_casing.png.mcmeta | 4 ++-- .../block/casings/fusion/fusion_casing_bloom.png.mcmeta | 7 ++----- .../block/casings/fusion/fusion_casing_mk2.png.mcmeta | 4 ++-- .../block/casings/fusion/fusion_casing_mk3.png.mcmeta | 4 ++-- .../block/casings/fusion/superconducting_coil.png.mcmeta | 4 ++-- .../casings/fusion/superconducting_coil_bloom.png.mcmeta | 7 ++----- .../fusion/superconducting_coil_bloom_ctm.png.mcmeta | 2 +- .../textures/block/casings/gcym/atomic_casing.png.mcmeta | 4 ++-- .../block/casings/gcym/corrosion_proof_casing.png.mcmeta | 4 ++-- .../gcym/high_temperature_smelting_casing.png.mcmeta | 4 ++-- .../block/casings/gcym/industrial_steam_casing.png.mcmeta | 4 ++-- .../casings/gcym/large_scale_assembling_casing.png.mcmeta | 4 ++-- .../casings/gcym/laser_safe_engraving_casing.png.mcmeta | 4 ++-- .../block/casings/gcym/nonconducting_casing.png.mcmeta | 4 ++-- .../casings/gcym/reaction_safe_mixing_casing.png.mcmeta | 4 ++-- .../casings/gcym/secure_maceration_casing.png.mcmeta | 4 ++-- .../casings/gcym/shock_proof_cutting_casing.png.mcmeta | 4 ++-- .../textures/block/casings/gcym/sifter_casing.png.mcmeta | 4 ++-- .../block/casings/gcym/stress_proof_casing.png.mcmeta | 4 ++-- .../block/casings/gcym/vibration_safe_casing.png.mcmeta | 4 ++-- .../block/casings/gcym/watertight_casing.png.mcmeta | 4 ++-- .../casings/hpca/advanced_computer_casing/back.png.mcmeta | 4 ++-- .../hpca/advanced_computer_casing/bottom.png.mcmeta | 4 ++-- .../hpca/advanced_computer_casing/front.png.mcmeta | 4 ++-- .../casings/hpca/advanced_computer_casing/side.png.mcmeta | 4 ++-- .../casings/hpca/advanced_computer_casing/top.png.mcmeta | 4 ++-- .../block/casings/hpca/computer_casing/back.png.mcmeta | 4 ++-- .../block/casings/hpca/computer_casing/bottom.png.mcmeta | 4 ++-- .../block/casings/hpca/computer_casing/front.png.mcmeta | 4 ++-- .../block/casings/hpca/computer_casing/side.png.mcmeta | 4 ++-- .../block/casings/hpca/computer_casing/top.png.mcmeta | 4 ++-- .../block/casings/hpca/computer_heat_vent_side.png.mcmeta | 4 ++-- .../casings/hpca/computer_heat_vent_top_bot.png.mcmeta | 4 ++-- .../block/casings/hpca/high_power_casing.png.mcmeta | 4 ++-- .../machine_casing_assembly_line_bloom.png.mcmeta | 5 +---- .../machine_casing_turbine_stainless_steel.png.mcmeta | 4 ++-- .../mechanic/machine_casing_turbine_steel.png.mcmeta | 4 ++-- .../mechanic/machine_casing_turbine_titanium.png.mcmeta | 4 ++-- .../machine_casing_turbine_tungstensteel.png.mcmeta | 4 ++-- .../casings/signs/machine_casing_stripes_a.png.mcmeta | 4 ++-- .../casings/signs/machine_casing_stripes_b.png.mcmeta | 4 ++-- .../casings/signs/machine_casing_stripes_c.png.mcmeta | 4 ++-- .../casings/signs/machine_casing_stripes_d.png.mcmeta | 4 ++-- .../block/casings/slicing_blades/bottom.png.mcmeta | 4 ++-- .../textures/block/casings/slicing_blades/side.png.mcmeta | 4 ++-- .../textures/block/casings/slicing_blades/top.png.mcmeta | 4 ++-- .../solid/machine_casing_bronze_plated_bricks.png.mcmeta | 4 ++-- .../solid/machine_casing_clean_stainless_steel.png.mcmeta | 4 ++-- .../casings/solid/machine_casing_frost_proof.png.mcmeta | 4 ++-- .../casings/solid/machine_casing_heatproof.png.mcmeta | 4 ++-- .../casings/solid/machine_casing_inert_ptfe.png.mcmeta | 4 ++-- .../solid/machine_casing_palladium_substation.png.mcmeta | 4 ++-- .../solid/machine_casing_robust_tungstensteel.png.mcmeta | 4 ++-- .../casings/solid/machine_casing_solid_steel.png.mcmeta | 4 ++-- .../solid/machine_casing_stable_titanium.png.mcmeta | 4 ++-- .../solid/machine_casing_stainless_evaporation.png.mcmeta | 4 ++-- .../casings/solid/machine_casing_sturdy_hsse.png.mcmeta | 4 ++-- .../solid/machine_casing_sturdy_hsse_green.png.mcmeta | 4 ++-- .../block/casings/transparent/cleanroom_glass.png.mcmeta | 4 ++-- .../block/casings/transparent/fusion_glass.png.mcmeta | 4 ++-- .../block/casings/transparent/laminated_glass.png.mcmeta | 4 ++-- .../block/casings/transparent/tempered_glass.png.mcmeta | 4 ++-- .../block/casings/unique/crushing_wheels.png.mcmeta | 4 ++-- .../casings/unique/crushing_wheels_active.png.mcmeta | 4 ++-- .../block/casings/unique/heat_vent_bloom.png.mcmeta | 2 +- .../block/casings/unique/slicing_blades.png.mcmeta | 4 ++-- .../block/casings/unique/slicing_blades_active.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/black.png.mcmeta | 4 ++-- .../block/lamps/black_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/black_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/black_emissive.png.mcmeta | 8 +++----- .../gtceu/textures/block/lamps/black_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/blue.png.mcmeta | 4 ++-- .../block/lamps/blue_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/blue_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/blue_emissive.png.mcmeta | 6 ++---- .../assets/gtceu/textures/block/lamps/blue_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/brown.png.mcmeta | 4 ++-- .../block/lamps/brown_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/brown_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/brown_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/brown_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/cyan.png.mcmeta | 4 ++-- .../block/lamps/cyan_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/cyan_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/cyan_emissive.png.mcmeta | 6 ++---- .../assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/gray.png.mcmeta | 4 ++-- .../block/lamps/gray_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/gray_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/gray_emissive.png.mcmeta | 6 ++---- .../assets/gtceu/textures/block/lamps/gray_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/green.png.mcmeta | 4 ++-- .../block/lamps/green_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/green_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/green_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/green_off.png.mcmeta | 4 ++-- .../gtceu/textures/block/lamps/light_blue.png.mcmeta | 4 ++-- .../block/lamps/light_blue_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/light_blue_ctm_emissive.png.mcmeta | 2 +- .../textures/block/lamps/light_blue_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/light_blue_off.png.mcmeta | 4 ++-- .../gtceu/textures/block/lamps/light_gray.png.mcmeta | 4 ++-- .../block/lamps/light_gray_borderless_emissive.png.mcmeta | 2 +- .../block/lamps/light_gray_ctm_emissive.png.mcmeta | 2 +- .../textures/block/lamps/light_gray_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/light_gray_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/lime.png.mcmeta | 4 ++-- .../block/lamps/lime_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/lime_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/lime_emissive.png.mcmeta | 6 ++---- .../assets/gtceu/textures/block/lamps/lime_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/magenta.png.mcmeta | 4 ++-- .../block/lamps/magenta_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/magenta_ctm_emissive.png.mcmeta | 2 +- .../textures/block/lamps/magenta_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/magenta_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/orange.png.mcmeta | 4 ++-- .../block/lamps/orange_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/orange_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/orange_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/orange_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/pink.png.mcmeta | 4 ++-- .../block/lamps/pink_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/pink_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/pink_emissive.png.mcmeta | 6 ++---- .../assets/gtceu/textures/block/lamps/pink_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/purple.png.mcmeta | 4 ++-- .../block/lamps/purple_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/purple_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/purple_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/purple_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/red.png.mcmeta | 4 ++-- .../block/lamps/red_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/red_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/red_emissive.png.mcmeta | 6 ++---- .../assets/gtceu/textures/block/lamps/red_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/white.png.mcmeta | 4 ++-- .../block/lamps/white_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/white_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/white_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/white_off.png.mcmeta | 4 ++-- .../assets/gtceu/textures/block/lamps/yellow.png.mcmeta | 4 ++-- .../block/lamps/yellow_borderless_emissive.png.mcmeta | 2 +- .../textures/block/lamps/yellow_ctm_emissive.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/yellow_emissive.png.mcmeta | 6 ++---- .../gtceu/textures/block/lamps/yellow_off.png.mcmeta | 4 ++-- .../block/overlay/machine/overlay_monitor.png.mcmeta | 4 ++-- .../block/pipe/ld_fluid_pipe/overlay_emissive.png.mcmeta | 5 +---- .../block/pipe/ld_item_pipe/overlay_emissive.png.mcmeta | 5 +---- 190 files changed, 335 insertions(+), 415 deletions(-) diff --git a/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/filter_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/filter_casing.png.mcmeta index 679654e7450..197e174c743 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/filter_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/filter_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/cleanroom/filter_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/cleanroom/filter_casing_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/plascrete.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/plascrete.png.mcmeta index 0b6135d2c98..bcfe132b2ef 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/plascrete.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/plascrete.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/cleanroom/plascrete_ctm" - } + "gtceu": { + "connection_texture": "gtceu:block/casings/cleanroom/plascrete_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/sterilizing_filter_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/sterilizing_filter_casing.png.mcmeta index 0e1b3e83e63..bb26602ecf7 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/sterilizing_filter_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/cleanroom/sterilizing_filter_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/cleanroom/sterilizing_filter_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/cleanroom/sterilizing_filter_casing_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel.png.mcmeta index d611cacb4ef..78607c6ca08 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_cupronickel_ctm" - } + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_cupronickel_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta index b1e5096ccb5..419344f2357 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_cupronickel_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_cupronickel_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_cupronickel_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg.png.mcmeta index d0eb5a1b4e0..2f8b0f3c606 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_hssg_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_hssg_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta index a3d39d70b26..7007fd7d399 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_hssg_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_hssg_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_hssg_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal.png.mcmeta index a543d938427..7323ad0e179 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_kanthal_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_kanthal_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta index 5f77e5af023..369076e1f9d 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_kanthal_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_kanthal_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_kanthal_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide.png.mcmeta index cdf115622d5..ee713eaaf40 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_molybdenum_disilicide_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_molybdenum_disilicide_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta index e5d9efbf204..15eded51a94 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_molybdenum_disilicide_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah.png.mcmeta index 2e4b0f7663e..8d778222e5f 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_naquadah_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_naquadah_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta index 89be208adcf..4e7c10b2cff 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_naquadah_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_naquadah_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_naquadah_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome.png.mcmeta index 4ea55aec150..b769004afbd 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_nichrome_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_nichrome_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta index d454af3ff67..8afaa449311 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_nichrome_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_nichrome_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_nichrome_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy.png.mcmeta index 746da5c90c5..6b2870c83a6 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_rtm_alloy_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_rtm_alloy_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta index 527eb9bb051..6d09c673e6f 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_rtm_alloy_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_rtm_alloy_bloom_ctm", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_rtm_alloy_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor.png.mcmeta index 5e76601ac3e..a604c36f15e 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_superconductor_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_superconductor_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta index 2f5edd2ed74..824306dde04 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_superconductor_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_superconductor_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_superconductor_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium.png.mcmeta index 6ae83eb0551..17e24d0d0f3 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_trinium_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_trinium_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta index 0d93c95e458..75e5e226e1f 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_trinium_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_trinium_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_trinium_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium.png.mcmeta index 49409f48da5..76d31028072 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_tritanium_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_tritanium_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta index 1aa566dca58..5153271f7ba 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_tritanium_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_tritanium_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tritanium_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel.png.mcmeta index 274e5147e1d..66a136186c5 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_tungstensteel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_tungstensteel_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta index 11a9a3bcd34..df8fd23d60c 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_tungstensteel_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_tungstensteel_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/coils/machine_coil_tungstensteel_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_bronze.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_bronze.png.mcmeta index 618e068e4dd..653afb29006 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_bronze.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_bronze.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/firebox/machine_casing_firebox_bronze_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/firebox/machine_casing_firebox_bronze_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_steel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_steel.png.mcmeta index f07082f52f5..f120eaf9032 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_steel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_steel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/firebox/machine_casing_firebox_steel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/firebox/machine_casing_firebox_steel_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_titanium.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_titanium.png.mcmeta index 06e9796abed..afe2869054b 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_titanium.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_titanium.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/firebox/machine_casing_firebox_titanium_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/firebox/machine_casing_firebox_titanium_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_tungstensteel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_tungstensteel.png.mcmeta index fdd57cb4a7a..6ee0e5eb3d5 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_tungstensteel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/firebox/machine_casing_firebox_tungstensteel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/firebox/machine_casing_firebox_tungstensteel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/firebox/machine_casing_firebox_tungstensteel_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing.png.mcmeta index 60ef8c970be..42c81b1632c 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/fusion/fusion_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/fusion/fusion_casing_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta index d63d26a280c..72d1a0104b4 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/fusion/fusion_casing_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/fusion/fusion_casing_bloom_ctm", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk2.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk2.png.mcmeta index 266021414e4..f8063da866f 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk2.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk2.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/fusion/fusion_casing_mk2_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/fusion/fusion_casing_mk2_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk3.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk3.png.mcmeta index 8b45a91c06a..4fd16130b5c 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk3.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/fusion_casing_mk3.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/fusion/fusion_casing_mk3_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/fusion/fusion_casing_mk3_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil.png.mcmeta index 0efbe8cd43c..e8fd0abfc97 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/fusion/superconducting_coil_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/fusion/superconducting_coil_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta index 2f5edd2ed74..824306dde04 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom.png.mcmeta @@ -1,9 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/coils/machine_coil_superconductor_bloom_ctm", - "emissive": true - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/casings/coils/machine_coil_superconductor_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta index e333118814e..c29eace5074 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/fusion/superconducting_coil_bloom_ctm.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/atomic_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/atomic_casing.png.mcmeta index ec7ee024889..4e544655bb0 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/atomic_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/atomic_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/atomic_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/atomic_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/corrosion_proof_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/corrosion_proof_casing.png.mcmeta index c5ad2294e42..34dd301c21d 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/corrosion_proof_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/corrosion_proof_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/corrosion_proof_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/corrosion_proof_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/high_temperature_smelting_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/high_temperature_smelting_casing.png.mcmeta index 2457291b40f..c5fa362c0f9 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/high_temperature_smelting_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/high_temperature_smelting_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/high_temperature_smelting_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/high_temperature_smelting_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/industrial_steam_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/industrial_steam_casing.png.mcmeta index 0f942a68354..cebb04f9e44 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/industrial_steam_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/industrial_steam_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/industrial_steam_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/industrial_steam_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/large_scale_assembling_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/large_scale_assembling_casing.png.mcmeta index 306854983f3..67a616a6316 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/large_scale_assembling_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/large_scale_assembling_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/large_scale_assembling_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/large_scale_assembling_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/laser_safe_engraving_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/laser_safe_engraving_casing.png.mcmeta index df8cb84ff6f..24476332093 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/laser_safe_engraving_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/laser_safe_engraving_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/laser_safe_engraving_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/laser_safe_engraving_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/nonconducting_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/nonconducting_casing.png.mcmeta index eafb895c281..1e3827124a1 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/nonconducting_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/nonconducting_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/nonconducting_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/nonconducting_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/reaction_safe_mixing_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/reaction_safe_mixing_casing.png.mcmeta index ae09e8eb280..5b62e5ce35d 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/reaction_safe_mixing_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/reaction_safe_mixing_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/reaction_safe_mixing_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/reaction_safe_mixing_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/secure_maceration_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/secure_maceration_casing.png.mcmeta index 3768093e52a..f6ec7e514b4 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/secure_maceration_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/secure_maceration_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/secure_maceration_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/secure_maceration_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/shock_proof_cutting_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/shock_proof_cutting_casing.png.mcmeta index cf058736156..b13d57a26f7 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/shock_proof_cutting_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/shock_proof_cutting_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/shock_proof_cutting_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/shock_proof_cutting_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/sifter_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/sifter_casing.png.mcmeta index 58804a3f988..f3cd3b2d23c 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/sifter_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/sifter_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/sifter_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/sifter_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/stress_proof_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/stress_proof_casing.png.mcmeta index 19fb6ad2f8f..bf95820d5b5 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/stress_proof_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/stress_proof_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/stress_proof_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/stress_proof_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/vibration_safe_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/vibration_safe_casing.png.mcmeta index 20efcbc319f..1e13a18a0da 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/vibration_safe_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/vibration_safe_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/vibration_safe_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/vibration_safe_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/gcym/watertight_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/gcym/watertight_casing.png.mcmeta index 4a3033b0362..01c2c216764 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/gcym/watertight_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/gcym/watertight_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/gcym/watertight_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/gcym/watertight_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/back.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/back.png.mcmeta index 42e07d2dea7..184b499a8ba 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/back.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/back.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/advanced_computer_casing/back_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/advanced_computer_casing/back_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/bottom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/bottom.png.mcmeta index 8c187a0684a..8cd3c5a5935 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/bottom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/bottom.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/advanced_computer_casing/bottom_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/advanced_computer_casing/bottom_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/front.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/front.png.mcmeta index c57c972dc1c..5f54ab8dbe8 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/front.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/front.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/advanced_computer_casing/front_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/advanced_computer_casing/front_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/side.png.mcmeta index 961092b3f9e..7435e5af674 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/side.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/side.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/advanced_computer_casing/side_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/advanced_computer_casing/side_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/top.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/top.png.mcmeta index 7e23f5cded5..693c691f8d1 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/top.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/advanced_computer_casing/top.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/advanced_computer_casing/top_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/advanced_computer_casing/top_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/back.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/back.png.mcmeta index 5878953ae0d..6e6e8c6bb63 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/back.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/back.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/computer_casing/back_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/computer_casing/back_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/bottom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/bottom.png.mcmeta index 9fb2a643fdb..eddb4850067 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/bottom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/bottom.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/computer_casing/bottom_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/computer_casing/bottom_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/front.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/front.png.mcmeta index 303678ceb2d..ab496cd7ff0 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/front.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/front.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/computer_casing/front_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/computer_casing/front_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/side.png.mcmeta index cc1c5d48c57..7ad5ef7f1ea 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/side.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/side.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/computer_casing/side_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/computer_casing/side_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/top.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/top.png.mcmeta index d4805c14851..e5d8d808ff4 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/top.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_casing/top.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/computer_casing/top_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/computer_casing/top_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_side.png.mcmeta index c50ce958d8a..714dd86272f 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_side.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_side.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/computer_heat_vent_side_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/computer_heat_vent_side_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_top_bot.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_top_bot.png.mcmeta index f41eea02b1d..a5dbe2bc9c0 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_top_bot.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/computer_heat_vent_top_bot.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/computer_heat_vent_top_bot_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/computer_heat_vent_top_bot_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/hpca/high_power_casing.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/hpca/high_power_casing.png.mcmeta index 787770c3abd..07dec6c8212 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/hpca/high_power_casing.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/hpca/high_power_casing.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/hpca/high_power_casing_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/hpca/high_power_casing_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta index f2e939b3527..a3edcb551d9 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_assembly_line_bloom.png.mcmeta @@ -2,10 +2,7 @@ "animation":{ "frametime":2 }, - "ldlib": { - "emissive": true - }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_stainless_steel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_stainless_steel.png.mcmeta index aa9b988334d..5e2dd444e27 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_stainless_steel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_stainless_steel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/mechanic/machine_casing_turbine_stainless_steel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/mechanic/machine_casing_turbine_stainless_steel_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_steel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_steel.png.mcmeta index a7fd421b3b3..72c1a53ba16 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_steel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_steel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/mechanic/machine_casing_turbine_steel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/mechanic/machine_casing_turbine_steel_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_titanium.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_titanium.png.mcmeta index 728b371f290..a79cc793f76 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_titanium.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_titanium.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/mechanic/machine_casing_turbine_titanium_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/mechanic/machine_casing_turbine_titanium_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_tungstensteel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_tungstensteel.png.mcmeta index 4a128ac164e..d23695359ad 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_tungstensteel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/mechanic/machine_casing_turbine_tungstensteel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/mechanic/machine_casing_turbine_tungstensteel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/mechanic/machine_casing_turbine_tungstensteel_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_a.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_a.png.mcmeta index 7e7c3fcc388..edb2af3afa7 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_a.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_a.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/signs/machine_casing_stripes_a_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/signs/machine_casing_stripes_a_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_b.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_b.png.mcmeta index 41f9c4fca66..1e4a835fdfd 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_b.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_b.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/signs/machine_casing_stripes_b_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/signs/machine_casing_stripes_b_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_c.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_c.png.mcmeta index 24ae068cdf3..58c74e507cf 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_c.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_c.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/signs/machine_casing_stripes_c_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/signs/machine_casing_stripes_c_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_d.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_d.png.mcmeta index be0c3b09523..31d57035871 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_d.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/signs/machine_casing_stripes_d.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/signs/machine_casing_stripes_d_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/signs/machine_casing_stripes_d_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/bottom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/bottom.png.mcmeta index 752d89be69b..27d8682d91a 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/bottom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/bottom.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/slicing_blades/bottom_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/slicing_blades/bottom_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/side.png.mcmeta index 2e013feb3a1..92fe24d573a 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/side.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/side.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/slicing_blades/side_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/slicing_blades/side_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/top.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/top.png.mcmeta index fe5e643f07c..7716663f87c 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/top.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/slicing_blades/top.png.mcmeta @@ -1,6 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/slicing_blades/top_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/slicing_blades/top_ctm" }, "animation": { "interpolate": false, diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_bronze_plated_bricks.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_bronze_plated_bricks.png.mcmeta index 84d6ac55955..f7bc18370f4 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_bronze_plated_bricks.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_bronze_plated_bricks.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_clean_stainless_steel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_clean_stainless_steel.png.mcmeta index 87b382c8442..37fdc7ef59f 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_clean_stainless_steel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_clean_stainless_steel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_frost_proof.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_frost_proof.png.mcmeta index 06e68458b87..063daa7f6df 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_frost_proof.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_frost_proof.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_frost_proof_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_frost_proof_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_heatproof.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_heatproof.png.mcmeta index 46a7987cfed..6a69dafbaed 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_heatproof.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_heatproof.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_heatproof_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_heatproof_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_inert_ptfe.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_inert_ptfe.png.mcmeta index df90ab84c03..af024fa07e3 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_inert_ptfe.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_inert_ptfe.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_inert_ptfe_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_inert_ptfe_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_palladium_substation.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_palladium_substation.png.mcmeta index 7cdf09342f4..6960d04e965 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_palladium_substation.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_palladium_substation.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_palladium_substation_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_palladium_substation_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_robust_tungstensteel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_robust_tungstensteel.png.mcmeta index 854f8df3dbe..1a2b15bb41b 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_robust_tungstensteel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_robust_tungstensteel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_solid_steel.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_solid_steel.png.mcmeta index 12cc1053c71..ad374a7d98d 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_solid_steel.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_solid_steel.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_solid_steel_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_solid_steel_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stable_titanium.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stable_titanium.png.mcmeta index 97014a06a14..bb8fdf80156 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stable_titanium.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stable_titanium.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_stable_titanium_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_stable_titanium_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stainless_evaporation.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stainless_evaporation.png.mcmeta index 53b118fbefe..e5b5ae4c3e4 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stainless_evaporation.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_stainless_evaporation.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_stainless_evaporation_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_stainless_evaporation_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse.png.mcmeta index 225285146b7..6299e80252e 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_sturdy_hsse_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_sturdy_hsse_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse_green.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse_green.png.mcmeta index 225285146b7..6299e80252e 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse_green.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/solid/machine_casing_sturdy_hsse_green.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/solid/machine_casing_sturdy_hsse_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/solid/machine_casing_sturdy_hsse_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/transparent/cleanroom_glass.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/transparent/cleanroom_glass.png.mcmeta index 4e88ec7cc0c..26a4910f29a 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/transparent/cleanroom_glass.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/transparent/cleanroom_glass.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/transparent/cleanroom_glass_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/transparent/cleanroom_glass_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/transparent/fusion_glass.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/transparent/fusion_glass.png.mcmeta index d193e57fef1..6264f382525 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/transparent/fusion_glass.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/transparent/fusion_glass.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/transparent/fusion_glass_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/transparent/fusion_glass_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass.png.mcmeta index 0a0ee21c685..b4319b49730 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/transparent/laminated_glass_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/transparent/laminated_glass_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/transparent/tempered_glass.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/transparent/tempered_glass.png.mcmeta index 502bb849399..ff94fb81b10 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/transparent/tempered_glass.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/transparent/tempered_glass.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/transparent/tempered_glass_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/transparent/tempered_glass_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels.png.mcmeta index 17b629c309c..71c9206ffbd 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/unique/crushing_wheels_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/unique/crushing_wheels_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels_active.png.mcmeta index cbe1abf13b7..b4a2ed95093 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels_active.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/unique/crushing_wheels_active.png.mcmeta @@ -1,6 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/unique/crushing_wheels_active_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/unique/crushing_wheels_active_ctm" }, "animation": { "interpolate": false, diff --git a/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta index 89d89e9d079..8d624c1275a 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/unique/heat_vent_bloom.png.mcmeta @@ -2,7 +2,7 @@ "animation": { "frametime": 1 }, - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades.png.mcmeta index 39765a1c5d6..60a0eb8b058 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/casings/unique/slicing_blades_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/unique/slicing_blades_ctm" } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades_active.png.mcmeta index 1440c3a3821..721f4cb651e 100644 --- a/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades_active.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/casings/unique/slicing_blades_active.png.mcmeta @@ -1,6 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/casings/unique/slicing_blades_active_ctm" + "gtceu": { + "connection_texture": "gtceu:block/casings/unique/slicing_blades_active_ctm" }, "animation": { "interpolate": false, diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta index 8f14d9b9cb1..61780d9adbf 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta @@ -1,6 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/black_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/black_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta index 986fc3c4b9b..a11349bfaee 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta @@ -1,9 +1,7 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/black_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/black_ctm_emissive", "bloom": true - } + }, } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta index 077f1b444bc..b3ef78b25d4 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/black_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/black_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta index b2d32fbdde0..add4878dcad 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/blue_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/blue_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta index 6c7c62e8adb..8fe261e2931 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/blue_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/blue_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta index 6692caee337..d006e50c70d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/blue_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/blue_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta index 10bc639e0fc..79c45dc0aa2 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/brown_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/brown_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta index 5716c714030..19d59029d1a 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/brown_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/brown_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta index f222ed9e8ac..bee93308f69 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/brown_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/brown_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta index c0f13e9c0bf..6adda24f923 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/cyan_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/cyan_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta index b1725e83fa5..dd41b557d46 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/cyan_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/cyan_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta index 0e6b73d84f3..8ae56b50cc3 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/cyan_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/cyan_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta index 4cc28d73d35..a9e458cb136 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/gray_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/gray_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta index c55ae8fc192..5c7197a78e7 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/gray_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/gray_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta index 1bf1376070e..e299f580208 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/gray_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/gray_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta index 8c0cb78a3db..84fb000f84d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/green_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/green_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta index 61c740ca6c9..c04d90f7125 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/green_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/green_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta index 183ef8c6ac6..ede85c6111e 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/green_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/green_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta index 7be5820dc99..f1db0ef3cdf 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/light_blue_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/light_blue_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta index 3c37363340e..056eeb31a66 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/light_blue_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/light_blue_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta index 36da8684b59..55f47d21dc1 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/light_blue_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/light_blue_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta index d9f02a1f1eb..08256dfb955 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/light_gray_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/light_gray_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta index f198565e7c6..70ecdc41c1f 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/light_gray_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/light_gray_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_off.png.mcmeta index 74f9b7d0d2e..3729e392d0e 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/light_gray_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/light_gray_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime.png.mcmeta index c1576b94772..83f4bcca823 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/lime_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/lime_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta index 2eddeede772..d4860e9edd5 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/lime_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/lime_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta index 3ece38171e2..531de7d0542 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/lime_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/lime_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta index 8296eb3a51b..6e1b63fa26a 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/magenta_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/magenta_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta index bbcbde7bc8b..654ce71902d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/magenta_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/magenta_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta index c5d19b0dac8..8dcee76d766 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/magenta_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/magenta_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta index 53fdb4a15cd..31d40f12d08 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/orange_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/orange_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta index 6bd561037cd..6c91be41e02 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/orange_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/orange_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta index 2d87bf7df39..13159c135bd 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/orange_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/orange_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta index 37808e80592..bc114052df6 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/pink_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/pink_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta index 8ca9c17de14..6570ddd3cd5 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/pink_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/pink_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta index 7894d02278d..edca1be5376 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/pink_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/pink_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta index 121eed221ea..d878709d313 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/purple_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/purple_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta index 8c82cc421b1..ab8cea0ade7 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/purple_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/purple_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta index e912715ff62..d0c0c0d235a 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/purple_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/purple_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta index b0bef295adf..c77b242bec0 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/red_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/red_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta index 71f134efd0c..e1a9f28bbd0 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/red_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/red_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta index d9f98de71da..561e150e04e 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/red_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/red_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta index d21e74fd68e..88d612ca4a7 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/white_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/white_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta index 5b460863ca0..c2c53c6c68d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/white_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/white_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta index 8defbca3800..793551b1f47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/white_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/white_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta index 92cd97707cd..dae5b12c102 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/yellow_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/yellow_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta index 4da3f5f1299..5f4d1c8fd47 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta @@ -1,5 +1,5 @@ { - "shimmer": { + "gtceu": { "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta index 4e0110c9e7c..01f8f09342c 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta @@ -1,8 +1,6 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/yellow_ctm_emissive" - }, - "shimmer": { + "gtceu": { + "connection_texture": "gtceu:block/lamps/yellow_ctm_emissive", "bloom": true } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta index 160ab566143..dc463f4a85e 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/yellow_off_ctm" + "gtceu": { + "connection_texture": "gtceu:block/lamps/yellow_off_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/overlay/machine/overlay_monitor.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/overlay/machine/overlay_monitor.png.mcmeta index 38c2c75c408..deb8a6cb565 100644 --- a/src/main/resources/assets/gtceu/textures/block/overlay/machine/overlay_monitor.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/overlay/machine/overlay_monitor.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/overlay/machine/overlay_monitor_ctm" + "gtceu": { + "connection_texture": "gtceu:block/overlay/machine/overlay_monitor_ctm" } } diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_emissive.png.mcmeta index 53a9815890b..352db4d3be4 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_fluid_pipe/overlay_emissive.png.mcmeta @@ -1,8 +1,5 @@ { - "ldlib": { - "emissive": true - }, - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_emissive.png.mcmeta index 53a9815890b..352db4d3be4 100644 --- a/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/pipe/ld_item_pipe/overlay_emissive.png.mcmeta @@ -1,8 +1,5 @@ { - "ldlib": { - "emissive": true - }, - "shimmer": { + "gtceu": { "bloom": true } } \ No newline at end of file From df0c06bfdae23d783c2d15f40ea485728208146b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 21:58:05 +0300 Subject: [PATCH 109/269] spotless --- .../gtceu/client/model/ctm/CTMCache.java | 28 ++++--- .../client/model/ctm/ConnectionCheck.java | 53 ++++++------ .../client/model/ctm/GTTextureMetadata.java | 3 +- .../gtceu/client/model/ctm/ISubmap.java | 28 ++++--- .../model/ctm/OctagonalOrientation.java | 83 ++++++++++--------- .../gtceu/client/model/ctm/Submap.java | 56 +++++++------ .../client/model/machine/MachineModel.java | 2 +- .../client/model/quad/EncodingFormat.java | 9 +- .../gtceu/client/model/quad/Mesh.java | 1 + .../gtceu/client/model/quad/MeshBuilder.java | 5 +- .../client/model/quad/MutableQuadView.java | 22 ++--- .../gtceu/client/model/quad/QuadView.java | 31 ++++--- .../gtceu/client/model/quad/SpriteFinder.java | 23 +++-- .../model/quad/transform/QuadTransform.java | 3 +- .../renderer/cover/FacadeCoverRenderer.java | 6 +- .../renderer/cover/IOCoverRenderer.java | 2 +- .../renderer/cover/SimpleCoverRenderer.java | 2 +- .../gtceu/client/util/TextureHelper.java | 6 +- .../client/util/TextureMetadataHelper.java | 6 +- .../client/util/quad/GeometryHelper.java | 24 +++--- .../transformers/InterpolationHelper.java | 3 +- .../util/quad/transformers/QuadClamper.java | 3 +- .../quad/transformers/QuadCornerKicker.java | 25 +++--- .../quad/transformers/QuadReInterpolator.java | 4 +- .../util/quad/transformers/QuadTinter.java | 3 +- .../common/data/models/GTMachineModels.java | 3 +- .../gtceu/common/item/LampBlockItem.java | 6 +- .../mixins/client/ModelBakerImplMixin.java | 2 +- .../core/mixins/client/TextureAtlasMixin.java | 14 ++-- 29 files changed, 232 insertions(+), 224 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index fd0733ae276..36ab302626e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -1,22 +1,22 @@ /* * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). - * Copyright (c) 2023 Chisel Team. - + * Copyright (c) 2023 Chisel Team. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - + * * ConnectedTexturesMod is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License along * with ConnectedTexturesMod; if not, If not, see . */ - package com.gregtechceu.gtceu.client.model.ctm; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; @@ -139,7 +139,6 @@ public interface StateComparisonCallback { protected byte connectionMap; protected int[] submapCache = defaultSubmapCache.clone(); - public static CTMCache getInstance() { return new CTMCache(); } @@ -192,7 +191,7 @@ public void buildConnectionMap(BlockAndTintGetter world, BlockPos pos, BlockStat // TODO this naive check doesn't work for models that have unculled faces. // Perhaps a smarter optimization could be done eventually? for (OctagonalOrientation dir : OctagonalOrientation.VALUES) { - //Note: We can't cache the state that we are checking about connection for as we want to ensure that + // Note: We can't cache the state that we are checking about connection for as we want to ensure that // we can take into account the side of the block we want to know the "state" of as if the block is // a facade of some sort it might return different results based on where it is being queried from setConnectedState(dir, dir.isConnected(this.connectionCheck, world, pos, state, side)); @@ -210,7 +209,8 @@ protected void fillSubmaps(int idx) { // This is a bit magic-y, but basically the array is ordered so // the first dir requires an offset of 2, and the second dir requires an offset of 8 // plus the initial offset for the corner. - this.submapCache[idx] = submapOffsets[idx] + (connected(dirs[0]) ? 2 : 0) + (connected(dirs[1]) ? 8 : 0); + this.submapCache[idx] = submapOffsets[idx] + (connected(dirs[0]) ? 2 : 0) + + (connected(dirs[1]) ? 8 : 0); } } } @@ -226,8 +226,9 @@ public boolean connected(OctagonalOrientation dir) { /** * @param dirs - * The directions to check connection in. - * @return True if the cached connectionMap holds a connection in all the given {@link OctagonalOrientation directions}. + * The directions to check connection in. + * @return True if the cached connectionMap holds a connection in all the given + * {@link OctagonalOrientation directions}. */ @SuppressWarnings("null") public boolean connectedAnd(OctagonalOrientation... dirs) { @@ -241,8 +242,9 @@ public boolean connectedAnd(OctagonalOrientation... dirs) { /** * @param dirs - * The directions to check connection in. - * @return True if the cached connectionMap holds a connection in one of the given {@link OctagonalOrientation directions}. + * The directions to check connection in. + * @return True if the cached connectionMap holds a connection in one of the given + * {@link OctagonalOrientation directions}. */ @SuppressWarnings("null") public boolean connectedOr(OctagonalOrientation... dirs) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java index a316143f23f..e2ea42d0882 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java @@ -1,21 +1,20 @@ /* * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). - * Copyright (c) 2023 Chisel Team. - + * Copyright (c) 2023 Chisel Team. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - + * * ConnectedTexturesMod is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License along * with ConnectedTexturesMod; if not, If not, see . */ - package com.gregtechceu.gtceu.client.model.ctm; import com.gregtechceu.gtceu.client.model.ctm.CTMCache.StateComparisonCallback; @@ -36,7 +35,8 @@ import org.jetbrains.annotations.Nullable; /** - * Sourced from ConnectedTexturesMod. + * Sourced from ConnectedTexturesMod. */ @NoArgsConstructor @AllArgsConstructor @@ -44,13 +44,13 @@ public class ConnectionCheck { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - Codec.BOOL.optionalFieldOf("ignore_states", false).forGetter(ConnectionCheck::ignoreStates) - ).apply(instance, ignoredStates -> new ConnectionCheck().ignoreStates(ignoredStates))); - + Codec.BOOL.optionalFieldOf("ignore_states", false).forGetter(ConnectionCheck::ignoreStates)) + .apply(instance, ignoredStates -> new ConnectionCheck().ignoreStates(ignoredStates))); + @Getter @Setter protected boolean ignoreStates; - + @Getter @Setter protected StateComparisonCallback stateComparator = StateComparisonCallback.DEFAULT; @@ -58,12 +58,12 @@ public class ConnectionCheck { /** * A simple check for if the given block can connect to the given direction on the given side. * - * @param level The level the positions are in. - * @param current The position of your block. + * @param level The level the positions are in. + * @param current The position of your block. * @param currentState The current state of your block. - * @param connection The position of the block to check against. - * @param dir The {@link Direction side} of the block to check for connection status. - * This is not the direction to check in. + * @param connection The position of the block to check against. + * @param dir The {@link Direction side} of the block to check for connection status. + * This is not the direction to check in. * @return True if the given block can connect to the given location on the given side. */ public final boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, @@ -76,17 +76,19 @@ public final boolean isConnected(BlockAndTintGetter level, BlockPos current, Blo /** * A simple check for if the given block can connect to the given direction on the given side. * - * @param level The level the positions are in. - * @param current The position of your block. + * @param level The level the positions are in. + * @param current The position of your block. * @param connection The position of the block to check against. - * @param dir The {@link Direction side} of the block to check for connection status. - * This is not the direction to check in. - * @param state The state to check against for connection. + * @param dir The {@link Direction side} of the block to check for connection status. + * This is not the direction to check in. + * @param state The state to check against for connection. * @return True if the given block can connect to the given location on the given side. */ @SuppressWarnings({ "unused", "null" }) - public boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, BlockPos connection, Direction dir, BlockState state) { - BlockState connectionState = getConnectionState(level, connection, level.getBlockState(connection), dir, current, currentState); + public boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, BlockPos connection, + Direction dir, BlockState state) { + BlockState connectionState = getConnectionState(level, connection, level.getBlockState(connection), dir, + current, currentState); BlockPos obscuringPos = connection.relative(dir); BlockState obscuring = getConnectionState(level, obscuringPos, level.getBlockState(obscuringPos), dir, current, currentState); @@ -94,7 +96,7 @@ public boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockStat // check that we aren't already connected to / from this side return stateComparator(state, connectionState, dir) && !stateComparator(state, obscuring, dir); } - + public boolean stateComparator(BlockState from, BlockState to, Direction dir) { return stateComparator.connects(this, from, to, dir); } @@ -111,5 +113,4 @@ public BlockState getConnectionState(BlockAndTintGetter level, BlockPos pos, Blo } return state; } - -} \ No newline at end of file +} 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 945b3df778b..03922701d1c 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 @@ -61,5 +61,4 @@ public String getMetadataSectionName() { return SECTION_NAME; } } - -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java index 2bd1818daa9..bfea41eb64a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ISubmap.java @@ -1,21 +1,20 @@ /* * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). - * Copyright (c) 2023 Chisel Team. - + * Copyright (c) 2023 Chisel Team. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - + * * ConnectedTexturesMod is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License along * with ConnectedTexturesMod; if not, If not, see . */ - package com.gregtechceu.gtceu.client.model.ctm; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -23,7 +22,8 @@ import lombok.RequiredArgsConstructor; /** - * Sourced from ConnectedTexturesMod. + * Sourced from ConnectedTexturesMod. */ public interface ISubmap { @@ -54,13 +54,13 @@ default ISubmap unitScale() { default ISubmap pixelScale() { return this; } - + float PIXELS_PER_UNIT = 16f; float UNITS_PER_PIXEL = 1f / PIXELS_PER_UNIT; @RequiredArgsConstructor class SubmapRescaled implements ISubmap { - + private final ISubmap parent; private final float ratio; private final boolean isPixelScale; @@ -110,12 +110,14 @@ public float[] toArray() { return parent.toArray(); } } - + default ISubmap flipX() { - return Submap.fromPixelScale(getWidth(), getHeight(), PIXELS_PER_UNIT - getXOffset() - getWidth(), getYOffset()); + return Submap.fromPixelScale(getWidth(), getHeight(), PIXELS_PER_UNIT - getXOffset() - getWidth(), + getYOffset()); } default ISubmap flipY() { - return Submap.fromPixelScale(getWidth(), getHeight(), getXOffset(), PIXELS_PER_UNIT - getYOffset() - getHeight()); + return Submap.fromPixelScale(getWidth(), getHeight(), getXOffset(), + PIXELS_PER_UNIT - getYOffset() - getHeight()); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java index 4b0a682568e..3bd98726df5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java @@ -1,21 +1,20 @@ /* * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). - * Copyright (c) 2023 Chisel Team. - + * Copyright (c) 2023 Chisel Team. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - + * * ConnectedTexturesMod is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License along * with ConnectedTexturesMod; if not, If not, see . */ - package com.gregtechceu.gtceu.client.model.ctm; import net.createmod.catnip.math.DirectionHelper; @@ -39,10 +38,12 @@ * but connected in the diagonal direction represented by {@link #TOP_RIGHT}. * This is used for inner corner rendering. *

- * Sourced from ConnectedTexturesMod. + * Sourced from ConnectedTexturesMod. */ public enum OctagonalOrientation implements StringRepresentable { - // spotless:off + + // spotless:off TOP(UP), TOP_RIGHT(UP, EAST), RIGHT(EAST), @@ -53,24 +54,24 @@ public enum OctagonalOrientation implements StringRepresentable { TOP_LEFT(UP, WEST); // spotless:on - public static final OctagonalOrientation[] VALUES = values(); - private static final Direction NORMAL = SOUTH; - - static { - // Run after static init - for (OctagonalOrientation dir : OctagonalOrientation.VALUES) { - dir.buildCaches(); - } - } - - private final Direction[] dirs; - - private final BlockPos[] offsets = new BlockPos[6]; - - OctagonalOrientation(Direction... dirs) { - this.dirs = dirs; + public static final OctagonalOrientation[] VALUES = values(); + private static final Direction NORMAL = SOUTH; + + static { + // Run after static init + for (OctagonalOrientation dir : OctagonalOrientation.VALUES) { + dir.buildCaches(); + } } - + + private final Direction[] dirs; + + private final BlockPos[] offsets = new BlockPos[6]; + + OctagonalOrientation(Direction... dirs) { + this.dirs = dirs; + } + private void buildCaches() { // Fill normalized dirs for (Direction normal : Direction.values()) { @@ -108,34 +109,36 @@ private void buildCaches() { } offsets[normal.ordinal()] = ret; } - } + } /** * Finds if this block is connected for the given side in this OctagonalOrientation. * - * @param ctm The ConnectionCheck instance to use for logic. + * @param ctm The ConnectionCheck instance to use for logic. * @param level The level the block is in. - * @param pos The position of your block. + * @param pos The position of your block. * @param state The state of your block. - * @param side The side of the current face. + * @param side The side of the current face. * @return True if the block is connected in the given OctagonalOrientation, false otherwise. */ - public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side) { + public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, + Direction side) { return ctm.isConnected(level, pos, state, applyConnection(pos, side), side); } /** * Finds if this block is connected for the given side in this OctagonalOrientation. * - * @param ctm The ConnectionCheck instance to use for logic. - * @param level The level the block is in. - * @param pos The position of your block. - * @param state The state of your block. - * @param side The side of the current face. + * @param ctm The ConnectionCheck instance to use for logic. + * @param level The level the block is in. + * @param pos The position of your block. + * @param state The state of your block. + * @param side The side of the current face. * @param connectionState The state to check for connection with. * @return True if the block is connected in the given OctagonalOrientation, false otherwise. */ - public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side, BlockState connectionState) { + public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, + Direction side, BlockState connectionState) { return ctm.isConnected(level, pos, state, applyConnection(pos, side), side, connectionState); } @@ -147,12 +150,12 @@ public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockP public BlockPos applyConnection(BlockPos pos, Direction side) { return pos.offset(getOffset(side)); } - + public BlockPos getOffset(Direction normal) { return offsets[normal.ordinal()]; } - private Direction rotate(Direction facing, Direction axisFacing) { + private Direction rotate(Direction facing, Direction axisFacing) { Direction.Axis axis = axisFacing.getAxis(); AxisDirection axisDir = axisFacing.getAxisDirection(); @@ -165,10 +168,10 @@ private Direction rotate(Direction facing, Direction axisFacing) { } return facing; - } + } @Override public String getSerializedName() { return name().toLowerCase(Locale.ROOT); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java index 3253750ebf1..56f7c2e3be1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java @@ -1,51 +1,58 @@ /* * This file is part of ConnectedTexturesMod (https://github.com/Chisel-Team/ConnectedTexturesMod). - * Copyright (c) 2023 Chisel Team. - + * Copyright (c) 2023 Chisel Team. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - + * * ConnectedTexturesMod is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License along * with ConnectedTexturesMod; if not, If not, see . */ - package com.gregtechceu.gtceu.client.model.ctm; import lombok.Getter; /** - * Sourced from ConnectedTexturesMod. + * Sourced from ConnectedTexturesMod. */ public class Submap implements ISubmap { - + public static final ISubmap X1 = fromPixelScale(16, 16, 0, 0); - + public static final ISubmap[][] X2 = { - { fromPixelScale(8, 8, 0, 0), fromPixelScale(8, 8, 8, 0) }, - { fromPixelScale(8, 8, 0, 8), fromPixelScale(8, 8, 8, 8) } + { fromPixelScale(8, 8, 0, 0), fromPixelScale(8, 8, 8, 0) }, + { fromPixelScale(8, 8, 0, 8), fromPixelScale(8, 8, 8, 8) } }; - + private static final float DIV3 = 16 / 3f; public static final ISubmap[][] X3 = { - { fromPixelScale(DIV3, DIV3, 0, 0), fromPixelScale(DIV3, DIV3, DIV3, 0), fromPixelScale(DIV3, DIV3, DIV3 * 2, 0) }, - { fromPixelScale(DIV3, DIV3, 0, DIV3), fromPixelScale(DIV3, DIV3, DIV3, DIV3), fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3) }, - { fromPixelScale(DIV3, DIV3, 0, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3 * 2) }, + { fromPixelScale(DIV3, DIV3, 0, 0), fromPixelScale(DIV3, DIV3, DIV3, 0), + fromPixelScale(DIV3, DIV3, DIV3 * 2, 0) }, + { fromPixelScale(DIV3, DIV3, 0, DIV3), fromPixelScale(DIV3, DIV3, DIV3, DIV3), + fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3) }, + { fromPixelScale(DIV3, DIV3, 0, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3, DIV3 * 2), + fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3 * 2) }, }; - + public static final ISubmap[][] X4 = { - { fromPixelScale(4, 4, 0, 0), fromPixelScale(4, 4, 4, 0), fromPixelScale(4, 4, 8, 0), fromPixelScale(4, 4, 12, 0) }, - { fromPixelScale(4, 4, 0, 4), fromPixelScale(4, 4, 4, 4), fromPixelScale(4, 4, 8, 4), fromPixelScale(4, 4, 12, 4) }, - { fromPixelScale(4, 4, 0, 8), fromPixelScale(4, 4, 4, 8), fromPixelScale(4, 4, 8, 8), fromPixelScale(4, 4, 12, 8) }, - { fromPixelScale(4, 4, 0, 12), fromPixelScale(4, 4, 4, 12), fromPixelScale(4, 4, 8, 12), fromPixelScale(4, 4, 12, 12) }, + { fromPixelScale(4, 4, 0, 0), fromPixelScale(4, 4, 4, 0), fromPixelScale(4, 4, 8, 0), + fromPixelScale(4, 4, 12, 0) }, + { fromPixelScale(4, 4, 0, 4), fromPixelScale(4, 4, 4, 4), fromPixelScale(4, 4, 8, 4), + fromPixelScale(4, 4, 12, 4) }, + { fromPixelScale(4, 4, 0, 8), fromPixelScale(4, 4, 4, 8), fromPixelScale(4, 4, 8, 8), + fromPixelScale(4, 4, 12, 8) }, + { fromPixelScale(4, 4, 0, 12), fromPixelScale(4, 4, 4, 12), fromPixelScale(4, 4, 8, 12), + fromPixelScale(4, 4, 12, 12) }, }; - + public static ISubmap[][] grid(int w, int h) { float xDiv = 16f / w; float yDiv = 16f / h; @@ -63,7 +70,8 @@ public static ISubmap raw(float width, float height, float xOffset, float yOffse } public static ISubmap fromUnitScale(float width, float height, float xOffset, float yOffset) { - return fromPixelScale(width * PIXELS_PER_UNIT, height * PIXELS_PER_UNIT, xOffset * PIXELS_PER_UNIT, yOffset * PIXELS_PER_UNIT); + return fromPixelScale(width * PIXELS_PER_UNIT, height * PIXELS_PER_UNIT, xOffset * PIXELS_PER_UNIT, + yOffset * PIXELS_PER_UNIT); } public static ISubmap fromPixelScale(float width, float height, float xOffset, float yOffset) { @@ -76,7 +84,7 @@ public static ISubmap fromPixelScale(float width, float height, float xOffset, f private final float xOffset, yOffset; final SubmapRescaled rescaled; - + private Submap(float width, float height, float xOffset, float yOffset, float rescale) { this.width = width; this.height = height; @@ -89,4 +97,4 @@ private Submap(float width, float height, float xOffset, float yOffset, float re public SubmapRescaled pixelScale() { return this.rescaled; } -} \ No newline at end of file +} 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 8d3982fca6f..068ddfcb348 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 @@ -10,11 +10,11 @@ import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartBakedModel; +import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.client.util.quad.QuadUtils; -import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java index 0005d09728c..85795309e0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/EncodingFormat.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,18 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.client.model.quad; import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; -import lombok.experimental.UtilityClass; -import org.jetbrains.annotations.Nullable; - import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraftforge.client.model.IQuadTransformer; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Nullable; + import java.util.Objects; /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java index bb27314165b..43f0d6610b4 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java @@ -21,6 +21,7 @@ * @implNote The way we encode meshes makes it very simple. */ public class Mesh { + /** Used to satisfy external calls to {@link #forEach(Consumer)}. */ private static final ThreadLocal POOL = ThreadLocal.withInitial(QuadView::new); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java index 7201327ac92..6da93a5ca21 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,10 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.client.model.quad; - /** * Similar in purpose to {@link com.mojang.blaze3d.vertex.BufferBuilder} but simpler and not tied to NIO * or any other specific implementation, plus designed to handle both static and dynamic building. @@ -70,6 +68,7 @@ public MutableQuadView getEmitter() { * used at render time so we want to capture all geometry now and apply non-location-dependent lighting. */ private class Maker extends MutableQuadView { + @Override public Maker emit() { computeGeometry(); 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 f83c03413ec..997af972b23 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 @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,16 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.client.model.quad; import com.gregtechceu.gtceu.client.util.TextureHelper; import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; -import org.jetbrains.annotations.Nullable; -import org.joml.Vector2f; -import org.joml.Vector3f; - import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -30,12 +25,18 @@ import net.minecraft.util.Mth; import net.minecraftforge.client.model.QuadTransformers; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector2f; +import org.joml.Vector3f; + import static com.gregtechceu.gtceu.client.model.quad.EncodingFormat.*; + /** * A mutable {@link QuadView} instance. * *

- * Instances of {@link MutableQuadView} will practically always be thread local and/or reused - do not retain references. + * Instances of {@link MutableQuadView} will practically always be thread local and/or reused - do not retain + * references. * *

* Only the renderer should implement or extend this interface. @@ -104,8 +105,9 @@ public static MutableQuadView getInstance() { return MutableQuadView.THREAD_LOCAL.get(); } + public static final ThreadLocal THREAD_LOCAL = ThreadLocal + .withInitial(() -> new MutableQuadView() { - public static final ThreadLocal THREAD_LOCAL = ThreadLocal.withInitial(() -> new MutableQuadView() { { begin(new int[QUAD_STRIDE], 0); } @@ -438,7 +440,6 @@ public final MutableQuadView fromVanilla(BakedQuad quad, @Nullable Direction cul */ public abstract MutableQuadView emit(); - /** * Tolerance for determining if the depth parameter to {@link #square(Direction, float, float, float, float, float)} * is effectively zero - meaning the face is a cull face. @@ -457,7 +458,8 @@ public final MutableQuadView fromVanilla(BakedQuad quad, @Nullable Direction cul *

* All coordinates should be normalized (0-1). */ - public MutableQuadView square(Direction nominalFace, float left, float bottom, float right, float top, float depth) { + public MutableQuadView square(Direction nominalFace, float left, float bottom, float right, float top, + float depth) { if (Math.abs(depth) < CULL_FACE_EPSILON) { cullFace(nominalFace); depth = 0; // avoid any inconsistency for face quads diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java index 416b88c33a1..5dd5101c791 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,18 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.client.model.quad; import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; -import lombok.Getter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnknownNullability; -import org.joml.Vector2f; -import org.joml.Vector3f; - import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlas; @@ -32,6 +24,13 @@ import net.minecraft.core.Direction; import net.minecraftforge.client.model.QuadTransformers; +import lombok.Getter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; +import org.joml.Vector2f; +import org.joml.Vector3f; + import static com.gregtechceu.gtceu.client.model.quad.EncodingFormat.*; /** @@ -43,6 +42,7 @@ */ @Accessors(fluent = true, chain = true) public class QuadView { + /** * See {@link MutableQuadView#nominalFace(Direction)}. */ @@ -226,7 +226,6 @@ public float x(int vertexIndex) { return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X]); } - /** * Retrieve geometric position, y coordinate. */ @@ -270,24 +269,24 @@ protected final int normalIndex(int vertexIndex) { * Will return {@link Float#NaN} if normal not present. */ public float normalX(int vertexIndex) { - return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 0) - : Float.NaN; + return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 0) : + Float.NaN; } /** * Will return {@link Float#NaN} if normal not present. */ public float normalY(int vertexIndex) { - return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 1) - : Float.NaN; + return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 1) : + Float.NaN; } /** * Will return {@link Float#NaN} if normal not present. */ public float normalZ(int vertexIndex) { - return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 2) - : Float.NaN; + return hasNormal(vertexIndex) ? GeometryHelper.getPackedNormalComponent(data[normalIndex(vertexIndex)], 2) : + Float.NaN; } /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java index cc912bfc868..a7c67f1cb40 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,12 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.client.model.quad; -import java.util.Map; -import java.util.function.Consumer; - import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -27,6 +23,9 @@ import org.jetbrains.annotations.Nullable; +import java.util.Map; +import java.util.function.Consumer; + /** * Indexes a texture atlas to allow fast lookup of Sprites from baked vertex coordinates. * Main use is for {@link Mesh}-based models to generate vanilla quads on demand @@ -95,13 +94,18 @@ public TextureAtlasSprite find(float u, float v) { } private class Node { + final float midU; final float midV; final float cellRadius; - @Nullable Object lowLow = null; - @Nullable Object lowHigh = null; - @Nullable Object highLow = null; - @Nullable Object highHigh = null; + @Nullable + Object lowLow = null; + @Nullable + Object lowHigh = null; + @Nullable + Object highLow = null; + @Nullable + Object highHigh = null; Node(float midU, float midV, float radius) { this.midU = midU; @@ -172,6 +176,7 @@ private TextureAtlasSprite findInner(@Nullable Object quadrant, float u, float v } public interface SpriteFinderAccess { + SpriteFinder gtceu$spriteFinder(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java index 0f7186c3da3..b604160adf5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/transform/QuadTransform.java @@ -7,6 +7,7 @@ @FunctionalInterface public interface QuadTransform extends IQuadTransformer { + /** * Return false to filter out quads from rendering. When more than one transform is in effect, returning false * means unapplied transforms will not receive the quad. @@ -19,4 +20,4 @@ default void processInPlace(BakedQuad quad) { this.transform(quadView); quadView.toVanilla(quad.getVertices(), 0); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java index 8c1d79c06e7..be3f81685a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java @@ -5,10 +5,10 @@ import com.gregtechceu.gtceu.client.model.BaseBakedModel; import com.gregtechceu.gtceu.client.model.ItemBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; +import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import com.gregtechceu.gtceu.client.util.FacadeBlockAndTintGetter; import com.gregtechceu.gtceu.client.util.RenderUtil; import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; -import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import com.gregtechceu.gtceu.common.cover.FacadeCover; import com.gregtechceu.gtceu.common.item.behavior.FacadeItemBehaviour; import com.gregtechceu.gtceu.utils.GTUtil; @@ -191,8 +191,8 @@ public void renderCover(List quads, Direction side, RandomSource rand BakedModel model = RenderUtil.getModelForState(state); ModelData facadeModelData = model.getModelData(level, pos, state, modelData); - - if (renderType != null && !facadeModel.getRenderTypes(facadeState, rand, facadeModelData).contains(renderType)) { + if (renderType != null && + !facadeModel.getRenderTypes(facadeState, rand, facadeModelData).contains(renderType)) { return; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java index ea1e98634bf..5c8fd4da25d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/IOCoverRenderer.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.IIOCover; -import com.gregtechceu.gtceu.client.util.ModelEventHelper; import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; +import com.gregtechceu.gtceu.client.util.ModelEventHelper; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java index 767a3cad5af..c9acfcd6477 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/SimpleCoverRenderer.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.client.renderer.cover; import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.client.util.ModelEventHelper; import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; +import com.gregtechceu.gtceu.client.util.ModelEventHelper; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; 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 cd21ca50246..f31a66b4de9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.client.util; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; @@ -109,12 +108,13 @@ public static void normalizeBy(MutableQuadView q, TextureAtlasSprite sprite) { // If the UV is outside the texture's boundaries, this was probably called by mistake. if (u < uMin || u > uMax || v < vMin || v > vMax) continue; - q.uv(i, (u - uMin) / uSpan, (v - vMin) / vSpan); + q.uv(i, (u - uMin) / uSpan, (v - vMin) / vSpan); } } @FunctionalInterface public interface VertexModifier { + void apply(MutableQuadView quad, int vertexIndex); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java index 515e895ec2f..9ed03e35404 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -17,7 +17,7 @@ @UtilityClass public class TextureMetadataHelper { - + private static final Map metadataCache = new HashMap<>(); public static Optional getMetadata(ResourceLocation res) { @@ -60,8 +60,8 @@ public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { } return sprite; } - + static void invalidateCaches() { metadataCache.clear(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java index dd91c8b60b0..01fc65ccd43 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/GeometryHelper.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,23 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.client.util.quad; import com.gregtechceu.gtceu.client.model.quad.QuadView; import com.gregtechceu.gtceu.utils.GTUtil; -import lombok.experimental.UtilityClass; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.Nullable; -import org.joml.Vector3f; - import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Vec3i; import net.minecraft.util.Mth; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; + /** * Static routines of general utility for renderer implementations. * Renderers are not required to use these helpers, but they were designed to be usable without the default renderer. @@ -105,10 +104,8 @@ public static int packNormal(float x, float y, float z, float w) { z = Mth.clamp(z, -1, 1); w = Mth.clamp(w, -1, 1); - return ((int) (x * 127) & 255) - | (((int) (y * 127) & 255) << 8) - | (((int) (z * 127) & 255) << 16) - | (((int) (w * 127) & 255) << 24); + return ((int) (x * 127) & 255) | (((int) (y * 127) & 255) << 8) | (((int) (z * 127) & 255) << 16) | + (((int) (w * 127) & 255) << 24); } /** @@ -192,8 +189,7 @@ public static boolean isQuadParallelToFace(@Nullable Direction face, QuadView qu int i = face.getAxis().ordinal(); final float val = quad.posByIndex(0, i); - return Mth.equal(val, quad.posByIndex(1, i)) - && Mth.equal(val, quad.posByIndex(2, i)) - && Mth.equal(val, quad.posByIndex(3, i)); + return Mth.equal(val, quad.posByIndex(1, i)) && Mth.equal(val, quad.posByIndex(2, i)) && + Mth.equal(val, quad.posByIndex(3, i)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java index 275d5fa6a6b..f1b1d5404fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/InterpolationHelper.java @@ -9,13 +9,12 @@ * * CodeChickenLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CodeChickenLib. If not, see . */ - package com.gregtechceu.gtceu.client.util.quad.transformers; import net.minecraft.util.Mth; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java index 9e7aa728dae..9ca6980a74d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadClamper.java @@ -9,13 +9,12 @@ * * CodeChickenLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CodeChickenLib. If not, see . */ - package com.gregtechceu.gtceu.client.util.quad.transformers; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java index 1d62b2f4f55..fe849c4d525 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadCornerKicker.java @@ -9,18 +9,17 @@ * * CodeChickenLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CodeChickenLib. If not, see . */ - package com.gregtechceu.gtceu.client.util.quad.transformers; +import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; import com.gregtechceu.gtceu.client.model.quad.transform.QuadTransform; import com.gregtechceu.gtceu.client.util.quad.GeometryHelper; -import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.Direction; @@ -31,8 +30,8 @@ import org.jetbrains.annotations.Nullable; -import static net.minecraft.core.Direction.AxisDirection.*; import static net.minecraft.core.Direction.*; +import static net.minecraft.core.Direction.AxisDirection.*; /** * This transformer is a little complicated. @@ -40,10 +39,10 @@ *

* Use it by specifying *

    - *
  • the side of the block you are on,
  • - *
  • the bitmask for where the other Facades / Covers are,
  • - *
  • the bounding box of the facade (NOT the hole piece),
  • - *
  • and the thickness of your Facade / Cover (which is used as the kick amount).
  • + *
  • the side of the block you are on,
  • + *
  • the bitmask for where the other Facades / Covers are,
  • + *
  • the bounding box of the facade (NOT the hole piece),
  • + *
  • and the thickness of your Facade / Cover (which is used as the kick amount).
  • *
* * @author covers1624 @@ -127,9 +126,8 @@ public boolean transform(MutableQuadView quad) { float x = quad.posByIndex(i, 0); float y = quad.posByIndex(i, 1); float z = quad.posByIndex(i, 2); - if (Mth.equal(x, corner.pX(this.bounds)) - && Mth.equal(y, corner.pY(this.bounds)) - && Mth.equal(z, corner.pZ(this.bounds))) { + if (Mth.equal(x, corner.pX(this.bounds)) && Mth.equal(y, corner.pY(this.bounds)) && + Mth.equal(z, corner.pZ(this.bounds))) { Vec3i normal = hoz.getNormal(); x -= normal.getX() * this.thickness; y -= normal.getY() * this.thickness; @@ -143,9 +141,7 @@ public boolean transform(MutableQuadView quad) { } @Override - public void processInPlace(BakedQuad quad) { - - } + public void processInPlace(BakedQuad quad) {} public enum Corner { @@ -206,5 +202,4 @@ public float pZ(AABB box) { return (float) (this.zAxis == NEGATIVE ? box.minZ : box.maxZ); } } - } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java index 4c0849b0c9a..bc3cf275201 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadReInterpolator.java @@ -9,13 +9,12 @@ * * CodeChickenLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CodeChickenLib. If not, see . */ - package com.gregtechceu.gtceu.client.util.quad.transformers; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; @@ -187,5 +186,4 @@ private static int yCoord(Direction.Axis axis) { return 2; } } - } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java index 0af06ab6c11..06a50545782 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/transformers/QuadTinter.java @@ -9,13 +9,12 @@ * * CodeChickenLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CodeChickenLib. If not, see . */ - package com.gregtechceu.gtceu.client.util.quad.transformers; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java index d4cdf600f2c..6ba47cd12d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java @@ -598,7 +598,8 @@ public static MachineBuilder.ModelInitializer createHPCAPartModel(boolean advanc } public static final ResourceLocation OVERLAY_SCREEN_TEXTURE = GTCEu.id("block/overlay/machine/overlay_screen"); - public static final ResourceLocation OVERLAY_QTANK_EMISSIVE_TEXTURE = GTCEu.id("block/overlay/machine/overlay_qtank_emissive"); + public static final ResourceLocation OVERLAY_QTANK_EMISSIVE_TEXTURE = GTCEu + .id("block/overlay/machine/overlay_qtank_emissive"); public static MachineBuilder.ModelInitializer createFisherModel() { return (ctx, prov, builder) -> { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java index 05e8f0f5df4..4f961ad3af0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java @@ -5,8 +5,6 @@ import com.gregtechceu.gtceu.client.util.ModelEventHelper; import com.gregtechceu.gtceu.common.block.LampBlock; -import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; - import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.NonNullList; @@ -21,6 +19,7 @@ import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.client.model.BakedModelWrapper; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -100,7 +99,8 @@ private static void registerEventListener(LampBlockItem toWrap) { // handle both cases 1.20 can have passed here. 1.21 *only* has the ModelResourceLocation case. ResourceLocation possibleItemId; - if (modelLocation instanceof ModelResourceLocation modelResLoc && Objects.equals(modelResLoc.getVariant(), "inventory")) { + if (modelLocation instanceof ModelResourceLocation modelResLoc && + Objects.equals(modelResLoc.getVariant(), "inventory")) { // unwrap ModelResourceLocations // 1.21 needs different code here as ModelResourceLocation is a wrapper record instead of a subclass possibleItemId = modelResLoc.withPrefix(""); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java index 6cf2c33db95..bd8aef34c66 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBakerImplMixin.java @@ -13,7 +13,7 @@ import java.util.function.Function; -@Mixin(targets = {"net.minecraft.client.resources.model.ModelBakery$ModelBakerImpl"}) +@Mixin(targets = { "net.minecraft.client.resources.model.ModelBakery$ModelBakerImpl" }) public abstract class ModelBakerImplMixin { // the parameters aren't remapped because Parchment can't remap Forge's patches diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java index 1427a97168b..e06a756efb9 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/TextureAtlasMixin.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -13,12 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.gregtechceu.gtceu.core.mixins.client; import com.gregtechceu.gtceu.client.model.quad.SpriteFinder; -import java.util.Map; +import net.minecraft.client.renderer.texture.SpriteLoader; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; @@ -28,13 +30,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.client.renderer.texture.SpriteLoader; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; +import java.util.Map; @Mixin(TextureAtlas.class) public class TextureAtlasMixin implements SpriteFinder.SpriteFinderAccess { + @Shadow private Map texturesByName; From 0648242c4df553f39ae5f414edb0f99af225de85 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 22:00:49 +0300 Subject: [PATCH 110/269] Fix errors caused by dropping commits a bit too hastily --- .../renderer/cover/FacadeCoverRenderer.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java index be3f81685a5..2ca9c016403 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/cover/FacadeCoverRenderer.java @@ -181,30 +181,26 @@ public void renderCover(List quads, Direction side, RandomSource rand if (!(coverBehavior instanceof FacadeCover facadeCover)) { return; } - BlockState state = facadeCover.getFacadeState(); - if (state.getRenderShape() != RenderShape.MODEL) { + BlockState facadeSate = facadeCover.getFacadeState(); + if (facadeSate.getRenderShape() != RenderShape.MODEL) { return; } Direction attachedSide = coverBehavior.attachedSide; - BakedModel model = RenderUtil.getModelForState(state); - ModelData facadeModelData = model.getModelData(level, pos, state, modelData); + BakedModel facadeModel = RenderUtil.getModelForState(facadeSate); + ModelData facadeModelData = facadeModel.getModelData(level, pos, facadeSate, modelData); if (renderType != null && - !facadeModel.getRenderTypes(facadeState, rand, facadeModelData).contains(renderType)) { + !facadeModel.getRenderTypes(facadeSate, rand, facadeModelData).contains(renderType)) { return; } - List facadeQuads = model.getQuads(state, attachedSide, rand, facadeModelData, renderType); + List facadeQuads = facadeModel.getQuads(facadeSate, attachedSide, rand, facadeModelData, renderType); facadeQuads = new LinkedList<>(facadeQuads); List coverQuads = new ArrayList<>(); if (side == attachedSide) { - for (BakedQuad quad : facadeQuads) { - // clamp the facade quads' vertices into the model - coverQuads.add(FACADE_PLANE_TRANSFORMER.process(quad)); - } coverQuads.addAll(facadeQuads); } else if (side == null && coverBehavior.coverHolder.shouldRenderBackSide()) { AABB cube = COVER_BACK_CUBES.get(attachedSide); @@ -221,7 +217,7 @@ public void renderCover(List quads, Direction side, RandomSource rand for (BakedQuad quad : coverQuads) { if (quad.isTinted()) { // if the quad has a tint index set, bake the tint into the vertex - int color = blockColors.getColor(state, level, pos, quad.getTintIndex()); + int color = blockColors.getColor(facadeSate, level, pos, quad.getTintIndex()); quad = GTQuadTransformers.setColor(quad, color, true); } else { // otherwise just copy the quad so we don't mutate the original model with the overlay offset From 40efad08cdb1df8466cf4396dde5b01dd35edca0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 22:59:25 +0300 Subject: [PATCH 111/269] Fix corrupt JSON --- .../assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta index a11349bfaee..ccea6d28ebc 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta @@ -2,6 +2,6 @@ "gtceu": { "connection_texture": "gtceu:block/lamps/black_ctm_emissive", "bloom": true - }, + } } From 4000a51d04de3da98c41f226b21e7d6a40abbdc3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 18 Apr 2026 23:24:41 +0300 Subject: [PATCH 112/269] Make world load --- .../model/ctm/OctagonalOrientation.java | 9 +---- .../gtceu/client/model/quad/MeshBuilder.java | 1 + .../client/model/quad/MutableQuadView.java | 6 --- .../gtceu/common/item/LampBlockItem.java | 40 +++++++++---------- 4 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java index 3bd98726df5..18d1e22378c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java @@ -17,7 +17,6 @@ */ package com.gregtechceu.gtceu.client.model.ctm; -import net.createmod.catnip.math.DirectionHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; @@ -160,14 +159,10 @@ private Direction rotate(Direction facing, Direction axisFacing) { AxisDirection axisDir = axisFacing.getAxisDirection(); if (axisDir == AxisDirection.POSITIVE) { - return DirectionHelper.rotateAround(facing, axis); - } - - if (facing.getAxis() != axis) { + return facing.getClockWise(axis); + } else { return facing.getCounterClockWise(axis); } - - return facing; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java index 6da93a5ca21..bfebec00b2b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/MeshBuilder.java @@ -72,6 +72,7 @@ private class Maker extends MutableQuadView { @Override public Maker emit() { computeGeometry(); + populateMissingNormals(); index += EncodingFormat.QUAD_STRIDE; ensureCapacity(); baseIndex = index; 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 997af972b23..f9c85947d44 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 @@ -124,12 +124,6 @@ public final void begin(int[] data, int baseIndex) { clear(); } - @Override - protected void computeGeometry() { - this.populateMissingNormals(); - super.computeGeometry(); - } - public void clear() { System.arraycopy(EMPTY, 0, data, baseIndex, QUAD_STRIDE); isGeometryInvalid = true; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java index 4f961ad3af0..45ce8c53b40 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java @@ -19,12 +19,12 @@ import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.client.model.BakedModelWrapper; -import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import it.unimi.dsi.fastutil.objects.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; import javax.annotation.ParametersAreNonnullByDefault; @@ -88,14 +88,20 @@ public BlockEntityWithoutLevelRenderer getCustomRenderer() { private static class ClientCallWrapper { private static boolean registeredListener = false; - private static final Map trackedItems = new Reference2ObjectArrayMap<>(); + private static final Set trackedItems = new ReferenceLinkedOpenHashSet<>(); + private static final Set trackedItemIds = new ObjectLinkedOpenHashSet<>(); private static void registerEventListener(LampBlockItem toWrap) { - trackedItems.put(toWrap, null); + trackedItems.add(toWrap); if (registeredListener) return; registeredListener = true; ModelEventHelper.registerBakeEventListener(false, (modelLocation, model, unbakedModel, modelBakery) -> { + if (trackedItemIds.isEmpty()) { + for (Item item : trackedItems) { + trackedItemIds.add(BuiltInRegistries.ITEM.getKey(item)); + } + } // handle both cases 1.20 can have passed here. 1.21 *only* has the ModelResourceLocation case. ResourceLocation possibleItemId; @@ -111,25 +117,19 @@ private static void registerEventListener(LampBlockItem toWrap) { return model; } - for (var entry : trackedItems.entrySet()) { - ResourceLocation itemId = entry.getValue(); - if (itemId == null) { - entry.setValue(itemId = BuiltInRegistries.ITEM.getKey(entry.getKey())); - } + if (trackedItemIds.contains(possibleItemId)) { // if the current model is a lamp item, replace it with one that has isCustomRenderer()==true // so the custom renderer in `LampBlockItem#initializeClient` works - if (itemId.equals(possibleItemId)) { - return new BakedModelWrapper<>(model) { - - @Override - public boolean isCustomRenderer() { - return true; - } - }; - } - } + return new BakedModelWrapper<>(model) { - return model; + @Override + public boolean isCustomRenderer() { + return true; + } + }; + } else { + return model; + } }); } } From 18a7165e381d1044df68b299d7b8aa84596e2e9a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 00:04:56 +0300 Subject: [PATCH 113/269] Force our reload listener to the front of the queue --- .../gtceu/client/util/ModelEventHelper.java | 17 +++++++++++------ .../ReloadableResourceManagerAccessor.java | 16 ++++++++++++++++ src/main/resources/gtceu.mixins.json | 1 + 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ReloadableResourceManagerAccessor.java 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 bd94a742896..1a25613bc34 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -4,7 +4,9 @@ import com.gregtechceu.gtceu.client.model.ctm.CTMBakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; +import com.gregtechceu.gtceu.core.mixins.ReloadableResourceManagerAccessor; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.*; @@ -75,12 +77,15 @@ public static void registerAddModelsEventListener(boolean removeOnReload, @SubscribeEvent(priority = EventPriority.HIGH) public static void registerReloadListener(RegisterClientReloadListenersEvent event) { - event.registerReloadListener((ResourceManagerReloadListener) resourceManager -> { - EVENT_LISTENERS.removeIf(EventListenerHolder::removeOnReload); - - CTM_SPRITE_CACHE.clear(); - TextureMetadataHelper.invalidateCaches(); - }); + ((ReloadableResourceManagerAccessor) Minecraft.getInstance().getResourceManager()).getListeners() + .add(0, (ResourceManagerReloadListener) resourceManager -> { + EVENT_LISTENERS.removeIf(EventListenerHolder::removeOnReload); + + CTM_SPRITE_CACHE.clear(); + WRAPPED_MODELS.clear(); + SCRAPED_TEXTURES.clear(); + TextureMetadataHelper.invalidateCaches(); + }); } @SuppressWarnings("unchecked") diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ReloadableResourceManagerAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ReloadableResourceManagerAccessor.java new file mode 100644 index 00000000000..1aae111b199 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ReloadableResourceManagerAccessor.java @@ -0,0 +1,16 @@ +package com.gregtechceu.gtceu.core.mixins; + +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ReloadableResourceManager; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(ReloadableResourceManager.class) +public interface ReloadableResourceManagerAccessor { + + @Accessor + List getListeners(); +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index cd2192122ee..2e54e0bb7f2 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -55,6 +55,7 @@ "PotionBrewingAccessor", "PrimedTntAccessor", "RecipeManagerMixin", + "ReloadableResourceManagerAccessor", "RepairItemRecipeMixin", "ServerChunkProviderMixin", "ServerGamePacketListenerImplAccessor", From aa375a343a20d8969d4142a43757aa2ade6883fe Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 01:09:33 +0300 Subject: [PATCH 114/269] quh. --- .../client/model/quad/MutableQuadView.java | 6 +- .../gtceu/client/model/quad/QuadView.java | 8 +- .../gtceu/client/util/ModelEventHelper.java | 15 +++- .../gtceu/client/util/TextureHelper.java | 2 +- .../gtceu/client/util/quad/QuadUtils.java | 78 +++++++++++++++---- 5 files changed, 83 insertions(+), 26 deletions(-) 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 f9c85947d44..271e187f2c9 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 @@ -96,8 +96,8 @@ public abstract class MutableQuadView extends QuadView { /** * 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)}. + * avoid wasteful multiplication/division by passing 0-1 coordinates directly. + * Pass in bakeFlags parameter to {@link #spriteBake(TextureAtlasSprite, int)}. */ public static final int BAKE_NORMALIZED = 0b100000; @@ -403,7 +403,7 @@ public final MutableQuadView fromVanilla(int[] quadData, int startIndex) { for (int i = 0; i < 4; i++) { // ARGB -> ABGR is a transitive process, e.g. it can be reversed and works fine. - this.data[colorIndex] = QuadTransformers.toABGR(this.data[colorIndex]); + //this.data[colorIndex] = QuadTransformers.toABGR(this.data[colorIndex]); colorIndex += VERTEX_STRIDE; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java index 5dd5101c791..34b292774a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java @@ -322,13 +322,9 @@ public float v(int vertexIndex) { public final void toVanilla(int[] target, int targetIndex) { System.arraycopy(data, baseIndex, target, targetIndex, QUAD_STRIDE); - // The color is the fourth integer in each vertex. - // EncodingFormat.VERTEX_COLOR is not used because it also - // contains the header size; vanilla quads do not have a header. - int colorIndex = targetIndex + 3; - + int colorIndex = EncodingFormat.VERTEX_COLOR; for (int i = 0; i < 4; i++) { - target[colorIndex] = QuadTransformers.toABGR(target[colorIndex]); + //target[colorIndex] = QuadTransformers.toABGR(target[colorIndex]); colorIndex += VERTEX_STRIDE; } } 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 1a25613bc34..89600e160bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -29,6 +29,8 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; @SuppressWarnings("deprecation") @UtilityClass @@ -75,11 +77,15 @@ public static void registerAddModelsEventListener(boolean removeOnReload, EVENT_LISTENERS.add(new EventListenerHolder<>(listener, removeOnReload)); } + private static final AtomicInteger reloadCounter = new AtomicInteger(0); + @SubscribeEvent(priority = EventPriority.HIGH) public static void registerReloadListener(RegisterClientReloadListenersEvent event) { ((ReloadableResourceManagerAccessor) Minecraft.getInstance().getResourceManager()).getListeners() .add(0, (ResourceManagerReloadListener) resourceManager -> { - EVENT_LISTENERS.removeIf(EventListenerHolder::removeOnReload); + if (reloadCounter.addAndGet(1) > 1) { + EVENT_LISTENERS.removeIf(EventListenerHolder::removeOnReload); + } CTM_SPRITE_CACHE.clear(); WRAPPED_MODELS.clear(); @@ -174,7 +180,12 @@ public static void initInternalAssetReloadListeners() { dependencies.push(rl); seenModels.add(rl); - boolean shouldWrap = ModelEventHelper.WRAPPED_MODELS.getOrDefault(rl, false); + boolean shouldWrap = WRAPPED_MODELS.getOrDefault(rl, false); + if (WRAPPED_MODELS.containsKey(rl)) { + // shortcut if the model's already been checked + if (shouldWrap) return new CTMBakedModel<>(baked); + else return baked; + } // Breadth-first loop through dependencies // exiting as soon as a CTM texture is found, and skipping duplicates/cycles PARENT_LOOP: 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 f31a66b4de9..e77d911a02a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -47,7 +47,7 @@ public static void bakeSprite(MutableQuadView quad, @Nullable TextureAtlasSprite // Assigns normalized UV coordinates based on vertex positions applyModifier(quad, UV_LOCKERS[quad.nominalFace().get3DDataValue()]); } else if ((MutableQuadView.BAKE_NORMALIZED & bakeFlags) == 0) { - // flag is NOT set, UVs are assumed to not be normalized yet as is the default, + // 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 diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 83ac4aebefc..6d1ff7bc06d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.client.model.ctm.CTMCache; import com.gregtechceu.gtceu.client.model.ctm.ISubmap; +import com.gregtechceu.gtceu.client.model.ctm.Submap; import com.gregtechceu.gtceu.client.model.quad.MeshBuilder; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; import com.gregtechceu.gtceu.client.util.TextureHelper; @@ -14,9 +15,9 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec2; import net.minecraftforge.client.model.IQuadTransformer; -import it.unimi.dsi.fastutil.Pair; import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector3f; @@ -28,7 +29,7 @@ public class QuadUtils { - public static Pair findMinMaxUVs(Vector2f[] uvs) { + public static Vector2f[] findMinMaxUVs(Vector2f[] uvs) { float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE, maxU = Float.MIN_VALUE, maxV = Float.MIN_VALUE; for (int i = 0; i < 4; i++) { @@ -38,7 +39,7 @@ public static Pair findMinMaxUVs(Vector2f[] uvs) { maxU = Math.max(maxU, uv.x()); maxV = Math.max(maxV, uv.y()); } - return Pair.of(new Vector2f(minU, minV), new Vector2f(maxU, maxV)); + return new Vector2f[]{ new Vector2f(minU, minV), new Vector2f(maxU, maxV) }; } public static int findMinUVIndex(Vector2f[] uvs) { @@ -118,10 +119,10 @@ public static List buildCTMQuads(CTMCache cachedConnections, List buildCTMQuads(CTMCache cachedConnections, List 15 ? originalQuad.getSprite() : connection; + TextureAtlasSprite ctmSprite = ctm[quadrant] > 15 ? originalSprite : connectionSprite; emitter.fromVanilla(originalQuad, cullFace); - TextureHelper.normalizeBy(emitter, sprite); + TextureHelper.normalizeBy(emitter, originalSprite); interpolator.setInputQuad(emitter); // slice quad into the current quadrant - subsect(emitter, CTMCache.uvs[ctm[quadrant]].unitScale()); - - interpolator.transform(emitter); + subsect(emitter, Submap.X2[quadrant % 2][quadrant / 2]); + transformUVs(emitter, CTMCache.uvs[ctm[quadrant]]); // derotate quad here - emitter.spriteBake(ctmSprite, BAKE_LOCK_UV | BAKE_NORMALIZED); + emitter.spriteBake(ctmSprite, BAKE_NORMALIZED); + + //interpolator.transform(emitter); emitter.emit(); } @@ -150,6 +152,46 @@ public static List buildCTMQuads(CTMCache cachedConnections, List 0.5f ? 0.5f : 0.0f, maxUV.y > 0.5f ? 0.5f : 0.0f); + Vector2f interpolatedMaxUV = new Vector2f(maxUV.x <= 0.5f ? 0.5f : 1.0f, maxUV.y <= 0.5f ? 0.5f : 1.0f); + + uvs[0] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[0]); + uvs[1] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[1]); + uvs[2] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[2]); + uvs[3] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[3]); + } + + private static void transformUVs(MutableQuadView quad, ISubmap submap) { + submap = submap.unitScale(); + + Vector2f[] uvs = new Vector2f[4]; + for (int i = 0; i < 4; i++) { + uvs[i] = quad.copyUv(i, uvs[i]); + } + Vector2f[] minMaxUVs = findMinMaxUVs(uvs); + Vector2f minUV = minMaxUVs[0], maxUV = minMaxUVs[1]; + + growQuadrantUVs(uvs, maxUV); + + + float width = maxUV.x - minUV.x; + float height = maxUV.y - minUV.y; + + float minU = submap.getXOffset(); + float minV = submap.getYOffset(); + minU += minUV.x * submap.getWidth(); + minV += minUV.y * submap.getHeight(); + + float maxU = minU + (width * submap.getWidth()); + float maxV = minV + (height * submap.getHeight()); + + quad.uv(0, equal(uvs[0].x, minUV.x) ? minU : maxU, equal(uvs[0].y, minUV.y) ? minV : maxV); + quad.uv(1, equal(uvs[1].x, minUV.x) ? minU : maxU, equal(uvs[1].y, minUV.y) ? minV : maxV); + quad.uv(2, equal(uvs[2].x, minUV.x) ? minU : maxU, equal(uvs[2].y, minUV.y) ? minV : maxV); + quad.uv(3, equal(uvs[3].x, minUV.x) ? minU : maxU, equal(uvs[3].y, minUV.y) ? minV : maxV); + } + // TODO simplify, this is quite long public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { Vector2f[] uvs = new Vector2f[4]; @@ -238,8 +280,16 @@ public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { return quad; } - public static float normalize(float min, float max, float x) { + private static Vector2f normalize(Vector2f min, Vector2f max, Vector2f delta) { + return new Vector2f(normalize(min.x, max.x, delta.x), normalize(min.y, max.y, delta.y)); + } + + public static float normalize(float min, float max, float delta) { if (min == max) return 0.5f; - return Mth.inverseLerp(x, min, max); + return Mth.inverseLerp(delta, min, max); + } + + public static boolean equal(float x, float y) { + return Math.abs(y - x) < 1.0E-2F; } } From d7326c166430f1e9f692ecd475aac97abcbe0396 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:33:48 +0300 Subject: [PATCH 115/269] Make CTMCache have a stable hash --- .../gregtechceu/gtceu/client/model/ctm/CTMCache.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 36ab302626e..802bc32fdef 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -272,4 +272,15 @@ public boolean connectedOnly(OctagonalOrientation... dirs) { } return map == this.connectionMap; } + + @Override + public int hashCode() { + return this.connectionMap; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof CTMCache other)) return false; + return this.connectionMap == other.connectionMap; + } } From 734ac556cb79b934fc23a988ded0af6ceeca1e9b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:52:28 +0300 Subject: [PATCH 116/269] Fix the quads' UV layout --- .../gtceu/client/util/quad/QuadUtils.java | 100 ++++++++++-------- 1 file changed, 56 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 6d1ff7bc06d..e43d87791c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -152,14 +152,20 @@ public static List buildCTMQuads(CTMCache cachedConnections, List 0.5f ? 0.5f : 0.0f, maxUV.y > 0.5f ? 0.5f : 0.0f); - Vector2f interpolatedMaxUV = new Vector2f(maxUV.x <= 0.5f ? 0.5f : 1.0f, maxUV.y <= 0.5f ? 0.5f : 1.0f); - - uvs[0] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[0]); - uvs[1] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[1]); - uvs[2] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[2]); - uvs[3] = normalize(interpolatedMinUV, interpolatedMaxUV, uvs[3]); + float minUInterp = maxUV.x > 0.5f ? 0.5f : 0.0f, + minVInterp = maxUV.y > 0.5f ? 0.5f : 0.0f; + float maxUInterp = maxUV.x > 0.5f ? 1.0f : 0.5f, + maxVInterp = maxUV.y > 0.5f ? 1.0f : 0.5f; + + normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[0]); + normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[1]); + normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[2]); + normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[3]); } private static void transformUVs(MutableQuadView quad, ISubmap submap) { @@ -170,10 +176,11 @@ private static void transformUVs(MutableQuadView quad, ISubmap submap) { uvs[i] = quad.copyUv(i, uvs[i]); } Vector2f[] minMaxUVs = findMinMaxUVs(uvs); - Vector2f minUV = minMaxUVs[0], maxUV = minMaxUVs[1]; - - growQuadrantUVs(uvs, maxUV); + growQuadrantUVs(uvs, minMaxUVs[1]); + // recompute min & max UVs + minMaxUVs = findMinMaxUVs(uvs); + Vector2f minUV = minMaxUVs[0], maxUV = minMaxUVs[1]; float width = maxUV.x - minUV.x; float height = maxUV.y - minUV.y; @@ -186,12 +193,24 @@ private static void transformUVs(MutableQuadView quad, ISubmap submap) { float maxU = minU + (width * submap.getWidth()); float maxV = minV + (height * submap.getHeight()); - quad.uv(0, equal(uvs[0].x, minUV.x) ? minU : maxU, equal(uvs[0].y, minUV.y) ? minV : maxV); - quad.uv(1, equal(uvs[1].x, minUV.x) ? minU : maxU, equal(uvs[1].y, minUV.y) ? minV : maxV); - quad.uv(2, equal(uvs[2].x, minUV.x) ? minU : maxU, equal(uvs[2].y, minUV.y) ? minV : maxV); - quad.uv(3, equal(uvs[3].x, minUV.x) ? minU : maxU, equal(uvs[3].y, minUV.y) ? minV : maxV); + quad.uv(0, uvs[0].x == minUV.x ? minU : maxU, uvs[0].y == minUV.y ? minV : maxV); + quad.uv(1, uvs[1].x == minUV.x ? minU : maxU, uvs[1].y == minUV.y ? minV : maxV); + quad.uv(2, uvs[2].x == minUV.x ? minU : maxU, uvs[2].y == minUV.y ? minV : maxV); + quad.uv(3, uvs[3].x == minUV.x ? minU : maxU, uvs[3].y == minUV.y ? minV : maxV); } + /** + * Quadrant table is as follows: + *
+     * ╔══════╤══════╗
+     * ║      │      ║
+     * ║  2   │  3   ║
+     * ╟──────┼──────╢
+     * ║      │      ║
+     * ║  0   │  1   ║
+     * ╚══════╧══════╝
+     * 
+ */ // TODO simplify, this is quite long public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { Vector2f[] uvs = new Vector2f[4]; @@ -206,17 +225,11 @@ public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { positions[i] = quad.copyPos(i, positions[idx]); } - Direction normal = quad.nominalFace(); - - Vector2f[] xy = new Vector2f[4]; - Vector2f[] newXy = new Vector2f[4]; - for (int i = 0; i < 4; i++) { switch (normal.getAxis()) { - case Y -> xy[i] = new Vector2f(positions[i].x, positions[i].z); - case Z -> xy[i] = new Vector2f(positions[i].x, positions[i].y); - case X -> xy[i] = new Vector2f(positions[i].z, positions[i].y); + 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); } - newXy[i] = new Vector2f(); } if (normal.getAxis() != Direction.Axis.Y) { @@ -228,7 +241,7 @@ public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { submap = submap.unitScale(); - if (normal.getAxis() == Direction.Axis.Y || normal.getAxisDirection() == Direction.AxisDirection.POSITIVE) { + if (normal.getAxis() == Direction.Axis.Y || normal == Direction.SOUTH || normal == Direction.WEST) { // Relative X is the same sign for DOWN, UP, SOUTH, and WEST newXy[0].x = Math.max(xy[0].x, submap.getXOffset()); // DUSW newXy[1].x = Math.max(xy[1].x, submap.getXOffset()); // DUSW @@ -255,41 +268,40 @@ public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { newXy[3].y = Math.max(xy[3].y, submap.getYOffset()); // U } - float u0 = normalize(xy[0].x, xy[3].x, newXy[0].x); - float v0 = normalize(xy[0].y, xy[1].y, newXy[0].y); - float u1 = normalize(xy[1].x, xy[2].x, newXy[1].x); - float v1 = normalize(xy[1].y, xy[0].y, newXy[1].y); - float u2 = normalize(xy[2].x, xy[1].x, newXy[2].x); - float v2 = normalize(xy[2].y, xy[3].y, newXy[2].y); - float u3 = normalize(xy[3].x, xy[0].x, newXy[3].x); - float v3 = normalize(xy[3].y, xy[2].y, newXy[3].y); + float u0 = normalize(newXy[0].x, xy[0].x, xy[3].x), + v0 = normalize(newXy[0].y, xy[0].y, xy[1].y); + float u1 = normalize(newXy[1].x, xy[1].x, xy[2].x), + v1 = normalize(newXy[1].y, xy[1].y, xy[0].y); + float u2 = normalize(newXy[2].x, xy[2].x, xy[1].x), + v2 = normalize(newXy[2].y, xy[2].y, xy[3].y); + float u3 = normalize(newXy[3].x, xy[3].x, xy[0].x), + v3 = normalize(newXy[3].y, xy[3].y, xy[2].y); - quad.uv(0, Mth.lerp(uvs[0].x, uvs[3].x, u0), Mth.lerp(uvs[0].y, uvs[1].y, v0)); - quad.uv(1, Mth.lerp(uvs[1].x, uvs[2].x, u1), Mth.lerp(uvs[1].y, uvs[0].y, v1)); - quad.uv(2, Mth.lerp(uvs[2].x, uvs[1].x, u2), Mth.lerp(uvs[2].y, uvs[3].y, v2)); - quad.uv(3, Mth.lerp(uvs[3].x, uvs[0].x, u3), Mth.lerp(uvs[3].y, uvs[2].y, v3)); + quad.uv(0, Mth.lerp(u0, uvs[0].x, uvs[3].x), Mth.lerp(v0, uvs[0].y, uvs[1].y)); + quad.uv(1, Mth.lerp(u1, uvs[1].x, uvs[2].x), Mth.lerp(v1, uvs[1].y, uvs[0].y)); + quad.uv(2, Mth.lerp(u2, uvs[2].x, uvs[1].x), Mth.lerp(v2, uvs[2].y, uvs[3].y)); + quad.uv(3, Mth.lerp(u3, uvs[3].x, uvs[0].x), Mth.lerp(v3, uvs[3].y, uvs[2].y)); for (int i = 0; i < 4; i++) { switch (normal.getAxis()) { + case X -> quad.pos(i, quad.x(i), newXy[i].y, newXy[i].x); case Y -> quad.pos(i, newXy[i].x, quad.y(i), newXy[i].y); case Z -> quad.pos(i, newXy[i].x, newXy[i].y, quad.z(i)); - case X -> quad.pos(i, quad.x(i), newXy[i].y, newXy[i].x); } } return quad; } - private static Vector2f normalize(Vector2f min, Vector2f max, Vector2f delta) { - return new Vector2f(normalize(min.x, max.x, delta.x), normalize(min.y, max.y, delta.y)); + /// scale {@code value} to a 0-1 range component-wise based on {@code min} and {@code max} + private static Vector2f normalize(float minU, float minV, float maxU, float maxV, Vector2f value) { + value.set(normalize(value.x, minU, maxU), normalize(value.y, minV, maxV)); + return value; } - public static float normalize(float min, float max, float delta) { + /// scale {@code delta} to a 0-1 range based on {@code min} and {@code max} + public static float normalize(float delta, float min, float max) { if (min == max) return 0.5f; return Mth.inverseLerp(delta, min, max); } - - public static boolean equal(float x, float y) { - return Math.abs(y - x) < 1.0E-2F; - } } From 8cbb15ce9e7946d6b0ab52f9d698da6d7815676c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:53:17 +0300 Subject: [PATCH 117/269] Use thread-local variables for vectors to reduce garbage collection pressure --- .../gtceu/client/util/quad/QuadUtils.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index e43d87791c8..3ceb2f5c8dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -168,10 +168,24 @@ private static void growQuadrantUVs(Vector2f[] uvs, Vector2f maxUV) { normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[3]); } + // these are only used within the below methods, but are stored here as consts to reduce allocations + // because they can be reused infinitely. DO NOT USE OUTSIDE subsect()/transformUVs()!! + + // filled in first copyUv() calls + private static final ThreadLocal uvs = ThreadLocal.withInitial(() -> new Vector2f[4]); + // 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() }; + }); + private static final ThreadLocal newXy = ThreadLocal.withInitial(() -> { + return new Vector2f[] { new Vector2f(), new Vector2f(), new Vector2f(), new Vector2f() }; + }); + private static void transformUVs(MutableQuadView quad, ISubmap submap) { submap = submap.unitScale(); - Vector2f[] uvs = new Vector2f[4]; + Vector2f[] uvs = QuadUtils.uvs.get(); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); } @@ -213,17 +227,21 @@ private static void transformUVs(MutableQuadView quad, ISubmap submap) { */ // TODO simplify, this is quite long public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { - Vector2f[] uvs = new Vector2f[4]; + Direction normal = quad.nominalFace(); + + Vector2f[] uvs = QuadUtils.uvs.get(); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); } int firstIndex = findMinUVIndex(uvs); - Vector3f[] positions = new Vector3f[4]; + Vector2f[] xy = QuadUtils.xy.get(); + Vector2f[] newXy = QuadUtils.newXy.get(); + Vector3f position = QuadUtils.position.get(); for (int i = 0; i < 4; i++) { int idx = (firstIndex + i) % 4; - positions[i] = quad.copyPos(i, positions[idx]); - } + // updates position + quad.copyPos(idx, position); switch (normal.getAxis()) { case X -> xy[i].set(position.z, position.y); From 7987e77dc1a5f1250d1b48c5a55e9c6072171bdb Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:54:37 +0300 Subject: [PATCH 118/269] Remove unused bits & bobs --- .../gtceu/client/util/quad/QuadUtils.java | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 3ceb2f5c8dd..2dfa6d178f8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.client.model.quad.MeshBuilder; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; import com.gregtechceu.gtceu.client.util.TextureHelper; -import com.gregtechceu.gtceu.client.util.quad.transformers.QuadReInterpolator; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -15,8 +14,6 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec2; -import net.minecraftforge.client.model.IQuadTransformer; import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; @@ -57,50 +54,6 @@ public static int findMinUVIndex(Vector2f[] uvs) { return minIndex; } - private static void putVertexData(int[] vertices, int index, Vector3f pos, Vector2f uv) { - int posOffset = index * IQuadTransformer.STRIDE + IQuadTransformer.POSITION; - vertices[posOffset] = Float.floatToRawIntBits(pos.x()); - vertices[posOffset + 1] = Float.floatToRawIntBits(pos.y()); - vertices[posOffset + 2] = Float.floatToRawIntBits(pos.z()); - - int uvOffset = index * IQuadTransformer.STRIDE + IQuadTransformer.UV0; - vertices[uvOffset] = Float.floatToRawIntBits(uv.x()); - vertices[uvOffset + 1] = Float.floatToRawIntBits(uv.y()); - } - - public static Vector2f[] normalizeUVs(Vector2f min, Vector2f max, Vector2f... uvs) { - Vector2f[] ret = new Vector2f[uvs.length]; - for (int i = 0; i < ret.length; i++) { - ret[i] = normalizeUV(min, max, uvs[i]); - } - return ret; - } - - public static Vector2f normalizeUV(TextureAtlasSprite sprite, Vector2f vec) { - return new Vector2f( - Mth.inverseLerp(vec.x(), sprite.getU0(), sprite.getU1()), - Mth.inverseLerp(vec.y(), sprite.getV0(), sprite.getV1())); - } - - public static Vector2f normalizeUV(Vector2f min, Vector2f max, Vector2f vec) { - return new Vector2f( - Mth.inverseLerp(vec.x(), min.x(), max.x()), - Mth.inverseLerp(vec.y(), min.y(), max.y())); - } - - public static Vector2f[] relativizeUVs(TextureAtlasSprite sprite, Vector2f... uvs) { - for (int i = 0; i < uvs.length; i++) { - uvs[i] = relativizeUV(sprite, uvs[i]); - } - return uvs; - } - - public static Vector2f relativizeUV(TextureAtlasSprite sprite, Vector2f vec) { - return new Vector2f( - Mth.lerp(vec.x(), sprite.getU0(), sprite.getU1()), - Mth.lerp(vec.y(), sprite.getV0(), sprite.getV1())); - } - public static List buildCTMQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, List quads, @Nullable Direction cullFace) { CTMCache ctmCache = CTMCache.getInstance(); @@ -116,8 +69,6 @@ public static List buildCTMQuads(CTMCache cachedConnections, List buildCTMQuads(CTMCache cachedConnections, List buildCTMQuads(CTMCache cachedConnections, List Date: Sun, 19 Apr 2026 20:55:38 +0300 Subject: [PATCH 119/269] Fix my UV normalization being bad --- .../gtceu/client/util/TextureHelper.java | 85 +++++++++++++++---- .../gtceu/client/util/quad/QuadUtils.java | 2 +- 2 files changed, 68 insertions(+), 19 deletions(-) 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 e77d911a02a..faf745ffae9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -23,6 +23,8 @@ import lombok.experimental.UtilityClass; import org.jetbrains.annotations.Nullable; +import static com.gregtechceu.gtceu.client.model.quad.MutableQuadView.*; + /** * Handles most texture-baking use cases for model loaders and model libraries via * {@link #bakeSprite(MutableQuadView, TextureAtlasSprite, int)}. @@ -31,22 +33,26 @@ public class TextureHelper { public static final float NORMALIZER = 1f / 16f; + public static final float DENORMALIZER = 16f; - private static final int BAKE_ROTATE_ANY = 3; + private static final int BAKE_ROTATE_ANY = BAKE_ROTATE_270 | BAKE_ROTATE_180 | BAKE_ROTATE_90; /** * Bakes textures in the provided vertex data, handling UV locking, rotation, interpolation, etc. * Textures must not be already baked. * *

- * If {@code sprite == null}, only the UV modifiers will be applied, but they won't be translated to the sprite's - * atlas coordinates. + * If {@code sprite == null}, only the UV modifiers will be applied, + * but they won't be translated to the sprite's atlas coordinates. + * + * @see #unbakeSprite(MutableQuadView, TextureAtlasSprite, int) + * @see MutableQuadView#BAKE_ROTATE_NONE bake flags */ public static void bakeSprite(MutableQuadView quad, @Nullable TextureAtlasSprite sprite, int bakeFlags) { - if (quad.nominalFace() != null && (MutableQuadView.BAKE_LOCK_UV & bakeFlags) != 0) { + 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 ((MutableQuadView.BAKE_NORMALIZED & bakeFlags) == 0) { + } 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 @@ -62,12 +68,12 @@ public static void bakeSprite(MutableQuadView quad, @Nullable TextureAtlasSprite applyModifier(quad, ROTATIONS[rotation]); } - if ((MutableQuadView.BAKE_FLIP_U & bakeFlags) != 0) { + if ((BAKE_FLIP_U & bakeFlags) != 0) { // Inverts U coordinates. Assumes normalized (0-1) values. applyModifier(quad, (q, i) -> q.uv(i, 1 - q.u(i), q.v(i))); } - if ((MutableQuadView.BAKE_FLIP_V & bakeFlags) != 0) { + if ((BAKE_FLIP_V & bakeFlags) != 0) { // Inverts V coordinates. Assumes normalized (0-1) values. applyModifier(quad, (q, i) -> q.uv(i, q.u(i), 1 - q.v(i))); } @@ -92,23 +98,66 @@ public static void interpolate(MutableQuadView q, TextureAtlasSprite sprite) { } } + /** + * The reverse operation of {@link #bakeSprite}. Undoes the same operations except UV locking. + * 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}. + * + *

+ * If {@code sprite == null}, only the UV modifiers will be applied, + * but they won't be translated from the sprite's atlas coordinates to a 0-16 range. + * + * @see #bakeSprite(MutableQuadView, TextureAtlasSprite, int) + * @see MutableQuadView#BAKE_ROTATE_NONE bake flags + */ + public static void unbakeSprite(MutableQuadView quad, @Nullable TextureAtlasSprite sprite, int bakeFlags) { + if (sprite != null) { + deInterpolate(quad, sprite); + } + + if ((BAKE_FLIP_V & bakeFlags) != 0) { + // Inverts V coordinates. Assumes normalized (0-1) values. + applyModifier(quad, (q, i) -> q.uv(i, q.u(i), 1 - q.v(i))); + } + + if ((BAKE_FLIP_U & bakeFlags) != 0) { + // Inverts U coordinates. Assumes normalized (0-1) values. + applyModifier(quad, (q, i) -> q.uv(i, 1 - q.u(i), q.v(i))); + } + + final int rotation = bakeFlags & BAKE_ROTATE_ANY; + + if (rotation != 0) { + // Rotates texture around the center of sprite. + // Assumes normalized coordinates. + 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)); + } + } + /** * Faster than sprite method. Sprite computes span and normalizes inputs each call, so we'd have to denormalize * before we called, only to have the sprite renormalize immediately. */ - public static void normalizeBy(MutableQuadView q, TextureAtlasSprite sprite) { - final float uMin = sprite.getU0(), uMax = sprite.getU1(); - final float uSpan = uMax - uMin; - final float vMin = sprite.getV0(), vMax = sprite.getV1(); - final float vSpan = vMax - vMin; + public static void deInterpolate(MutableQuadView q, TextureAtlasSprite sprite) { + final float uMin = sprite.getU0(); + final float uSpan = sprite.getU1() - uMin; + final float vMin = sprite.getV0(); + final float vSpan = sprite.getV1() - vMin; for (int i = 0; i < 4; i++) { - final float u = q.u(i), v = q.v(i); - // Skip invalid UV coordinates. - // If the UV is outside the texture's boundaries, this was probably called by mistake. - if (u < uMin || u > uMax || v < vMin || v > vMax) continue; - - q.uv(i, (u - uMin) / uSpan, (v - vMin) / vSpan); + q.uv(i, (q.u(i) - uMin) / uSpan, (q.v(i) - vMin) / vSpan); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 2dfa6d178f8..701923392e4 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -85,7 +85,7 @@ public static List buildCTMQuads(CTMCache cachedConnections, List 15 ? originalSprite : connectionSprite; emitter.fromVanilla(originalQuad, cullFace); - TextureHelper.normalizeBy(emitter, originalSprite); + TextureHelper.unbakeSprite(emitter, originalSprite, BAKE_NORMALIZED); // slice quad into the current quadrant subsect(emitter, Submap.X2[quadrant % 2][quadrant / 2]); From 70dce9e5071728e73c5ff1041b4825e8031e37ab Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:56:34 +0300 Subject: [PATCH 120/269] Make Submap lookup use a 2D array as the LUT --- .../gtceu/client/model/ctm/CTMBakedModel.java | 2 +- .../gtceu/client/model/ctm/CTMCache.java | 123 +++++++++--------- .../gtceu/client/model/ctm/Submap.java | 23 ++-- .../gtceu/client/util/quad/QuadUtils.java | 37 +++--- 4 files changed, 90 insertions(+), 95 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index 0bb2ad76b67..ca25fea962d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -47,7 +47,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction } CTMCache ctmCache = CTMCache.getInstance(); - ctmCache.getSubmapIds(level, pos, state, side); + ctmCache.fillSubmapCache(level, pos, state, side); return this.sideCache.computeIfAbsent(side, $ -> new ConcurrentHashMap<>()) .computeIfAbsent(ctmCache, cache -> QuadUtils.buildCTMQuads(cache, super.getQuads(state, side, rand, parentModelData, renderType), side)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 802bc32fdef..5a0a699667d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -24,52 +24,55 @@ import lombok.experimental.Accessors; import org.jetbrains.annotations.Nullable; +import org.joml.Vector2i; +import org.joml.Vector2ic; import static com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation.*; -// @formatter:off /** * The CTM renderer will draw the block's FACE by assembling 4 quadrants from the 5 available block textures. - * The normal {@code texture.png} is the block's "unconnected" texture, and is used when CTM is disabled or the block has nothing to connect to. + * The normal {@code texture.png} is the block's "unconnected" texture, and is used when CTM is disabled or the block + * has nothing to connect to. * This texture has all the outside corner quadrants, and {@code texture_ctm.png} contains the rest of the quadrants. *

  * ┌─────────────────┐ ┌────────────────────────────────┐
  * │ texture.png     │ │ texture_ctm.png                │
  * │ ╔══════╤══════╗ │ │  ──────┼────── ║ ─────┼───── ║ │
  * │ ║      │      ║ │ │ │      │      │║      │      ║ │
- * │ ║ 16   │ 17   ║ │ │ │ 0    │ 1    │║ 2    │ 3    ║ │
+ * │ ║ 4/4  │ 4/5  ║ │ │ │ 0/0  │ 1/0  │║ 2/0  │ 3/0  ║ │
  * │ ╟──────┼──────╢ │ │ ┼──────┼──────┼╟──────┼──────╢ │
  * │ ║      │      ║ │ │ │      │      │║      │      ║ │
- * │ ║ 18   │ 19   ║ │ │ │ 4    │ 5    │║ 6    │ 7    ║ │
+ * │ ║ 5/4  │ 5/5  ║ │ │ │ 0/1  │ 1/1  │║ 2/1  │ 3/1  ║ │
  * │ ╚══════╧══════╝ │ │  ──────┼────── ║ ─────┼───── ║ │
  * └─────────────────┘ │ ═══════╤═══════╝ ─────┼───── ╚ │
  *                     │ │      │      ││      │      │ │
- *                     │ │ 8    │ 9    ││ 10   │ 11   │ │
+ *                     │ │ 0/2  │ 1/2  ││ 2/2  │ 3/2  │ │
  *                     │ ┼──────┼──────┼┼──────┼──────┼ │
  *                     │ │      │      ││      │      │ │
- *                     │ │ 12   │ 13   ││ 14   │ 15   │ │
+ *                     │ │ 0/3  │ 1/3  ││ 2/3  │ 3/3  │ │
  *                     │ ═══════╧═══════╗ ─────┼───── ╔ │
  *                     └────────────────────────────────┘
  * 
- * combining { 18, 13, 9, 16 }, we can generate a texture connected to the right! + * combining { { 5/4, 1/3 }, { 1/2, 4/4 } }, we can generate a texture connected to the right! *
  * ╔══════╤═══════
  * ║      │      │
- * ║ 16   │ 9    │
+ * ║ 4/4  │ 1/2  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 18   │ 13   │
+ * ║ 5/4  │ 1/3  │
  * ╚══════╧═══════
  * 
* - * combining { 18, 13, 11, 2 }, we can generate a texture, in the shape of an L (connected to the right, and up + * combining { { 5/4, 1/3 }, { 3/2, 2/0 } }, we can generate a texture in the shape of an L + * (connected to the right and up) *
  * ║ ─────┼───── ╚
  * ║      │      │
- * ║ 2    │ 11   │
+ * ║ 2/0  │ 3/2  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 18   │ 13   │
+ * ║ 5/4  │ 1/3  │
  * ╚══════╧═══════
  * 
* @@ -84,51 +87,27 @@ public class CTMCache { @FunctionalInterface public interface StateComparisonCallback { - StateComparisonCallback DEFAULT = (connectionCheck, from, to, dir) -> connectionCheck.ignoreStates() ? from.getBlock() == to.getBlock() : from == to; + StateComparisonCallback DEFAULT = (connectionCheck, from, to, dir) -> { + return connectionCheck.ignoreStates() ? from.getBlock() == to.getBlock() : from == to; + }; boolean connects(ConnectionCheck instance, BlockState from, BlockState to, Direction dir); } - - /** - * The UVs for the specific "magic number" value - */ - public static final ISubmap[] uvs = { - // CTM texture - Submap.fromPixelScale(4, 4, 0, 0), // 0 - Submap.fromPixelScale(4, 4, 4, 0), // 1 - Submap.fromPixelScale(4, 4, 8, 0), // 2 - Submap.fromPixelScale(4, 4, 12, 0), // 3 - Submap.fromPixelScale(4, 4, 0, 4), // 4 - Submap.fromPixelScale(4, 4, 4, 4), // 5 - Submap.fromPixelScale(4, 4, 8, 4), // 6 - Submap.fromPixelScale(4, 4, 12, 4), // 7 - Submap.fromPixelScale(4, 4, 0, 8), // 8 - Submap.fromPixelScale(4, 4, 4, 8), // 9 - Submap.fromPixelScale(4, 4, 8, 8), // 10 - Submap.fromPixelScale(4, 4, 12, 8), // 11 - Submap.fromPixelScale(4, 4, 0, 12), // 12 - Submap.fromPixelScale(4, 4, 4, 12), // 13 - Submap.fromPixelScale(4, 4, 8, 12), // 14 - Submap.fromPixelScale(4, 4, 12, 12), // 15 - // Default texture - Submap.fromPixelScale(8, 8, 0, 0), // 16 - Submap.fromPixelScale(8, 8, 8, 0), // 17 - Submap.fromPixelScale(8, 8, 0, 8), // 18 - Submap.fromPixelScale(8, 8, 8, 8) // 19 - }; - - public static final ISubmap FULL_TEXTURE = Submap.X1; - - // @formatter:on /** Some hardcoded offset values for the different corner indeces */ - protected static int[] submapOffsets = { 4, 5, 1, 0 }; - protected static int[] defaultSubmapCache = { 18, 19, 17, 16 }; + protected static Vector2ic[][] submapOffsets = { + { new Vector2i(0, 3), new Vector2i(1, 3) }, + { new Vector2i(0, 2), new Vector2i(1, 2) }, + }; + protected static Vector2ic[][] defaultSubmapCache = { + { new Vector2i(4, 5), new Vector2i(5, 5) }, + { new Vector2i(4, 4), new Vector2i(5, 4) }, + }; // TODO encapsulate public ConnectionCheck connectionCheck = new ConnectionCheck(); - // Mapping the different corner indeces to their respective dirs + // Mapping the different corner indices to their respective dirs protected static final OctagonalOrientation[][] submapMap = { { BOTTOM, LEFT, BOTTOM_LEFT }, { BOTTOM, RIGHT, BOTTOM_RIGHT }, @@ -137,7 +116,7 @@ public interface StateComparisonCallback { }; protected byte connectionMap; - protected int[] submapCache = defaultSubmapCache.clone(); + protected Vector2ic[][] submapCache = defaultSubmapCache.clone(); public static CTMCache getInstance() { return new CTMCache(); @@ -148,21 +127,24 @@ public static CTMCache getInstance() { * * @return The indeces of the typical 4x4 submap to use for the given face at the given location. */ - public int[] getSubmapIds(@Nullable BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side) { + public Vector2ic[][] fillSubmapCache(@Nullable BlockAndTintGetter level, BlockPos pos, + BlockState state, Direction side) { if (level == null) { return this.submapCache; } buildConnectionMap(level, pos, state, side); // Map connections to submap indices - for (int i = 0; i < 4; i++) { - fillSubmaps(i); + for (int x = 0; x < 2; x++) { + for (int y = 0; y < 2; y++) { + fillSubmaps(x, y); + } } return this.submapCache; } - public int[] getSubmapIndices() { + public Vector2ic[][] getCachedSubmapIndices() { return this.submapCache; } @@ -170,6 +152,18 @@ public static boolean isDefaultTexture(int id) { return (id == 16 || id == 17 || id == 18 || id == 19); } + public static boolean isDefaultTexture(Vector2ic id) { + return id.x() >= 4 && id.y() >= 4; + } + + public static ISubmap getSubmapFor(Vector2ic coordinates) { + if (isDefaultTexture(coordinates)) { + return Submap.X2[coordinates.x() % 4][coordinates.y() % 4]; + } else { + return Submap.X4[(coordinates.x() + 2) % 4][(coordinates.y() + 2) % 4]; + } + } + protected void setConnectedState(OctagonalOrientation dir, boolean connected) { this.connectionMap = setConnectedState(this.connectionMap, dir, connected); } @@ -199,25 +193,25 @@ public void buildConnectionMap(BlockAndTintGetter world, BlockPos pos, BlockStat } @SuppressWarnings("null") - protected void fillSubmaps(int idx) { - OctagonalOrientation[] dirs = submapMap[idx]; + protected void fillSubmaps(int x, int y) { + OctagonalOrientation[] dirs = submapMap[x + y * 2]; if (connectedOr(dirs[0], dirs[1])) { if (connectedAnd(dirs)) { // If all dirs are connected, we use the fully connected face, the base offset value. - this.submapCache[idx] = submapOffsets[idx]; + this.submapCache[x][y] = submapOffsets[x][y]; } else { - // This is a bit magic-y, but basically the array is ordered so - // the first dir requires an offset of 2, and the second dir requires an offset of 8 - // plus the initial offset for the corner. - this.submapCache[idx] = submapOffsets[idx] + (connected(dirs[0]) ? 2 : 0) + - (connected(dirs[1]) ? 8 : 0); + // dirs[0] is vertical, dirs[1] is horizontal + Vector2i offsets = new Vector2i(submapOffsets[x][y]); + if (connected(dirs[0])) offsets.x += 2; + if (connected(dirs[1])) offsets.y += 2; + + this.submapCache[x][y] = offsets; } } } /** - * @param dir - * The direction to check connection in. + * @param dir The direction to check connection in. * @return True if the cached connectionMap holds a connection in this {@link OctagonalOrientation direction}. */ public boolean connected(OctagonalOrientation dir) { @@ -225,8 +219,7 @@ public boolean connected(OctagonalOrientation dir) { } /** - * @param dirs - * The directions to check connection in. + * @param dirs The directions to check connection in. * @return True if the cached connectionMap holds a connection in all the given * {@link OctagonalOrientation directions}. */ diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java index 56f7c2e3be1..3fbfba47392 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/Submap.java @@ -25,6 +25,7 @@ */ public class Submap implements ISubmap { + // spotless:off public static final ISubmap X1 = fromPixelScale(16, 16, 0, 0); public static final ISubmap[][] X2 = { @@ -34,24 +35,18 @@ public class Submap implements ISubmap { private static final float DIV3 = 16 / 3f; public static final ISubmap[][] X3 = { - { fromPixelScale(DIV3, DIV3, 0, 0), fromPixelScale(DIV3, DIV3, DIV3, 0), - fromPixelScale(DIV3, DIV3, DIV3 * 2, 0) }, - { fromPixelScale(DIV3, DIV3, 0, DIV3), fromPixelScale(DIV3, DIV3, DIV3, DIV3), - fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3) }, - { fromPixelScale(DIV3, DIV3, 0, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3, DIV3 * 2), - fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3 * 2) }, + { fromPixelScale(DIV3, DIV3, 0, 0), fromPixelScale(DIV3, DIV3, DIV3, 0), fromPixelScale(DIV3, DIV3, DIV3 * 2, 0) }, + { fromPixelScale(DIV3, DIV3, 0, DIV3), fromPixelScale(DIV3, DIV3, DIV3, DIV3), fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3) }, + { fromPixelScale(DIV3, DIV3, 0, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3, DIV3 * 2), fromPixelScale(DIV3, DIV3, DIV3 * 2, DIV3 * 2) }, }; public static final ISubmap[][] X4 = { - { fromPixelScale(4, 4, 0, 0), fromPixelScale(4, 4, 4, 0), fromPixelScale(4, 4, 8, 0), - fromPixelScale(4, 4, 12, 0) }, - { fromPixelScale(4, 4, 0, 4), fromPixelScale(4, 4, 4, 4), fromPixelScale(4, 4, 8, 4), - fromPixelScale(4, 4, 12, 4) }, - { fromPixelScale(4, 4, 0, 8), fromPixelScale(4, 4, 4, 8), fromPixelScale(4, 4, 8, 8), - fromPixelScale(4, 4, 12, 8) }, - { fromPixelScale(4, 4, 0, 12), fromPixelScale(4, 4, 4, 12), fromPixelScale(4, 4, 8, 12), - fromPixelScale(4, 4, 12, 12) }, + { fromPixelScale(4, 4, 0, 0), fromPixelScale(4, 4, 4, 0), fromPixelScale(4, 4, 8, 0), fromPixelScale(4, 4, 12, 0) }, + { fromPixelScale(4, 4, 0, 4), fromPixelScale(4, 4, 4, 4), fromPixelScale(4, 4, 8, 4), fromPixelScale(4, 4, 12, 4) }, + { fromPixelScale(4, 4, 0, 8), fromPixelScale(4, 4, 4, 8), fromPixelScale(4, 4, 8, 8), fromPixelScale(4, 4, 12, 8) }, + { fromPixelScale(4, 4, 0, 12), fromPixelScale(4, 4, 4, 12), fromPixelScale(4, 4, 8, 12), fromPixelScale(4, 4, 12, 12) }, }; + // spotless:on public static ISubmap[][] grid(int w, int h) { float xDiv = 16f / w; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 701923392e4..98c85e376e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -17,8 +17,10 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; +import org.joml.Vector2ic; import org.joml.Vector3f; +import java.util.LinkedList; import java.util.List; import static com.gregtechceu.gtceu.client.model.quad.MutableQuadView.*; @@ -58,7 +60,7 @@ public static List buildCTMQuads(BlockAndTintGetter level, BlockPos p List quads, @Nullable Direction cullFace) { CTMCache ctmCache = CTMCache.getInstance(); if (cullFace != null) { - ctmCache.getSubmapIds(level, pos, state, cullFace); + ctmCache.fillSubmapCache(level, pos, state, cullFace); } return buildCTMQuads(ctmCache, quads, cullFace); @@ -66,6 +68,7 @@ public static List buildCTMQuads(BlockAndTintGetter level, BlockPos p public static List buildCTMQuads(CTMCache cachedConnections, List base, @Nullable Direction cullFace) { + List result = new LinkedList<>(); MeshBuilder meshBuilder = MeshBuilder.getInstance(); var emitter = meshBuilder.getEmitter(); @@ -74,31 +77,35 @@ public static List buildCTMQuads(CTMCache cachedConnections, List 15 ? originalSprite : connectionSprite; + for (int xQ = 0; xQ < 2; xQ++) { + for (int yQ = 0; yQ < 2; yQ++) { + boolean defaultTexture = CTMCache.isDefaultTexture(ctm[xQ][yQ]); + TextureAtlasSprite ctmSprite = defaultTexture ? originalSprite : connectionSprite; - emitter.fromVanilla(originalQuad, cullFace); - TextureHelper.unbakeSprite(emitter, originalSprite, BAKE_NORMALIZED); + emitter.fromVanilla(originalQuad, cullFace); + TextureHelper.unbakeSprite(emitter, originalSprite, BAKE_NORMALIZED); - // slice quad into the current quadrant - subsect(emitter, Submap.X2[quadrant % 2][quadrant / 2]); - transformUVs(emitter, CTMCache.uvs[ctm[quadrant]]); + // slice quad into the current quadrant + subsect(emitter, Submap.X2[yQ][xQ]); + transformUVs(emitter, CTMCache.getSubmapFor(ctm[xQ][yQ])); - // derotate quad here - emitter.spriteBake(ctmSprite, BAKE_NORMALIZED); + emitter.spriteBake(ctmSprite, BAKE_NORMALIZED); + emitter.computeGeometry(); + emitter.populateMissingNormals(); - emitter.emit(); + result.add(emitter.toBakedQuad(ctmSprite)); + emitter.emit(); + } } } - return meshBuilder.build().toBakedBlockQuads(); + return result; } /** From 8498f991f8eacc20733f8ff35e9a515e344ee999 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:57:22 +0300 Subject: [PATCH 121/269] Clean up related util files & improve new ones' documentation(s) --- .../gtceu/client/model/quad/Mesh.java | 2 +- .../gtceu/client/model/quad/QuadView.java | 65 ++++++++++++++++--- .../gtceu/client/model/quad/SpriteFinder.java | 31 ++++----- .../gtceu/client/util/RenderUtil.java | 8 +-- .../gtceu/utils/GTMatrixUtils.java | 11 ++-- 5 files changed, 78 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java index 43f0d6610b4..29403d1af8a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/Mesh.java @@ -55,7 +55,7 @@ void forEach(Consumer consumer, QuadView cursor) { } @SuppressWarnings("deprecation") - public List toBakedBlockQuads() { + public List toBlockBakedQuads() { SpriteFinder finder = SpriteFinder.get(Minecraft.getInstance().getModelManager() .getAtlas(TextureAtlas.LOCATION_BLOCKS)); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java index 34b292774a7..d5d6726ea86 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java @@ -22,10 +22,11 @@ import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; -import net.minecraftforge.client.model.QuadTransformers; import lombok.Getter; import lombok.experimental.Accessors; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Vector2f; @@ -72,7 +73,13 @@ public class QuadView { protected int tintIndex; protected long headerFlags = 0; - /** Size and where it comes from will vary in subtypes. But in all cases quad is fully encoded to array. */ + /** + * Size and where it comes from will vary in subtypes. But in all cases quad is fully encoded to array. + * + * -- GETTER -- + * Reference to underlying array. Use with caution. Meant for fast renderer access + */ + @Getter protected int @UnknownNullability [] data; /** Beginning of the quad. Also the header index. */ @@ -99,11 +106,6 @@ public final void load() { GeometryHelper.computeFaceNormal(faceNormal, this); } - /** Reference to underlying array. Use with caution. Meant for fast renderer access */ - public int[] data() { - return data; - } - public int normalFlags() { return EncodingFormat.normalFlags(headerFlags); } @@ -113,7 +115,8 @@ public boolean hasVertexNormals() { return normalFlags() != 0; } - protected void computeGeometry() { + @ApiStatus.Internal + public void computeGeometry() { if (isGeometryInvalid) { isGeometryInvalid = false; @@ -161,6 +164,7 @@ public final Vector3f faceNormal() { * calling {link QuadEmitter#emit()} on the target instance. Meant for re-texturing, analysis and static * transformation use cases. */ + @Contract(mutates = "param") public void copyTo(MutableQuadView quad) { computeGeometry(); @@ -174,8 +178,12 @@ public void copyTo(MutableQuadView quad) { } /** - * Pass a non-null target to avoid allocation - will be returned with values. Otherwise returns a new instance. + * Returns the specified vertex's geometric position. + * + *

+ * Pass a non-null target to avoid allocation - will be returned with values. Otherwise, returns a new instance. */ + @Contract(value = "_, !null -> param2; _, null -> new", mutates = "param2") public Vector3f copyPos(int vertexIndex, @Nullable Vector3f target) { if (target == null) { target = new Vector3f(); @@ -188,9 +196,23 @@ public Vector3f copyPos(int vertexIndex, @Nullable Vector3f target) { } /** + * Returns the specified vertex's geometric position. + */ + @Contract(value = "_ -> new", pure = true) + public Vector3f copyPos(int vertexIndex) { + return copyPos(vertexIndex, null); + } + + /** + * Returns the specified vertex's normal vector. + * + *

* Pass a non-null target to avoid allocation - will be returned with values. Otherwise, returns a new instance. + * + *

* Returns null if normal not present. */ + @Contract(value = "_, !null -> param2; _, null -> new", mutates = "param2") public @Nullable Vector3f copyNormal(int vertexIndex, @Nullable Vector3f target) { if (hasNormal(vertexIndex)) { if (target == null) { @@ -208,8 +230,23 @@ public Vector3f copyPos(int vertexIndex, @Nullable Vector3f target) { } /** - * Pass a non-null target to avoid allocation - will be returned with values. Otherwise returns a new instance. + * Returns the specified vertex's normal vector. + * + *

+ * Returns null if normal not present. */ + @Contract(value = "_ -> new", pure = true) + public @Nullable Vector3f copyNormal(int vertexIndex) { + return copyNormal(vertexIndex, null); + } + + /** + * Returns the specified vertex's UV coordinates. + * + *

+ * Pass a non-null target to avoid allocation - will be returned with values. Otherwise, returns a new instance. + */ + @Contract(value = "_, !null -> param2; _, null -> new", mutates = "param2") public Vector2f copyUv(int vertexIndex, @Nullable Vector2f target) { if (target == null) { target = new Vector2f(); @@ -219,6 +256,14 @@ public Vector2f copyUv(int vertexIndex, @Nullable Vector2f target) { return target; } + /** + * Returns the specified vertex's UV coordinates. + */ + @Contract(value = "_ -> new", pure = true) + public Vector2f copyUv(int vertexIndex) { + return copyUv(vertexIndex, null); + } + /** * Retrieve geometric position, x coordinate. */ diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java index a7c67f1cb40..b77c1b59d64 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/SpriteFinder.java @@ -49,11 +49,11 @@ public static SpriteFinder get(TextureAtlas atlas) { } private final Node root; - private final TextureAtlas spriteAtlasTexture; + private final TextureAtlas textureAtlas; - public SpriteFinder(Map sprites, TextureAtlas spriteAtlasTexture) { + public SpriteFinder(Map sprites, TextureAtlas textureAtlas) { root = new Node(0.5f, 0.5f, 0.25f); - this.spriteAtlasTexture = spriteAtlasTexture; + this.textureAtlas = textureAtlas; sprites.values().forEach(root::add); } @@ -95,17 +95,14 @@ public TextureAtlasSprite find(float u, float v) { private class Node { - final float midU; - final float midV; - final float cellRadius; - @Nullable - Object lowLow = null; - @Nullable - Object lowHigh = null; - @Nullable - Object highLow = null; - @Nullable - Object highHigh = null; + private final float midU; + private final float midV; + private final float cellRadius; + + private @Nullable Object lowLow = null; + private @Nullable Object lowHigh = null; + private @Nullable Object highLow = null; + private @Nullable Object highHigh = null; Node(float midU, float midV, float radius) { this.midU = midU; @@ -147,8 +144,8 @@ private void addInner(TextureAtlasSprite sprite, @Nullable Object quadrant, int } else { Node n = new Node(midU + cellRadius * uStep, midV + cellRadius * vStep, cellRadius * 0.5f); - if (quadrant instanceof TextureAtlasSprite) { - n.add((TextureAtlasSprite) quadrant); + if (quadrant instanceof TextureAtlasSprite quadrantSprite) { + n.add(quadrantSprite); } n.add(sprite); @@ -170,7 +167,7 @@ private TextureAtlasSprite findInner(@Nullable Object quadrant, float u, float v } else if (quadrant instanceof Node node) { return node.find(u, v); } else { - return spriteAtlasTexture.getSprite(MissingTextureAtlasSprite.getLocation()); + return textureAtlas.getSprite(MissingTextureAtlasSprite.getLocation()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java index 663c823b530..2fe929c0818 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java @@ -61,10 +61,6 @@ @OnlyIn(Dist.CLIENT) public class RenderUtil { - public static BakedModel getModelForState(BlockState state) { - return Minecraft.getInstance().getBlockRenderer().getBlockModel(state); - } - public enum FluidTextureType { STILL((fluidTypeExtensions, fluidStack) -> { @@ -220,6 +216,10 @@ public static void moveToFace(PoseStack poseStack, float x, float y, float z, Di Math.fma(face.getStepZ(), 0.5f, z)); } + public static BakedModel getModelForState(BlockState state) { + return Minecraft.getInstance().getBlockRenderer().getBlockModel(state); + } + public static void drawBlock(BlockAndTintGetter level, BlockPos pos, BlockState state, MultiBufferSource bufferSource, PoseStack poseStack) { int packedLight = LevelRenderer.getLightColor(level, state, pos); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTMatrixUtils.java b/src/main/java/com/gregtechceu/gtceu/utils/GTMatrixUtils.java index 44f6ad29e34..b5b9d31a626 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTMatrixUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTMatrixUtils.java @@ -6,7 +6,6 @@ import net.minecraft.util.Mth; import com.google.common.collect.HashBasedTable; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Table; import com.google.common.collect.Tables; import org.jetbrains.annotations.Contract; @@ -14,7 +13,8 @@ import java.lang.Math; import java.security.InvalidParameterException; -import java.util.Objects; +import java.util.EnumMap; +import java.util.Map; import javax.annotation.ParametersAreNonnullByDefault; @@ -22,13 +22,10 @@ @MethodsReturnNonnullByDefault public class GTMatrixUtils { - @SuppressWarnings("UnstableApiUsage") - private static final ImmutableMap directionAxises = Util.make(() -> { - ImmutableMap.Builder map = ImmutableMap.builderWithExpectedSize(6); + private static final Map directionAxes = Util.make(new EnumMap<>(Direction.class), map -> { for (Direction dir : GTUtil.DIRECTIONS) { map.put(dir, dir.step()); } - return map.build(); }); private static final Table rotations = Tables .synchronizedTable(HashBasedTable.create()); @@ -160,6 +157,6 @@ public static Matrix4fc createRotationState(Direction frontFace, Direction upwar } public static Vector3fc getDirectionAxis(Direction dir) { - return Objects.requireNonNull(directionAxises.get(dir)); + return directionAxes.get(dir); } } From 2f61fe3cc429c8d988caba2f3e28261060c9badd Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 21:06:00 +0300 Subject: [PATCH 122/269] Fix lamp model wrapping corrupting block models --- .../java/com/gregtechceu/gtceu/common/item/LampBlockItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java index 45ce8c53b40..2c4f9de17f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java @@ -110,7 +110,7 @@ private static void registerEventListener(LampBlockItem toWrap) { // unwrap ModelResourceLocations // 1.21 needs different code here as ModelResourceLocation is a wrapper record instead of a subclass possibleItemId = modelResLoc.withPrefix(""); - } else if (!modelLocation.getPath().startsWith("item/")) { + } else if (modelLocation.getPath().startsWith("item/")) { // remove the "item/" prefix from the model path possibleItemId = modelLocation.withPath(path -> path.substring("item/".length())); } else { From 874c0b0d4ecea4978c95c887a55728a34d4f5685 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 22:09:36 +0300 Subject: [PATCH 123/269] Bad direction offset doc --- .../gtceu/client/model/ctm/CTMCache.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 5a0a699667d..22b63914809 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -39,40 +39,40 @@ * │ texture.png │ │ texture_ctm.png │ * │ ╔══════╤══════╗ │ │ ──────┼────── ║ ─────┼───── ║ │ * │ ║ │ ║ │ │ │ │ │║ │ ║ │ - * │ ║ 4/4 │ 4/5 ║ │ │ │ 0/0 │ 1/0 │║ 2/0 │ 3/0 ║ │ + * │ ║ 5/4 │ 5/5 ║ │ │ │ 3/0 │ 3/1 │║ 3/2 │ 3/3 ║ │ * │ ╟──────┼──────╢ │ │ ┼──────┼──────┼╟──────┼──────╢ │ * │ ║ │ ║ │ │ │ │ │║ │ ║ │ - * │ ║ 5/4 │ 5/5 ║ │ │ │ 0/1 │ 1/1 │║ 2/1 │ 3/1 ║ │ + * │ ║ 4/4 │ 4/5 ║ │ │ │ 2/0 │ 2/1 │║ 2/2 │ 2/3 ║ │ * │ ╚══════╧══════╝ │ │ ──────┼────── ║ ─────┼───── ║ │ * └─────────────────┘ │ ═══════╤═══════╝ ─────┼───── ╚ │ * │ │ │ ││ │ │ │ - * │ │ 0/2 │ 1/2 ││ 2/2 │ 3/2 │ │ + * │ │ 1/0 │ 1/1 ││ 1/2 │ 1/3 │ │ * │ ┼──────┼──────┼┼──────┼──────┼ │ * │ │ │ ││ │ │ │ - * │ │ 0/3 │ 1/3 ││ 2/3 │ 3/3 │ │ + * │ │ 0/0 │ 0/1 ││ 0/2 │ 0/3 │ │ * │ ═══════╧═══════╗ ─────┼───── ╔ │ * └────────────────────────────────┘ * - * combining { { 5/4, 1/3 }, { 1/2, 4/4 } }, we can generate a texture connected to the right! + * combining { { 4/4, 1/1 }, { 0/1, 4/5 } }, we can generate a texture connected to the right! *

  * ╔══════╤═══════
  * ║      │      │
- * ║ 4/4  │ 1/2  │
+ * ║ 4/5  │ 1/1  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 5/4  │ 1/3  │
+ * ║ 4/4  │ 0/1  │
  * ╚══════╧═══════
  * 
* - * combining { { 5/4, 1/3 }, { 3/2, 2/0 } }, we can generate a texture in the shape of an L + * combining { { 4/4, 1/0 }, { 3/2, 1/3 } }, we can generate a texture in the shape of an L * (connected to the right and up) *
  * ║ ─────┼───── ╚
  * ║      │      │
- * ║ 2/0  │ 3/2  │
+ * ║ 3/2  │ 1/3  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 5/4  │ 1/3  │
+ * ║ 5/4  │ 1/0  │
  * ╚══════╧═══════
  * 
* From 98d02c6d99fc24645a19d9129325b9a4b5a24db2 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 22:09:49 +0300 Subject: [PATCH 124/269] Revert "Bad direction offset doc" This reverts commit a2a8102b3cd57f06c9e16009869cda747c6c2f1b. --- .../gtceu/client/model/ctm/CTMCache.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 22b63914809..5a0a699667d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -39,40 +39,40 @@ * │ texture.png │ │ texture_ctm.png │ * │ ╔══════╤══════╗ │ │ ──────┼────── ║ ─────┼───── ║ │ * │ ║ │ ║ │ │ │ │ │║ │ ║ │ - * │ ║ 5/4 │ 5/5 ║ │ │ │ 3/0 │ 3/1 │║ 3/2 │ 3/3 ║ │ + * │ ║ 4/4 │ 4/5 ║ │ │ │ 0/0 │ 1/0 │║ 2/0 │ 3/0 ║ │ * │ ╟──────┼──────╢ │ │ ┼──────┼──────┼╟──────┼──────╢ │ * │ ║ │ ║ │ │ │ │ │║ │ ║ │ - * │ ║ 4/4 │ 4/5 ║ │ │ │ 2/0 │ 2/1 │║ 2/2 │ 2/3 ║ │ + * │ ║ 5/4 │ 5/5 ║ │ │ │ 0/1 │ 1/1 │║ 2/1 │ 3/1 ║ │ * │ ╚══════╧══════╝ │ │ ──────┼────── ║ ─────┼───── ║ │ * └─────────────────┘ │ ═══════╤═══════╝ ─────┼───── ╚ │ * │ │ │ ││ │ │ │ - * │ │ 1/0 │ 1/1 ││ 1/2 │ 1/3 │ │ + * │ │ 0/2 │ 1/2 ││ 2/2 │ 3/2 │ │ * │ ┼──────┼──────┼┼──────┼──────┼ │ * │ │ │ ││ │ │ │ - * │ │ 0/0 │ 0/1 ││ 0/2 │ 0/3 │ │ + * │ │ 0/3 │ 1/3 ││ 2/3 │ 3/3 │ │ * │ ═══════╧═══════╗ ─────┼───── ╔ │ * └────────────────────────────────┘ * - * combining { { 4/4, 1/1 }, { 0/1, 4/5 } }, we can generate a texture connected to the right! + * combining { { 5/4, 1/3 }, { 1/2, 4/4 } }, we can generate a texture connected to the right! *
  * ╔══════╤═══════
  * ║      │      │
- * ║ 4/5  │ 1/1  │
+ * ║ 4/4  │ 1/2  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 4/4  │ 0/1  │
+ * ║ 5/4  │ 1/3  │
  * ╚══════╧═══════
  * 
* - * combining { { 4/4, 1/0 }, { 3/2, 1/3 } }, we can generate a texture in the shape of an L + * combining { { 5/4, 1/3 }, { 3/2, 2/0 } }, we can generate a texture in the shape of an L * (connected to the right and up) *
  * ║ ─────┼───── ╚
  * ║      │      │
- * ║ 3/2  │ 1/3  │
+ * ║ 2/0  │ 3/2  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 5/4  │ 1/0  │
+ * ║ 5/4  │ 1/3  │
  * ╚══════╧═══════
  * 
* From bbf445f9a096263ff4d02bfa649f1e11834d3680 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 19 Apr 2026 23:08:37 +0300 Subject: [PATCH 125/269] it _almost_ works. It's taunting me. --- .../gtceu/client/model/ctm/CTMCache.java | 21 ++++++++++--------- .../client/model/ctm/ConnectionCheck.java | 8 +++++-- .../gtceu/client/util/quad/QuadUtils.java | 14 +++++++------ 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 5a0a699667d..189715e4c5a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -94,14 +94,15 @@ public interface StateComparisonCallback { boolean connects(ConnectionCheck instance, BlockState from, BlockState to, Direction dir); } - /** Some hardcoded offset values for the different corner indeces */ + // these are inverted (on y) compared to the graphic; top row is bottom row and vice versa. + /** Some hardcoded offset values for the different corner indices */ protected static Vector2ic[][] submapOffsets = { - { new Vector2i(0, 3), new Vector2i(1, 3) }, - { new Vector2i(0, 2), new Vector2i(1, 2) }, + { new Vector2i(0, 0), new Vector2i(1, 0) }, + { new Vector2i(0, 1), new Vector2i(1, 1) }, }; protected static Vector2ic[][] defaultSubmapCache = { - { new Vector2i(4, 5), new Vector2i(5, 5) }, { new Vector2i(4, 4), new Vector2i(5, 4) }, + { new Vector2i(4, 5), new Vector2i(5, 5) }, }; // TODO encapsulate @@ -160,7 +161,7 @@ public static ISubmap getSubmapFor(Vector2ic coordinates) { if (isDefaultTexture(coordinates)) { return Submap.X2[coordinates.x() % 4][coordinates.y() % 4]; } else { - return Submap.X4[(coordinates.x() + 2) % 4][(coordinates.y() + 2) % 4]; + return Submap.X4[3 - (coordinates.x() + 2) % 4][3 - (coordinates.y() + 0) % 4]; } } @@ -177,7 +178,7 @@ private static byte setConnectedState(byte map, OctagonalOrientation dir, boolea } /** - * Builds the connection map and stores it in this CTMLogic instance. + * Builds the connection map and stores it in this CTMLogic instance.
* The {@link #connected(OctagonalOrientation)}, {@link #connectedAnd(OctagonalOrientation...)}, * and {@link #connectedOr(OctagonalOrientation...)} methods can be used to access it. */ @@ -201,11 +202,11 @@ protected void fillSubmaps(int x, int y) { this.submapCache[x][y] = submapOffsets[x][y]; } else { // dirs[0] is vertical, dirs[1] is horizontal - Vector2i offsets = new Vector2i(submapOffsets[x][y]); - if (connected(dirs[0])) offsets.x += 2; - if (connected(dirs[1])) offsets.y += 2; + Vector2i offset = new Vector2i(submapOffsets[x][y]); + if (connected(dirs[1])) offset.x += 2; + if (connected(dirs[0])) offset.y += 2; - this.submapCache[x][y] = offsets; + this.submapCache[x][y] = offset; } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java index e2ea42d0882..a2f7bd9c3b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java @@ -93,8 +93,12 @@ public boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockStat BlockState obscuring = getConnectionState(level, obscuringPos, level.getBlockState(obscuringPos), dir, current, currentState); - // check that we aren't already connected to / from this side - return stateComparator(state, connectionState, dir) && !stateComparator(state, obscuring, dir); + boolean ret = stateComparator(state, connectionState, dir); + + // check that we aren't already connected outwards from this side + ret &= !stateComparator(state, obscuring, dir); + + return ret; } public boolean stateComparator(BlockState from, BlockState to, Direction dir) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java index 98c85e376e9..69f2fe05829 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java @@ -85,15 +85,15 @@ public static List buildCTMQuads(CTMCache cachedConnections, List quad.pos(i, quad.x(i), newXy[i].y, newXy[i].x); - case Y -> quad.pos(i, newXy[i].x, quad.y(i), newXy[i].y); - case Z -> quad.pos(i, newXy[i].x, newXy[i].y, quad.z(i)); + case X -> quad.pos(i, quad.x(i), 1 - newXy[i].y, 1 - newXy[i].x); + case Y -> quad.pos(i, 1 - newXy[i].x, quad.y(i), 1 - newXy[i].y); + case Z -> quad.pos(i, 1 - newXy[i].x, 1 - newXy[i].y, quad.z(i) ); } } + // spotless:on return quad; } From b26a46b821479c7a5a482d569c6ce0db7b38490b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 11:59:59 +0300 Subject: [PATCH 126/269] Rename QuadUtils to CTMHelper --- .../gtceu/client/model/ctm/CTMBakedModel.java | 4 ++-- .../gtceu/client/model/machine/MachineModel.java | 4 ++-- .../util/quad/{QuadUtils.java => CTMHelper.java} | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/util/quad/{QuadUtils.java => CTMHelper.java} (97%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index ca25fea962d..7c2af228f87 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.client.util.quad.QuadUtils; +import com.gregtechceu.gtceu.client.util.quad.CTMHelper; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -49,7 +49,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction CTMCache ctmCache = CTMCache.getInstance(); ctmCache.fillSubmapCache(level, pos, state, side); return this.sideCache.computeIfAbsent(side, $ -> new ConcurrentHashMap<>()) - .computeIfAbsent(ctmCache, cache -> QuadUtils.buildCTMQuads(cache, + .computeIfAbsent(ctmCache, cache -> CTMHelper.buildCTMQuads(cache, super.getQuads(state, side, rand, parentModelData, renderType), side)); } 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 068ddfcb348..64629914f05 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 @@ -14,7 +14,7 @@ import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.util.RenderUtil; -import com.gregtechceu.gtceu.client.util.quad.QuadUtils; +import com.gregtechceu.gtceu.client.util.quad.CTMHelper; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; @@ -275,7 +275,7 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl // we have to recalculate CTM ourselves. // this is the slowest part by a long shot because the LDLib quad logic isn't very optimized. if (level != null && pos != null && blockState != null) { - return QuadUtils.buildCTMQuads(level, pos, blockState, quads, side); + return CTMHelper.buildCTMQuads(level, pos, blockState, quads, side); } return quads; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java rename to src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index 69f2fe05829..f2a7f642299 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/QuadUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -26,7 +26,7 @@ import static com.gregtechceu.gtceu.client.model.quad.MutableQuadView.*; import static com.gregtechceu.gtceu.client.util.ModelEventHelper.*; -public class QuadUtils { +public class CTMHelper { public static Vector2f[] findMinMaxUVs(Vector2f[] uvs) { float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE, maxU = Float.MIN_VALUE, maxV = Float.MIN_VALUE; @@ -141,7 +141,7 @@ private static void growQuadrantUVs(Vector2f[] uvs, Vector2f maxUV) { private static void transformUVs(MutableQuadView quad, ISubmap submap) { submap = submap.unitScale(); - Vector2f[] uvs = QuadUtils.uvs.get(); + Vector2f[] uvs = CTMHelper.uvs.get(); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); } @@ -185,15 +185,15 @@ private static void transformUVs(MutableQuadView quad, ISubmap submap) { public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { Direction normal = quad.nominalFace(); - Vector2f[] uvs = QuadUtils.uvs.get(); + Vector2f[] uvs = CTMHelper.uvs.get(); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); } int firstIndex = findMinUVIndex(uvs); - Vector2f[] xy = QuadUtils.xy.get(); - Vector2f[] newXy = QuadUtils.newXy.get(); - Vector3f position = QuadUtils.position.get(); + Vector2f[] xy = CTMHelper.xy.get(); + Vector2f[] newXy = CTMHelper.newXy.get(); + Vector3f position = CTMHelper.position.get(); for (int i = 0; i < 4; i++) { int idx = (firstIndex + i) % 4; // updates position From 613de0132b658f879983b590f0016b9ca95d1a8e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 12:38:24 +0300 Subject: [PATCH 127/269] The 'is dynamic resources enabled' check is needed, actually --- .../com/gregtechceu/gtceu/client/util/ModelEventHelper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 89600e160bc..3a1c21b8db5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.core.mixins.ReloadableResourceManagerAccessor; +import com.gregtechceu.gtceu.integration.modernfix.GTModernFixIntegration; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -109,9 +110,8 @@ public static void onAtlasStitched(TextureStitchEvent.Post event) { @SubscribeEvent(priority = EventPriority.LOWEST) public static void onModifyBakingResult(ModelEvent.ModifyBakingResult event) { - // don't process baked model replacement here if ModernFix is loaded, as - // GTModernFixIntegration#onBakedModelLoad does the same thing & it's always called - if (GTCEu.Mods.isModernFixLoaded()) return; + // don't process baked model replacement here if ModernFix is loaded & dynamic resources is enabled + if (GTCEu.Mods.isModernFixLoaded() && GTModernFixIntegration.isDynamicResourcesEnabled()) return; for (var entry : event.getModels().entrySet()) { BakedModel model = entry.getValue(); From 4a4b975c8bfdb2ce34f1cfba6b370952b2141a1a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:14:09 +0300 Subject: [PATCH 128/269] Add a CTM UV test block --- .../gtceu/common/data/GTBlocks.java | 6 ++++++ .../gtceu/common/data/blocks/GTDevBlocks.java | 17 +++++++++++++++++ .../assets/gtceu/textures/block/ctm_test.png | Bin 0 -> 258 bytes .../gtceu/textures/block/ctm_test.png.mcmeta | 5 +++++ .../gtceu/textures/block/ctm_test_ctm.png | Bin 0 -> 688 bytes 5 files changed, 28 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java create mode 100644 src/main/resources/assets/gtceu/textures/block/ctm_test.png create mode 100644 src/main/resources/assets/gtceu/textures/block/ctm_test.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/ctm_test_ctm.png diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index b2a8f0e4f87..daea299f782 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -18,6 +18,7 @@ import com.gregtechceu.gtceu.common.block.*; import com.gregtechceu.gtceu.common.block.explosive.IndustrialTNTBlock; import com.gregtechceu.gtceu.common.block.explosive.PowderbarrelBlock; +import com.gregtechceu.gtceu.common.data.blocks.GTDevBlocks; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.item.LampBlockItem; import com.gregtechceu.gtceu.common.item.LaserPipeBlockItem; @@ -1420,6 +1421,11 @@ public static void init() { // GCYM GCYMBlocks.init(); + + // Dev-only test blocks + if (GTCEu.isDev()) { + GTDevBlocks.init(); + } } private static void initializeCobbleReplacements() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java new file mode 100644 index 00000000000..f11fecf4211 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java @@ -0,0 +1,17 @@ +package com.gregtechceu.gtceu.common.data.blocks; + +import com.tterrag.registrate.util.entry.BlockEntry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; + +import static com.gregtechceu.gtceu.common.registry.GTRegistration.REGISTRATE; + +public class GTDevBlocks { + + public static final BlockEntry CTM_TEST = REGISTRATE.block("ctm_test", Block::new) + .properties(p -> p.noLootTable().sound(SoundType.SCULK)) + .simpleItem() + .register(); + + public static void init() {} +} diff --git a/src/main/resources/assets/gtceu/textures/block/ctm_test.png b/src/main/resources/assets/gtceu/textures/block/ctm_test.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9f059f5127d3920e644f188ab533155fc17647 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9F3${@^GvDCf{D9B#o z>Fdh=ibaIeP|d5*w+ARBS>hT|;+&tGo0?a`;9QiNSdyBeP@Y+mq2TW68xY>eCk|9p z`)X-P)@w;eMsR(qTQcZ(}nZJ z&y~eroy=D&X`OQU(#j{x*Yvqv(_VM`v2Suj{-e^|83GaJ8H_VKjbBztEuS*jp7n!9;rJdG^AI%6_*|Gd>e>Y$5);!4mnHiy>v2YqSkJrdlnqW7{w1sqie7 z>q2m}$m>QFfOpy@wvTt}1Ch72vr~Z{MH!G2kj}cy-sKdyGtD_>4% Date: Mon, 20 Apr 2026 16:14:42 +0300 Subject: [PATCH 129/269] Remove bad offsets --- .../com/gregtechceu/gtceu/client/model/ctm/CTMCache.java | 2 +- .../com/gregtechceu/gtceu/client/util/quad/CTMHelper.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 189715e4c5a..3a6c408d803 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -161,7 +161,7 @@ public static ISubmap getSubmapFor(Vector2ic coordinates) { if (isDefaultTexture(coordinates)) { return Submap.X2[coordinates.x() % 4][coordinates.y() % 4]; } else { - return Submap.X4[3 - (coordinates.x() + 2) % 4][3 - (coordinates.y() + 0) % 4]; + return Submap.X4[3 - (coordinates.x() + 0) % 4][3 - (coordinates.y() + 0) % 4]; } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index f2a7f642299..f94ed7eff9e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -141,10 +141,12 @@ private static void growQuadrantUVs(Vector2f[] uvs, Vector2f maxUV) { private static void transformUVs(MutableQuadView quad, ISubmap submap) { submap = submap.unitScale(); + // cache UVs Vector2f[] uvs = CTMHelper.uvs.get(); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); } + // scale the quadrants' UVs to the full block range Vector2f[] minMaxUVs = findMinMaxUVs(uvs); growQuadrantUVs(uvs, minMaxUVs[1]); @@ -259,9 +261,9 @@ public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { // spotless:off for (int i = 0; i < 4; i++) { switch (normal.getAxis()) { - case X -> quad.pos(i, quad.x(i), 1 - newXy[i].y, 1 - newXy[i].x); - case Y -> quad.pos(i, 1 - newXy[i].x, quad.y(i), 1 - newXy[i].y); - case Z -> quad.pos(i, 1 - newXy[i].x, 1 - newXy[i].y, quad.z(i) ); + case X -> quad.pos(i, quad.x(i), newXy[i].y, newXy[i].x); + case Y -> quad.pos(i, newXy[i].x, quad.y(i), newXy[i].y); + case Z -> quad.pos(i, newXy[i].x, newXy[i].y, quad.z(i)); } } // spotless:on From f529c743e1aa204ee0dbe8aca32d30e755ed5bbb Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 17:37:51 +0300 Subject: [PATCH 130/269] Run datagen for CTM test block --- .../resources/assets/gtceu/blockstates/ctm_test.json | 7 +++++++ src/generated/resources/assets/gtceu/lang/en_ud.json | 1 + src/generated/resources/assets/gtceu/lang/en_us.json | 1 + .../resources/assets/gtceu/models/block/ctm_test.json | 6 ++++++ .../resources/assets/gtceu/models/item/ctm_test.json | 3 +++ .../gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java | 1 + 6 files changed, 19 insertions(+) create mode 100644 src/generated/resources/assets/gtceu/blockstates/ctm_test.json create mode 100644 src/generated/resources/assets/gtceu/models/block/ctm_test.json create mode 100644 src/generated/resources/assets/gtceu/models/item/ctm_test.json diff --git a/src/generated/resources/assets/gtceu/blockstates/ctm_test.json b/src/generated/resources/assets/gtceu/blockstates/ctm_test.json new file mode 100644 index 00000000000..9332a79dea2 --- /dev/null +++ b/src/generated/resources/assets/gtceu/blockstates/ctm_test.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "gtceu:block/ctm_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 23ce21657c2..ba8c5771331 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.creative_tank": "ʞuɐ⟘ ǝʌıʇɐǝɹƆ", "block.gtceu.creosote": "ǝʇosoǝɹƆ", "block.gtceu.crushing_wheels": "sןǝǝɥM buıɥsnɹƆ", + "block.gtceu.ctm_test": "ʞɔoןᗺ ʇsǝ⟘ ǝɹnʇxǝ⟘ pǝʇɔǝuuoƆ", "block.gtceu.cupronickel_coil_block": "ʞɔoןᗺ ןıoƆ ןǝʞɔıuoɹdnƆ", "block.gtceu.cyan_borderless_lamp": "dɯɐꞀ ssǝןɹǝpɹoᗺ uɐʎƆ", "block.gtceu.cyan_lamp": "dɯɐꞀ uɐʎƆ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6eca15057a9..3aafbf00c3c 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.creative_tank": "Creative Tank", "block.gtceu.creosote": "Creosote", "block.gtceu.crushing_wheels": "Crushing Wheels", + "block.gtceu.ctm_test": "Connected Texture Test Block", "block.gtceu.cupronickel_coil_block": "Cupronickel Coil Block", "block.gtceu.cyan_borderless_lamp": "Cyan Borderless Lamp", "block.gtceu.cyan_lamp": "Cyan Lamp", diff --git a/src/generated/resources/assets/gtceu/models/block/ctm_test.json b/src/generated/resources/assets/gtceu/models/block/ctm_test.json new file mode 100644 index 00000000000..47bfa0945dd --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/ctm_test.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "gtceu:block/ctm_test" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/ctm_test.json b/src/generated/resources/assets/gtceu/models/item/ctm_test.json new file mode 100644 index 00000000000..1dec31234c8 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/ctm_test.json @@ -0,0 +1,3 @@ +{ + "parent": "gtceu:block/ctm_test" +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java index f11fecf4211..bea187acb4b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java @@ -9,6 +9,7 @@ public class GTDevBlocks { public static final BlockEntry CTM_TEST = REGISTRATE.block("ctm_test", Block::new) + .lang("Connected Texture Test Block") .properties(p -> p.noLootTable().sound(SoundType.SCULK)) .simpleItem() .register(); From 2f833bcb85f48fc607a5414afee5332084b50eef Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:00:15 +0300 Subject: [PATCH 131/269] Fix CTM UV layouts --- .../gtceu/client/model/ctm/CTMCache.java | 49 +++++++++--------- .../assets/gtceu/textures/block/ctm_test.png | Bin 258 -> 318 bytes .../gtceu/textures/block/ctm_test_ctm.png | Bin 688 -> 812 bytes 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 3a6c408d803..3410558f469 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -39,40 +39,40 @@ * │ texture.png │ │ texture_ctm.png │ * │ ╔══════╤══════╗ │ │ ──────┼────── ║ ─────┼───── ║ │ * │ ║ │ ║ │ │ │ │ │║ │ ║ │ - * │ ║ 4/4 │ 4/5 ║ │ │ │ 0/0 │ 1/0 │║ 2/0 │ 3/0 ║ │ + * │ ║ 4/4 │ 4/5 ║ │ │ │ 0/0 │ 0/1 │║ 0/2 │ 0/3 ║ │ * │ ╟──────┼──────╢ │ │ ┼──────┼──────┼╟──────┼──────╢ │ * │ ║ │ ║ │ │ │ │ │║ │ ║ │ - * │ ║ 5/4 │ 5/5 ║ │ │ │ 0/1 │ 1/1 │║ 2/1 │ 3/1 ║ │ + * │ ║ 5/4 │ 5/5 ║ │ │ │ 1/0 │ 1/1 │║ 1/2 │ 1/3 ║ │ * │ ╚══════╧══════╝ │ │ ──────┼────── ║ ─────┼───── ║ │ * └─────────────────┘ │ ═══════╤═══════╝ ─────┼───── ╚ │ * │ │ │ ││ │ │ │ - * │ │ 0/2 │ 1/2 ││ 2/2 │ 3/2 │ │ + * │ │ 2/0 │ 2/1 ││ 2/2 │ 2/3 │ │ * │ ┼──────┼──────┼┼──────┼──────┼ │ * │ │ │ ││ │ │ │ - * │ │ 0/3 │ 1/3 ││ 2/3 │ 3/3 │ │ + * │ │ 3/0 │ 3/1 ││ 3/2 │ 3/3 │ │ * │ ═══════╧═══════╗ ─────┼───── ╔ │ * └────────────────────────────────┘ * - * combining { { 5/4, 1/3 }, { 1/2, 4/4 } }, we can generate a texture connected to the right! + * combining { { 5/4, 3/1 }, { 2/1, 4/4 } }, we can generate a texture connected to the right! *
  * ╔══════╤═══════
  * ║      │      │
- * ║ 4/4  │ 1/2  │
+ * ║ 4/4  │ 2/1  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 5/4  │ 1/3  │
+ * ║ 5/4  │ 3/1  │
  * ╚══════╧═══════
  * 
* - * combining { { 5/4, 1/3 }, { 3/2, 2/0 } }, we can generate a texture in the shape of an L + * combining { { 5/4, 3/1 }, { 0/2, 2/3 } }, we can generate a texture in the shape of an L * (connected to the right and up) *
  * ║ ─────┼───── ╚
  * ║      │      │
- * ║ 2/0  │ 3/2  │
+ * ║ 0/2  │ 2/3  │
  * ╟──────┼──────┼
  * ║      │      │
- * ║ 5/4  │ 1/3  │
+ * ║ 5/4  │ 3/1  │
  * ╚══════╧═══════
  * 
* @@ -94,27 +94,27 @@ public interface StateComparisonCallback { boolean connects(ConnectionCheck instance, BlockState from, BlockState to, Direction dir); } - // these are inverted (on y) compared to the graphic; top row is bottom row and vice versa. - /** Some hardcoded offset values for the different corner indices */ - protected static Vector2ic[][] submapOffsets = { - { new Vector2i(0, 0), new Vector2i(1, 0) }, - { new Vector2i(0, 1), new Vector2i(1, 1) }, + /** Hardcoded offset values for the different submap indices */ + // store the full table(s) to reduce non-required allocations + protected static final Vector2ic[][] submapOffsets = { + { new Vector2i(0, 0), new Vector2i(0, 1), }, + { new Vector2i(1, 0), new Vector2i(1, 1), }, }; - protected static Vector2ic[][] defaultSubmapCache = { - { new Vector2i(4, 4), new Vector2i(5, 4) }, - { new Vector2i(4, 5), new Vector2i(5, 5) }, + protected static final Vector2ic[][] defaultSubmapCache = { + { new Vector2i(4, 4), new Vector2i(4, 5), }, + { new Vector2i(5, 4), new Vector2i(5, 5), }, }; // TODO encapsulate public ConnectionCheck connectionCheck = new ConnectionCheck(); + // spotless:off // Mapping the different corner indices to their respective dirs - protected static final OctagonalOrientation[][] submapMap = { - { BOTTOM, LEFT, BOTTOM_LEFT }, - { BOTTOM, RIGHT, BOTTOM_RIGHT }, - { TOP, RIGHT, TOP_RIGHT }, - { TOP, LEFT, TOP_LEFT } + protected static final OctagonalOrientation[][][] submapMap = { + { { LEFT, TOP, TOP_LEFT }, { RIGHT, TOP, TOP_RIGHT }, }, + { { LEFT, BOTTOM, BOTTOM_LEFT }, { RIGHT, BOTTOM, BOTTOM_RIGHT }, }, }; + // spotless:on protected byte connectionMap; protected Vector2ic[][] submapCache = defaultSubmapCache.clone(); @@ -195,7 +195,8 @@ public void buildConnectionMap(BlockAndTintGetter world, BlockPos pos, BlockStat @SuppressWarnings("null") protected void fillSubmaps(int x, int y) { - OctagonalOrientation[] dirs = submapMap[x + y * 2]; + // [0] is horizontal, [1] is vertical, [2] is diagonal + OctagonalOrientation[] dirs = submapMap[x][y]; if (connectedOr(dirs[0], dirs[1])) { if (connectedAnd(dirs)) { // If all dirs are connected, we use the fully connected face, the base offset value. diff --git a/src/main/resources/assets/gtceu/textures/block/ctm_test.png b/src/main/resources/assets/gtceu/textures/block/ctm_test.png index 5a9f059f5127d3920e644f188ab533155fc17647..88ea914d2f39a3ff1aad101a64a5796c9db70053 100644 GIT binary patch delta 281 zcmV+!0p|XK0=@!}8BqoR001BJ|6u?C00DDSM?wMF$t-^W000DMK}|sb0I`n?{9y$E z001CkNK#Dz0D2|>0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}olAsBzBNkl|n3&v+&Nur>I%Yz?eoqb{{`fHCSUYKWZ=nm4Z*QGm%GX?G(`0a$iuIF6ZnU4#6qn zjRM8-9S&(fdJ^8(tbAmBC*VC!Gw&|Qh=*$&8W@NYkP3)WoGXR0=G1+(3{-k9)^>f0 fXRhU~{d>+2hT%^r0h1gK00000NkvXXu0mjfK>li+ delta 241 zcmdnT)WkGFvYv^7fnmbL3^O3bS>O>_%)p?h48n{ROYO^mg6t)pzOL-ASVTAt)w~LQ zdw@ccC9V-A&iT2ysd*&~&PAz-C8;S2<(VZJ3hti10pX2&;y^_;o-U3d8t3OuJji$0 zfX7Kb_}~BOHxJHzVzFh_GiQ;+4n?s9<;2V0S%(yEB-;InHC;Gg{9IZ5)yaIdlGZ7g zFRgsCd`+L*HSKk`ANwXp)zv(Hc`V{i=DYFmAPeC$`nx9hLDzgt@{ZK>RM1n3Y3Pgg&ebxsLQ080U1ApigX diff --git a/src/main/resources/assets/gtceu/textures/block/ctm_test_ctm.png b/src/main/resources/assets/gtceu/textures/block/ctm_test_ctm.png index 0307672b01bda63550263c503978ec324b9fb62b..7e4b5d08300128942724a7c9aed9edc4d5c3364b 100644 GIT binary patch delta 769 zcmV+c1OEK51*`^;Bt`*qQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwks%j<0+mTbK~z}7wU@DO6G0G$ z=eMq)i(eulJOFNJe0_|Bkf4kuiV)=?Zv6z%L{W-JZYcmMggO;M3J*XaFX41hO^UnS zo86n)wZR$5lI`{0%zX3j%o@bRl(oV#K&#b-xxDlKxxLj9RYXLL-U%40lRlndK)ZX( z@c#B@KHM&U_Auh-SJE+qiC`qp+y?>-0=d1J)9&7q#^XL?Nrr(okVfotpwYij&)I5q zku3==(7sXv+cHVOG(ln1BPxq6XHo|m1*wApfk=3uSOmuB! z{+WQX^-r=VBC1|Zp5}l5_IGyu2@$;;&&+k_TxPd_>oxH5JFE8>I3<6$@FL+B6D=}iq*S| zcM9eR6{EWkG|VI^)JdK0jyR$)9F$DxM40#pjspcCnygidernzAPEpVRvQwLlYhBe( z$-EXl0V@!MV+d7{o&b9S-RCM5-jpcP!6w;%r-V}tXvbyH2h#d$<^{OnRYAR3;h@k5 zmZb(buvX;>?cEed%dvI;&>NMao2&_@mq3s)|247C9eq34VS)Q7K~y)Hc{^TGcx zq)M|tNOVxn9*OWI0nTO*!uH0o^%#3fw?W_CX>@2HM@dakSAh-}0006iNklH_VKjbBztEuS*jp7n!9;rJ zdG^AI%6_*|Gd>e>Y$5);!4mD%CCZ{|h1&1fq@?U*Q@SFo$P&QP+E-UiGu4wl&Z+ zdI^ZGZv?ZZ)*W-Fiepm)n5pps=D~RDI&%!pCC3%qXj|9W1Uv;91P>sWaY+zq4LG|G zl+-^Zz@$@|{l$IY9}OvkV1;XQfv@F|XeSdy0;n)(~O>~|7yxTo0I6PA& zs55oSHAageWtwZW4LhbW=Xtcbj45QsxJ@A4c|0r_*0?AK;x?4Q#>|J5xdP z!vfhe6hsEvWyB=Xq9_Ln3NaB1zWzcYm3Ae|9?=s@)R`g*sB{AUY~VBISw{p~YfMVk yamJEDkp{}LzwDzz5~(h|kfyd{>4$~f5x-^J@)2)WEEjnI0000 Date: Mon, 20 Apr 2026 22:02:41 +0300 Subject: [PATCH 132/269] Do, a copy, do it deep --- .../gtceu/client/model/ctm/CTMCache.java | 21 +++++---- .../gregtechceu/gtceu/utils/ArrayHelpers.java | 45 +++++++++++++++++++ 2 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 3410558f469..cea35f2ab03 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -17,6 +17,8 @@ */ package com.gregtechceu.gtceu.client.model.ctm; +import com.gregtechceu.gtceu.utils.ArrayHelpers; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; @@ -97,15 +99,16 @@ public interface StateComparisonCallback { /** Hardcoded offset values for the different submap indices */ // store the full table(s) to reduce non-required allocations protected static final Vector2ic[][] submapOffsets = { - { new Vector2i(0, 0), new Vector2i(0, 1), }, - { new Vector2i(1, 0), new Vector2i(1, 1), }, + { new Vector2i(0, 0), new Vector2i(0, 1), new Vector2i(0, 2), new Vector2i(0, 3), }, + { new Vector2i(1, 0), new Vector2i(1, 1), new Vector2i(1, 2), new Vector2i(1, 3), }, + { new Vector2i(2, 0), new Vector2i(2, 1), new Vector2i(2, 2), new Vector2i(2, 3), }, + { new Vector2i(3, 0), new Vector2i(3, 1), new Vector2i(3, 2), new Vector2i(3, 3), }, }; protected static final Vector2ic[][] defaultSubmapCache = { { new Vector2i(4, 4), new Vector2i(4, 5), }, { new Vector2i(5, 4), new Vector2i(5, 5), }, }; - // TODO encapsulate public ConnectionCheck connectionCheck = new ConnectionCheck(); // spotless:off @@ -117,7 +120,7 @@ public interface StateComparisonCallback { // spotless:on protected byte connectionMap; - protected Vector2ic[][] submapCache = defaultSubmapCache.clone(); + protected Vector2ic[][] submapCache = ArrayHelpers.deepCopy(defaultSubmapCache); public static CTMCache getInstance() { return new CTMCache(); @@ -161,7 +164,7 @@ public static ISubmap getSubmapFor(Vector2ic coordinates) { if (isDefaultTexture(coordinates)) { return Submap.X2[coordinates.x() % 4][coordinates.y() % 4]; } else { - return Submap.X4[3 - (coordinates.x() + 0) % 4][3 - (coordinates.y() + 0) % 4]; + return Submap.X4[coordinates.x()][coordinates.y()]; } } @@ -202,12 +205,8 @@ protected void fillSubmaps(int x, int y) { // If all dirs are connected, we use the fully connected face, the base offset value. this.submapCache[x][y] = submapOffsets[x][y]; } else { - // dirs[0] is vertical, dirs[1] is horizontal - Vector2i offset = new Vector2i(submapOffsets[x][y]); - if (connected(dirs[1])) offset.x += 2; - if (connected(dirs[0])) offset.y += 2; - - this.submapCache[x][y] = offset; + this.submapCache[x][y] = submapOffsets[x + (connected(dirs[0]) ? 2 : 0)] + [y + (connected(dirs[1]) ? 2 : 0)]; } } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java new file mode 100644 index 00000000000..e8e54ea8c99 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java @@ -0,0 +1,45 @@ +package com.gregtechceu.gtceu.utils; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Array; + +public class ArrayHelpers { + + /** + * Returns a copy of the specified array object, deeply copying multidimensional arrays. + * If the specified object is null, the return value is null. + * + *

+ * Note: if the array object has an element type which is a reference type that is not an array type, + * the elements themselves are not deeply copied. This method only copies array objects. + * + * @param array the array object to deep copy + * @param the type of the array to deep copy + * @return a copy of the specified array object, deeply copying multidimensional arrays, or null if the object is + * null + */ + @Contract(value = "!null -> !null; null -> null", pure = true) + public static @Nullable T @Nullable [] deepCopy(@Nullable T @Nullable [] array) { + if (array == null) { + return null; + } + + Class componentType = array.getClass().getComponentType(); + + @SuppressWarnings("unchecked") + T[] copy = (T[]) Array.newInstance(componentType, array.length); + + if (componentType.isArray()) { + for (int i = 0; i < array.length; ++i) { + //noinspection unchecked + Array.set(copy, i, deepCopy((T[]) array[i])); + } + } else { + System.arraycopy(array, 0, copy, 0, array.length); + } + + return copy; + } +} From 66339bbecea569a4b2b12d28570e5780817a3ecb Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:03:59 +0300 Subject: [PATCH 133/269] nonnull normal face, less copying --- .../client/model/ctm/OctagonalOrientation.java | 4 +++- .../gtceu/client/model/machine/MachineModel.java | 2 +- .../gtceu/client/util/quad/CTMHelper.java | 15 +++++++-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java index 18d1e22378c..eae8c487e6f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java @@ -17,6 +17,8 @@ */ package com.gregtechceu.gtceu.client.model.ctm; +import com.gregtechceu.gtceu.utils.GTUtil; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; @@ -73,7 +75,7 @@ public enum OctagonalOrientation implements StringRepresentable { private void buildCaches() { // Fill normalized dirs - for (Direction normal : Direction.values()) { + for (Direction normal : GTUtil.DIRECTIONS) { Direction[] normalized; if (normal == NORMAL) { normalized = dirs; 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 64629914f05..9ac6a409d8b 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 @@ -274,7 +274,7 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl // we have to recalculate CTM ourselves. // this is the slowest part by a long shot because the LDLib quad logic isn't very optimized. - if (level != null && pos != null && blockState != null) { + if (level != null && pos != null && blockState != null && side != null) { return CTMHelper.buildCTMQuads(level, pos, blockState, quads, side); } return quads; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index f94ed7eff9e..1580b8ed4f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -57,7 +57,7 @@ public static int findMinUVIndex(Vector2f[] uvs) { } public static List buildCTMQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, - List quads, @Nullable Direction cullFace) { + List quads, Direction cullFace) { CTMCache ctmCache = CTMCache.getInstance(); if (cullFace != null) { ctmCache.fillSubmapCache(level, pos, state, cullFace); @@ -66,8 +66,7 @@ public static List buildCTMQuads(BlockAndTintGetter level, BlockPos p return buildCTMQuads(ctmCache, quads, cullFace); } - public static List buildCTMQuads(CTMCache cachedConnections, List base, - @Nullable Direction cullFace) { + public static List buildCTMQuads(CTMCache cachedConnections, List base, Direction cullFace) { List result = new LinkedList<>(); MeshBuilder meshBuilder = MeshBuilder.getInstance(); var emitter = meshBuilder.getEmitter(); @@ -83,17 +82,17 @@ public static List buildCTMQuads(CTMCache cachedConnections, List Date: Mon, 20 Apr 2026 22:04:36 +0300 Subject: [PATCH 134/269] Fix the bottom face being off --- .../java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index 1580b8ed4f6..b6663348330 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -207,7 +207,7 @@ public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { } } - if (normal.getAxis() != Direction.Axis.Y) { + if (normal != Direction.UP) { submap = submap.flipY(); } if (normal == Direction.EAST || normal == Direction.NORTH) { From 42eb7d0d7800e929503ef4de65058aeb23cb7ce7 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:04:57 +0300 Subject: [PATCH 135/269] remove no longer correct doc comments --- .../gtceu/client/util/quad/CTMHelper.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index b6663348330..f0f73deee1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -107,10 +107,6 @@ public static List buildCTMQuads(CTMCache cachedConnections, List 0.5f ? 0.5f : 0.0f, minVInterp = maxUV.y > 0.5f ? 0.5f : 0.0f; @@ -170,18 +166,6 @@ private static void transformUVs(MutableQuadView quad, ISubmap submap) { quad.uv(3, uvs[3].x == minUV.x ? minU : maxU, uvs[3].y == minUV.y ? minV : maxV); } - /** - * Quadrant table is as follows: - *

-     * ╔══════╤══════╗
-     * ║      │      ║
-     * ║  2   │  3   ║
-     * ╟──────┼──────╢
-     * ║      │      ║
-     * ║  0   │  1   ║
-     * ╚══════╧══════╝
-     * 
- */ // TODO simplify, this is quite long public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { Direction normal = quad.nominalFace(); From 54d8b9ab8432f52c483eb51c77517213fc54f82e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 21 Apr 2026 10:26:51 +0300 Subject: [PATCH 136/269] Re-enable ARGB->ABGR color translation --- .../gregtechceu/gtceu/client/model/quad/MutableQuadView.java | 3 +-- .../java/com/gregtechceu/gtceu/client/model/quad/QuadView.java | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) 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 271e187f2c9..33ffcfb44cc 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 @@ -402,8 +402,7 @@ public final MutableQuadView fromVanilla(int[] quadData, int startIndex) { int colorIndex = baseIndex + VERTEX_COLOR; for (int i = 0; i < 4; i++) { - // ARGB -> ABGR is a transitive process, e.g. it can be reversed and works fine. - //this.data[colorIndex] = QuadTransformers.toABGR(this.data[colorIndex]); + this.data[colorIndex] = QuadTransformers.toABGR(this.data[colorIndex]); colorIndex += VERTEX_STRIDE; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java index d5d6726ea86..224930a8409 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/quad/QuadView.java @@ -22,6 +22,7 @@ import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; +import net.minecraftforge.client.model.QuadTransformers; import lombok.Getter; import lombok.experimental.Accessors; @@ -369,7 +370,7 @@ public final void toVanilla(int[] target, int targetIndex) { int colorIndex = EncodingFormat.VERTEX_COLOR; for (int i = 0; i < 4; i++) { - //target[colorIndex] = QuadTransformers.toABGR(target[colorIndex]); + target[colorIndex] = QuadTransformers.toABGR(target[colorIndex]); colorIndex += VERTEX_STRIDE; } } From d3c6afa7aa1d26024dd75938259f3b977fe8d042 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Tue, 21 Apr 2026 10:57:00 +0300 Subject: [PATCH 137/269] Spotless --- .../gregtechceu/gtceu/client/model/ctm/CTMCache.java | 10 ++++++---- .../gtceu/client/util/ModelEventHelper.java | 3 +-- .../gregtechceu/gtceu/client/util/quad/CTMHelper.java | 3 +-- .../gtceu/common/data/blocks/GTDevBlocks.java | 3 ++- .../java/com/gregtechceu/gtceu/utils/ArrayHelpers.java | 6 +++--- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index cea35f2ab03..72b71e536b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -31,6 +31,7 @@ import static com.gregtechceu.gtceu.client.model.ctm.OctagonalOrientation.*; +// spotless:off /** * The CTM renderer will draw the block's FACE by assembling 4 quadrants from the 5 available block textures. * The normal {@code texture.png} is the block's "unconnected" texture, and is used when CTM is disabled or the block @@ -83,16 +84,17 @@ *

* Sourced from ConnectedTexturesMod. */ +// spotless:on @Accessors(fluent = true, chain = true) public class CTMCache { @FunctionalInterface public interface StateComparisonCallback { - + StateComparisonCallback DEFAULT = (connectionCheck, from, to, dir) -> { return connectionCheck.ignoreStates() ? from.getBlock() == to.getBlock() : from == to; }; - + boolean connects(ConnectionCheck instance, BlockState from, BlockState to, Direction dir); } @@ -205,8 +207,8 @@ protected void fillSubmaps(int x, int y) { // If all dirs are connected, we use the fully connected face, the base offset value. this.submapCache[x][y] = submapOffsets[x][y]; } else { - this.submapCache[x][y] = submapOffsets[x + (connected(dirs[0]) ? 2 : 0)] - [y + (connected(dirs[1]) ? 2 : 0)]; + this.submapCache[x][y] = submapOffsets[x + (connected(dirs[0]) ? 2 : 0)][y + + (connected(dirs[1]) ? 2 : 0)]; } } } 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 3a1c21b8db5..bb616bf300c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/ModelEventHelper.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.client.model.machine.MachineModel; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.core.mixins.ReloadableResourceManagerAccessor; - import com.gregtechceu.gtceu.integration.modernfix.GTModernFixIntegration; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -30,7 +30,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @SuppressWarnings("deprecation") diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index f0f73deee1d..d9fd7eadba1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector2ic; import org.joml.Vector3f; @@ -38,7 +37,7 @@ public static Vector2f[] findMinMaxUVs(Vector2f[] uvs) { maxU = Math.max(maxU, uv.x()); maxV = Math.max(maxV, uv.y()); } - return new Vector2f[]{ new Vector2f(minU, minV), new Vector2f(maxU, maxV) }; + return new Vector2f[] { new Vector2f(minU, minV), new Vector2f(maxU, maxV) }; } public static int findMinUVIndex(Vector2f[] uvs) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java index bea187acb4b..e0cca005d91 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/blocks/GTDevBlocks.java @@ -1,9 +1,10 @@ package com.gregtechceu.gtceu.common.data.blocks; -import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; +import com.tterrag.registrate.util.entry.BlockEntry; + import static com.gregtechceu.gtceu.common.registry.GTRegistration.REGISTRATE; public class GTDevBlocks { diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java index e8e54ea8c99..d0cf73b0cd1 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java @@ -15,8 +15,8 @@ public class ArrayHelpers { * Note: if the array object has an element type which is a reference type that is not an array type, * the elements themselves are not deeply copied. This method only copies array objects. * - * @param array the array object to deep copy - * @param the type of the array to deep copy + * @param array the array object to deep copy + * @param the type of the array to deep copy * @return a copy of the specified array object, deeply copying multidimensional arrays, or null if the object is * null */ @@ -33,7 +33,7 @@ public class ArrayHelpers { if (componentType.isArray()) { for (int i = 0; i < array.length; ++i) { - //noinspection unchecked + // noinspection unchecked Array.set(copy, i, deepCopy((T[]) array[i])); } } else { From 768d994d709a430ec49d94aaaa212fc8c2271fb8 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:31:23 +0300 Subject: [PATCH 138/269] Add update doc --- docs/content/Modpacks/Changes/v8.0.0.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index fc7c33f8651..eca9b7b85d1 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -125,9 +125,22 @@ A large number of machine feature interfaces have been removed, and have had the - `IFluidRendererMulti` - Use `MultiblockFluidRendererTrait` +## Connected texture reimplementation +The mod's connected texture logic has been reimplemented in GTM proper. +Texture packs, addons, and modpacks will have to change their texture metadata files for connected texures slightly. +A few regexes for fixing all the MCMeta files is follows, run them in order: + +1. Match: `"ldlib":([\s\{]*)"connection"(:\s".*?")(?:,\s.*)?` + Replace with: `"gtceu":$1"connection_texture"$2` +2. Match: `\s*\},\s*"shimmer":\s*\{(\s*"bloom":.*)` + Replace with: `,$1` +3. Match: `(\{\s*)"shimmer":(\s*\{\s*"bloom":.*)` + Replace with: `$1"gtceu":$2` + + ## Other Changes - `BlastingRecipeBuilder`, `CampfireRecipeBuilder`, `SmeltingRecipeBuilder` and `SmokingRecipeBuilder` have been merged into `SimpleCookingRecipeBuilder` - Example usage: `SimpleCookingRecipeBuilder.campfireCooking("cooking_chicken").input(new ItemStack(Items.CHICKEN)).output(new ItemStacks(Items.COOKED_CHICKEN)).cookingTime(100).experience(100).save(provider);` - `GTFluidImpl` has been merged into `GTFluid`, use `GTFluid.Flowing` and `GTFluid.Source` instead of `GTFluidImpl.Flowing` and `GTFluidImpl.Source`. -- Item behaviors have been moved to `common/item/behavior`, and some items have been moved from `api/item` to `common/item`. \ No newline at end of file +- Item behaviors have been moved to `common/item/behavior`, and some items have been moved from `api/item` to `common/item`. From ce6bff4b3b4913b3df08528c2160850cf1c6ce0b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:19:50 +0300 Subject: [PATCH 139/269] CTM layout documentation --- .../Other-Topics/Connected-Textures.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 docs/content/Modpacks/Other-Topics/Connected-Textures.md diff --git a/docs/content/Modpacks/Other-Topics/Connected-Textures.md b/docs/content/Modpacks/Other-Topics/Connected-Textures.md new file mode 100644 index 00000000000..1b929e6aefe --- /dev/null +++ b/docs/content/Modpacks/Other-Topics/Connected-Textures.md @@ -0,0 +1,63 @@ +--- +title: Creating Connected Textures +--- + +**Connected textures** are, as the name would imply, textures that connect with neighboring blocks. + +The CTM renderer will draw the block faces by assembling 4 quadrants from the 5 available block textures. +The normal `texture.png` is the block's "unconnected" texture, and is used when CTM is disabled or the block +has nothing to connect to. +`texture.png` has the outside corner quadrants and `texture_ctm.png` contains the connections. +``` +┌─────────────────┐ ┌────────────────────────────────┐ +│ texture.png │ │ texture_ctm.png │ +│ ╔══════╤══════╗ │ │ ──────┼────── ║ ─────┼───── ║ │ +│ ║ │ ║ │ │ │ │ │║ │ ║ │ +│ ║ 4/4 │ 4/5 ║ │ │ │ 0/0 │ 0/1 │║ 0/2 │ 0/3 ║ │ +│ ╟──────┼──────╢ │ │ ┼──────┼──────┼╟──────┼──────╢ │ +│ ║ │ ║ │ │ │ │ │║ │ ║ │ +│ ║ 5/4 │ 5/5 ║ │ │ │ 1/0 │ 1/1 │║ 1/2 │ 1/3 ║ │ +│ ╚══════╧══════╝ │ │ ──────┼────── ║ ─────┼───── ║ │ +└─────────────────┘ │ ═══════╤═══════╝ ─────┼───── ╚ │ + │ │ │ ││ │ │ │ + │ │ 2/0 │ 2/1 ││ 2/2 │ 2/3 │ │ + │ ┼──────┼──────┼┼──────┼──────┼ │ + │ │ │ ││ │ │ │ + │ │ 3/0 │ 3/1 ││ 3/2 │ 3/3 │ │ + │ ═══════╧═══════╗ ─────┼───── ╔ │ + └────────────────────────────────┘ +``` + +For example, combining sections 4/4, 2/1, 5/4, and 3/1, we can generate a texture connected to the right! +``` +╔══════╤═══════ +║ │ │ +║ 4/4 │ 2/1 │ +╟──────┼──────┼ +║ │ │ +║ 5/4 │ 3/1 │ +╚══════╧═══════ +``` +Combining sections 0/2, 2/3, 5/4, and 3/1, we can generate a texture in the shape of an L (connected to the right and up): +``` +║ ─────┼───── ╚ +║ │ │ +║ 0/2 │ 2/3 │ +╟──────┼──────┼ +║ │ │ +║ 5/4 │ 3/1 │ +╚══════╧═══════ +``` + + +??? example "Example MCMeta file" + (For a texture `mypack/assets/textures/blocks/texture.png` with a ctm texture `mypack/assets/textures/blocks/texture_ctm.png`) + ```json title="mypack:blocks/texture.png.mcmeta" + { + "gtceu": { + "connection_texture": "mypack:blocks/texture_ctm" + } + } + ``` + The CTM texture layout is [here](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/resources/assets/gtceu/textures/block/ctm_test.png) for the unconnected texture and [here](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/resources/assets/gtceu/textures/block/ctm_test_ctm.png) for its connections. + Its MCMeta metadata file is [this one](https://github.com/GregTechCEu/GregTech-Modern/blob/1.20.1/src/main/resources/assets/gtceu/textures/block/ctm_test.png.mcmeta). From 070689c228a47b2c01081f8e66841a75712d9748 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 11:58:11 +0300 Subject: [PATCH 140/269] Fix fluid area render --- .../gtceu/client/renderer/machine/impl/FluidAreaRender.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java index 47b961822a3..2b7d3aba750 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java @@ -96,7 +96,7 @@ public void render(WorkableMultiblockMachine machine, float partialTick, if (lastRecipe == null) { cachedRecipe = null; cachedFluid = null; - } else if (full.getOffsetTimer() % 20 == 0 || lastRecipe.id != cachedRecipe) { + } else if (machine.getOffsetTimer() % 20 == 0 || lastRecipe.id != cachedRecipe) { cachedRecipe = lastRecipe.id; if (machine.isActive()) { cachedFluid = RenderUtil.getRecipeFluidToRender(lastRecipe); @@ -115,8 +115,8 @@ public void render(WorkableMultiblockMachine machine, float partialTick, for (RelativeDirection face : this.drawFaces) { poseStack.pushPose(); - Direction dir = face.getRelative(full.getFrontFacing(), full.getUpwardsFacing(), - full.isFlipped()); + Direction dir = face.getRelative(machine.getFrontFacing(), machine.getUpwardsFacing(), + machine.isFlipped()); if (dir.getAxis() != Direction.Axis.Y) dir = dir.getOpposite(); fluidBlockRenderer.drawPlane(dir, trait.getFluidOffsets(), poseStack, consumer, cachedFluid, From ed1b1071b73b23799552b88587f2ee915eb43ccf Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:06:06 +0300 Subject: [PATCH 141/269] Remove unused helper methods --- .../decorator/GTLampItemOverlayRenderer.java | 32 +++++++++---------- .../gtceu/common/block/LampBlock.java | 16 ++-------- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/item/decorator/GTLampItemOverlayRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/item/decorator/GTLampItemOverlayRenderer.java index e2b5853a3f3..32bf1087249 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/item/decorator/GTLampItemOverlayRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/item/decorator/GTLampItemOverlayRenderer.java @@ -31,25 +31,25 @@ public static OverlayType getOverlayType(boolean light, boolean bloom) { @Override public boolean render(GuiGraphics graphics, Font font, ItemStack stack, int xPosition, int yPosition) { - if (stack.hasTag()) { - var tag = stack.getOrCreateTag(); - var overlayType = getOverlayType(isLightEnabled(tag), isBloomEnabled(tag)); - if (overlayType == OverlayType.NONE) { - return true; - } + if (!stack.hasTag()) { + return false; + } + @SuppressWarnings("DataFlowIssue") + var overlayType = getOverlayType(isLightEnabled(stack.getTag()), isBloomEnabled(stack.getTag())); + if (overlayType == OverlayType.NONE) { + return false; + } - RenderSystem.disableDepthTest(); - if (overlayType.noBloom()) { - GuiTextures.LAMP_NO_BLOOM.draw(graphics, 0, 0, xPosition, yPosition, 16, 16); - } + RenderSystem.disableDepthTest(); + if (overlayType.noBloom()) { + GuiTextures.LAMP_NO_BLOOM.draw(graphics, 0, 0, xPosition, yPosition, 16, 16); + } - if (overlayType.noLight()) { - GuiTextures.LAMP_NO_LIGHT.draw(graphics, 0, 0, xPosition, yPosition, 16, 16); - } - RenderSystem.enableDepthTest(); - return true; + if (overlayType.noLight()) { + GuiTextures.LAMP_NO_LIGHT.draw(graphics, 0, 0, xPosition, yPosition, 16, 16); } - return false; + RenderSystem.enableDepthTest(); + return true; } public enum OverlayType { diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java index b1963400c8d..f172a13d83a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java @@ -60,19 +60,7 @@ public LampBlock(Properties properties, DyeColor color, boolean bordered) { } public static boolean isLightActive(BlockState state) { - return isInverted(state) != state.getValue(POWERED); - } - - public static boolean isInverted(BlockState state) { - return state.getValue(INVERTED); - } - - public static boolean isLightEnabled(BlockState state) { - return state.getValue(LIGHT); - } - - public static boolean isBloomEnabled(BlockState state) { - return state.getValue(BLOOM); + return state.getValue(INVERTED) != state.getValue(POWERED); } public static boolean isInverted(CompoundTag tag) { @@ -112,7 +100,7 @@ protected void createBlockStateDefinition(StateDefinition.Builder Date: Sat, 25 Apr 2026 19:42:24 +0300 Subject: [PATCH 142/269] Use SectionPos for tracking bloom chunks --- .../gtceu/client/bloom/BloomUtil.java | 139 +++++++++++------- .../mixins/client/LevelRendererMixin.java | 17 +-- .../client/ModelBlockRendererMixin.java | 5 +- .../mixins/embeddium/BlockRendererMixin.java | 4 +- .../core/mixins/forge/QuadLighterMixin.java | 5 +- 5 files changed, 100 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 4c66f49a20a..0ea2a43354e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -13,8 +13,8 @@ import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.Entity; +import net.minecraft.core.SectionPos; +import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; @@ -36,6 +36,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; @@ -47,9 +48,9 @@ public class BloomUtil { private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); - public static Map BLOOM_BUFFERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFERS = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); /** *

@@ -210,14 +211,13 @@ public static void invalidateLevelTickets(@NotNull LevelAccessor level) { } } - public static void init() {} - - public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRenderer levelRenderer, + public static void renderBloom(Camera camera, LevelRenderer levelRenderer, PoseStack poseStack, Matrix4f projectionMatrix, Frustum frustum, float partialTicks) { if (!GTShaders.canUseBloomShader()) { return; } + ProfilerFiller profiler = Minecraft.getInstance().getProfiler(); Vec3 camPos = camera.getPosition(); Minecraft.getInstance().getProfiler().popPush("gtceu:bloom"); @@ -225,15 +225,23 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende try { GTRenderTypes.bloom().setupRenderState(); + profiler.popPush("gtceu:bloom"); + preDraw(); if (!BLOOM_RENDERS.isEmpty()) { EffectRenderContext context = EffectRenderContext.getInstance() - .update(entity, camPos, frustum, partialTicks); - - for (List list : BLOOM_RENDERS.values()) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - draw(poseStack, buffer, context, list); + .update(camera, frustum, partialTicks); + + BLOOM_RENDER_LOCK.readLock().lock(); + try { + BLOOM_RENDERS.forEach((renderSetup, list) -> { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + draw(poseStack, buffer, context, renderSetup, list); + }); + } finally { + BLOOM_RENDER_LOCK.readLock().unlock(); } + postDraw(); } @@ -246,10 +254,20 @@ public static void renderBloom(Camera camera, @NotNull Entity entity, LevelRende // copy depth buffer from the main render target so bloom won't render through blocks // GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); - render(partialTicks, poseStack, projectionMatrix, levelRenderer, camera, frustum); + GTShaders.BLOOM_CHAIN.process(partialTicks); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + VertexBuffer.unbind(); + + // the profiler section is popped by popPush() in the calling method so we won't pop it here. } finally { BLOOM_RENDER_LOCK.writeLock().unlock(); } + + // noinspection UnstableApiUsage + ForgeHooksClient.dispatchRenderStage(AFTER_BLOOM_RENDER_STAGE, levelRenderer, + poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); + + GTRenderTypes.bloom().clearRenderState(); } private static void preDraw() { @@ -301,7 +319,7 @@ private static void postDraw() { } } - public static void finishBloomBuffer(BlockPos pos, BufferBuilder builder) { + public static void finishBloomBuffer(SectionPos pos, BufferBuilder builder) { BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); if (buffer != null) { BLOOM_BUFFER_BUILDERS.remove(pos, builder); @@ -329,7 +347,7 @@ public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, Verte } } - public static void removeBloomChunk(BlockPos origin) { + public static void removeBloomChunk(SectionPos origin) { BLOOM_BUFFER_BUILDERS.remove(origin); BLOOM_BUFFER_SORT_STATES.remove(origin); VertexBuffer buffer = BLOOM_BUFFERS.remove(origin); @@ -342,7 +360,7 @@ public static void removeBloomChunk(BlockPos origin) { } } - public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { + public static BufferBuilder getOrStartBloomBuffer(SectionPos pos) { BufferBuilder builder = BLOOM_BUFFER_BUILDERS.computeIfAbsent(pos, $ -> new BufferBuilder(GTRenderTypes.bloom().bufferSize())); if (!builder.building()) { @@ -351,7 +369,7 @@ public static BufferBuilder getOrStartBloomBuffer(BlockPos pos) { return builder; } - public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { + public static void bakeBloomChunkBuffers(SectionPos pos, Vec3 camPos) { if (!GTShaders.canUseBloomShader()) { return; } @@ -366,7 +384,8 @@ public static void bakeBloomChunkBuffers(BlockPos pos, Vec3 camPos) { finishBloomBuffer(pos, builder); } - public static ThreadLocal CURRENT_RENDERING_CHUNK_POS = new ThreadLocal<>(); + @ApiStatus.Internal + public static ThreadLocal<@Nullable SectionPos> CURRENT_RENDERING_SECTION = new ThreadLocal<>(); private static final String FILTER_TOGGLE_UNIFORM = "EnableFilter"; private static final String DEPTH_NEAR_UNIFORM = "DepthNear"; @@ -407,8 +426,10 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { } private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { + ShaderInstance shader = setupShaderUniforms(poseStack, projectionMatrix); + Uniform chunkOffsetUniform = shader.CHUNK_OFFSET; for (var entry : BLOOM_BUFFERS.entrySet()) { - BlockPos pos = entry.getKey(); + SectionPos pos = entry.getKey(); VertexBuffer buffer = entry.getValue(); // return early if buffer is invalid or has no vertex data bound @@ -416,50 +437,65 @@ private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatri if (buffer.isInvalid() || ((VertexBufferAccessor) buffer).getMode() == null) { continue; } + + if (chunkOffsetUniform != null) { + chunkOffsetUniform.set(SectionPos.sectionToBlockCoord(pos.getX()) - (float) camPos.x(), + SectionPos.sectionToBlockCoord(pos.getY()) - (float) camPos.y(), + SectionPos.sectionToBlockCoord(pos.getZ()) - (float) camPos.z()); + chunkOffsetUniform.upload(); + } + buffer.bind(); + buffer.draw(); + } poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); - // noinspection DataFlowIssue - buffer.drawWithShader(poseStack.last().pose(), projectionMatrix, - GameRenderer.getRendertypeCutoutShader()); - poseStack.popPose(); + if (chunkOffsetUniform != null) { + chunkOffsetUniform.set(0, 0, 0); } - } - - private static void render(float partialTicks, PoseStack poseStack, Matrix4f projectionMatrix, - LevelRenderer levelRenderer, Camera camera, Frustum frustum) { - GTShaders.BLOOM_CHAIN.process(partialTicks); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + shader.clear(); VertexBuffer.unbind(); + } - Minecraft.getInstance().getProfiler().pop(); - - // noinspection UnstableApiUsage - ForgeHooksClient.dispatchRenderStage(GTRenderTypes.bloom(), levelRenderer, - poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); + private static ShaderInstance setupShaderUniforms(PoseStack poseStack, Matrix4f projectionMatrix) { + ShaderInstance shader = RenderSystem.getShader(); + assert shader != null; - GTRenderTypes.bloom().clearRenderState(); + for(int i = 0; i < 12; ++i) { + int textureId = RenderSystem.getShaderTexture(i); + shader.setSampler("Sampler" + i, textureId); + } + if (shader.MODEL_VIEW_MATRIX != null) shader.MODEL_VIEW_MATRIX.set(poseStack.last().pose()); + if (shader.PROJECTION_MATRIX != null) shader.PROJECTION_MATRIX.set(projectionMatrix); + if (shader.COLOR_MODULATOR != null) shader.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); + if (shader.GLINT_ALPHA != null) shader.GLINT_ALPHA.set(RenderSystem.getShaderGlintAlpha()); + if (shader.FOG_START != null) shader.FOG_START.set(RenderSystem.getShaderFogStart()); + if (shader.FOG_END != null) shader.FOG_END.set(RenderSystem.getShaderFogEnd()); + if (shader.FOG_COLOR != null) shader.FOG_COLOR.set(RenderSystem.getShaderFogColor()); + if (shader.FOG_SHAPE != null) shader.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); + if (shader.TEXTURE_MATRIX != null) shader.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); + if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + + RenderSystem.setupShaderLights(shader); + shader.apply(); + + return shader; } - public static void copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - original.call(consumer, pose, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); + public static void copyToBloomBuffer(VertexConsumer originalVertexConsumer, BakedQuad quad, int[] combinedLights, + Consumer draw) { + draw.accept(originalVertexConsumer); + if (!GTShaders.canUseBloomShader()) { return; } - BlockPos chunkOrigin = BloomUtil.CURRENT_RENDERING_CHUNK_POS.get(); - if (chunkOrigin != null && BloomMetadataSection.hasBloom(quad, combinedLights)) { - original.call(BloomUtil.getOrStartBloomBuffer(chunkOrigin), pose, quad, - colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor); + SectionPos sectionOrigin = BloomUtil.CURRENT_RENDERING_SECTION.get(); + if (sectionOrigin != null && BloomMetadataSection.hasBloom(quad, combinedLights)) { + draw.accept(BloomUtil.getOrStartBloomBuffer(sectionOrigin)); } } @@ -505,11 +541,4 @@ private void checkValidity() { } } } - - @ApiStatus.Internal - @FunctionalInterface - public interface RegionVisibilityTest { - - boolean isAxisAlignedWith(int x, int y, int z); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index 14928c9413c..a7d3350dcb0 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -81,17 +81,14 @@ public abstract class LevelRendererMixin { @Unique private final RandomSource gtceu$modelRandom = RandomSource.create(); - @Shadow - public abstract ChunkRenderDispatcher getChunkRenderDispatcher(); - - @Inject(method = "applyFrustum", + @Inject(method = "compileChunks", at = @At(value = "INVOKE", - target = "Lit/unimi/dsi/fastutil/objects/ObjectArrayList;add(Ljava/lang/Object;)Z", - remap = false)) - private void gtceu$compileBloomBuffers(Frustum frustum, CallbackInfo ci, - @Local LevelRenderer.RenderChunkInfo chunkInfo) { - BloomUtil.bakeBloomChunkBuffers(chunkInfo.chunk.getOrigin(), - this.getChunkRenderDispatcher().getCameraPosition()); + ordinal = 0, + target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) + private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, + @Local SectionPos chunkOrigin) { + BloomUtil.CURRENT_RENDERING_SECTION.set(chunkOrigin); + BloomUtil.bakeBloomChunkBuffers(chunkOrigin, camera.getPosition()); } @Inject(method = "resize", at = @At("TAIL")) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java index 0f1b8cf66fe..a2ecb6e93ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java @@ -21,7 +21,8 @@ public class ModelBlockRendererMixin { float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { - BloomUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor, original); + BloomUtil.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { + original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); + }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index ece8b0b2b73..08439d3f1ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -51,12 +51,13 @@ public class BlockRendererMixin { private void gtceu$captureBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, Material material, BakedQuadView quad, int[] colors, QuadLightData light, Operation original) { - BlockPos chunkOrigin = SectionPos.of(ctx.pos()).origin(); + SectionPos chunkOrigin = SectionPos.of(ctx.pos()); // Check if quad is full brightness OR we have bloom enabled for the quad // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though if (GTShaders.canUseBloomShader() && gtceu$hasBloom(quad, light)) { ModelQuadOrientation orientation = this.useReorienting ? ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; + for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { int srcIndex = orientation.getVertexIndex(dstIndex); int color = this.colorEncoder.writeColor( @@ -82,6 +83,7 @@ public class BlockRendererMixin { NormI8.unpackZ(normal)); } } + original.call(instance, ctx, builder, offset, material, quad, colors, light); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java index b16d068ff7f..d610e2cb114 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java @@ -22,7 +22,8 @@ public class QuadLighterMixin { float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { - BloomUtil.copyToBloomBuffer(consumer, pose, quad, colorMuls, red, green, blue, - combinedLights, combinedOverlay, mulColor, original); + BloomUtil.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { + original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); + }); } } From 7546a84cbbe8a18ed0cc3a953d54cc582535b120 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 19:44:08 +0300 Subject: [PATCH 143/269] separate the one big lock try-finally into multiple smaller ones --- .../gtceu/client/bloom/BloomUtil.java | 187 ++++++++++-------- 1 file changed, 106 insertions(+), 81 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 0ea2a43354e..6de39781a1f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -22,8 +22,9 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.event.RenderLevelStageEvent; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.mojang.blaze3d.shaders.Uniform; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -52,6 +53,10 @@ public class BloomUtil { public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); + public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM_RENDER_STAGE; + + public static void init() {} + /** *

* Register a custom bloom render callback for subsequent world render. The render call persists until the @@ -219,49 +224,43 @@ public static void renderBloom(Camera camera, LevelRenderer levelRenderer, } ProfilerFiller profiler = Minecraft.getInstance().getProfiler(); Vec3 camPos = camera.getPosition(); - Minecraft.getInstance().getProfiler().popPush("gtceu:bloom"); - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - GTRenderTypes.bloom().setupRenderState(); - - profiler.popPush("gtceu:bloom"); - - preDraw(); - if (!BLOOM_RENDERS.isEmpty()) { - EffectRenderContext context = EffectRenderContext.getInstance() - .update(camera, frustum, partialTicks); - - BLOOM_RENDER_LOCK.readLock().lock(); - try { - BLOOM_RENDERS.forEach((renderSetup, list) -> { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - draw(poseStack, buffer, context, renderSetup, list); - }); - } finally { - BLOOM_RENDER_LOCK.readLock().unlock(); - } + GTRenderTypes.bloom().setupRenderState(); - postDraw(); - } + profiler.popPush("gtceu:bloom"); - if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { - setupBloomUniforms(true); - drawBlockBloom(poseStack, projectionMatrix, camPos); - } else { - setupBloomUniforms(false); + preDraw(); + if (!BLOOM_RENDERS.isEmpty()) { + EffectRenderContext context = EffectRenderContext.getInstance() + .update(camera, frustum, partialTicks); + + BLOOM_RENDER_LOCK.readLock().lock(); + try { + BLOOM_RENDERS.forEach((renderSetup, list) -> { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + draw(poseStack, buffer, context, renderSetup, list); + }); + } finally { + BLOOM_RENDER_LOCK.readLock().unlock(); } - // copy depth buffer from the main render target so bloom won't render through blocks - // GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); - GTShaders.BLOOM_CHAIN.process(partialTicks); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); - VertexBuffer.unbind(); + postDraw(); + } - // the profiler section is popped by popPush() in the calling method so we won't pop it here. - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); + if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { + setupBloomUniforms(true); + drawBlockBloom(poseStack, projectionMatrix, camPos); + } else { + setupBloomUniforms(false); } + // copy depth buffer from the main render target so bloom won't render through blocks + // GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); + + GTShaders.BLOOM_CHAIN.process(partialTicks); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + VertexBuffer.unbind(); + + // the profiler section is popped by popPush() in the calling method so we won't pop it here. // noinspection UnstableApiUsage ForgeHooksClient.dispatchRenderStage(AFTER_BLOOM_RENDER_STAGE, levelRenderer, @@ -271,11 +270,16 @@ public static void renderBloom(Camera camera, LevelRenderer levelRenderer, } private static void preDraw() { - for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { - if (!ticket.isValid()) continue; - BLOOM_RENDERS.computeIfAbsent(ticket.renderSetup, k -> new ArrayList<>()).add(ticket); + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { + if (!ticket.isValid()) continue; + BLOOM_RENDERS.computeIfAbsent(ticket.renderSetup, k -> new ArrayList<>()).add(ticket); + } + SCHEDULED_BLOOM_RENDERS.clear(); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); } - SCHEDULED_BLOOM_RENDERS.clear(); } private static void draw(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, @@ -305,23 +309,33 @@ private static void draw(@NotNull PoseStack poseStack, @NotNull BufferBuilder bu } private static void postDraw() { - for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext();) { - List list = it.next(); - - if (!list.isEmpty()) { - if (!list.removeIf(ticket -> { - ticket.checkValidity(); - return !ticket.isValid(); - }) || !list.isEmpty()) continue; - } + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext();) { + List list = it.next(); + + if (!list.isEmpty()) { + if (!list.removeIf(ticket -> { + ticket.checkValidity(); + return !ticket.isValid(); + }) || !list.isEmpty()) continue; + } - it.remove(); + it.remove(); + } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); } } public static void finishBloomBuffer(SectionPos pos, BufferBuilder builder) { BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); - if (buffer != null) { + if (buffer == null) { + return; + } + + BLOOM_RENDER_LOCK.writeLock().lock(); + try { BLOOM_BUFFER_BUILDERS.remove(pos, builder); BLOOM_BUFFER_SORT_STATES.put(pos, builder.getSortState()); @@ -336,6 +350,8 @@ public static void finishBloomBuffer(SectionPos pos, BufferBuilder builder) { BloomUtil.uploadBloomBuffer(buffer, vertexBuffer); }); } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); } } @@ -348,15 +364,22 @@ public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, Verte } public static void removeBloomChunk(SectionPos origin) { - BLOOM_BUFFER_BUILDERS.remove(origin); - BLOOM_BUFFER_SORT_STATES.remove(origin); - VertexBuffer buffer = BLOOM_BUFFERS.remove(origin); - if (buffer != null) { - if (!RenderSystem.isOnRenderThread()) { - RenderSystem.recordRenderCall(buffer::close); - } else { - buffer.close(); + BLOOM_RENDER_LOCK.writeLock().lock(); + + try { + BLOOM_BUFFER_BUILDERS.remove(origin); + BLOOM_BUFFER_SORT_STATES.remove(origin); + VertexBuffer buffer = BLOOM_BUFFERS.remove(origin); + + if (buffer != null) { + if (!RenderSystem.isOnRenderThread()) { + RenderSystem.recordRenderCall(buffer::close); + } else { + buffer.close(); + } } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); } } @@ -428,30 +451,32 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { ShaderInstance shader = setupShaderUniforms(poseStack, projectionMatrix); Uniform chunkOffsetUniform = shader.CHUNK_OFFSET; - for (var entry : BLOOM_BUFFERS.entrySet()) { - SectionPos pos = entry.getKey(); - VertexBuffer buffer = entry.getValue(); - - // return early if buffer is invalid or has no vertex data bound - // VertexBuffer#mode's nullness is the easiest way to check this. - if (buffer.isInvalid() || ((VertexBufferAccessor) buffer).getMode() == null) { - continue; - } - if (chunkOffsetUniform != null) { - chunkOffsetUniform.set(SectionPos.sectionToBlockCoord(pos.getX()) - (float) camPos.x(), - SectionPos.sectionToBlockCoord(pos.getY()) - (float) camPos.y(), - SectionPos.sectionToBlockCoord(pos.getZ()) - (float) camPos.z()); - chunkOffsetUniform.upload(); - } + BLOOM_RENDER_LOCK.readLock().lock(); + try { + for (var entry : BLOOM_BUFFERS.entrySet()) { + SectionPos pos = entry.getKey(); + VertexBuffer buffer = entry.getValue(); + + // return early if buffer is invalid or has no vertex data bound + // VertexBuffer#mode's nullness is the easiest way to check this. + if (buffer.isInvalid() || ((VertexBufferAccessor) buffer).getMode() == null) { + continue; + } - buffer.bind(); - buffer.draw(); - } + if (chunkOffsetUniform != null) { + chunkOffsetUniform.set(SectionPos.sectionToBlockCoord(pos.getX()) - (float) camPos.x(), + SectionPos.sectionToBlockCoord(pos.getY()) - (float) camPos.y(), + SectionPos.sectionToBlockCoord(pos.getZ()) - (float) camPos.z()); + chunkOffsetUniform.upload(); + } - poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - poseStack.translate(-camPos.x(), -camPos.y(), -camPos.z()); + buffer.bind(); + buffer.draw(); + } + } finally { + BLOOM_RENDER_LOCK.readLock().unlock(); + } if (chunkOffsetUniform != null) { chunkOffsetUniform.set(0, 0, 0); From e5cbc9c33e0c9fa6f71e1f2484624146dcb1671b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 19:46:59 +0300 Subject: [PATCH 144/269] Nullability annotations --- .../gtceu/client/bloom/BloomUtil.java | 53 ++++++++----------- .../client/bloom/EffectRenderContext.java | 9 ++-- .../gtceu/client/bloom/IBloomEffect.java | 6 +-- .../gtceu/client/bloom/IRenderSetup.java | 4 +- .../gtceu/client/bloom/package-info.java | 4 ++ .../client/particle/GTOverheatParticle.java | 33 ++++++------ .../gtceu/client/particle/GTParticle.java | 6 +-- .../client/particle/GTParticleManager.java | 14 +++-- .../gtceu/client/particle/package-info.java | 4 ++ 9 files changed, 60 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/client/particle/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 6de39781a1f..cf31cdff680 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -29,8 +29,8 @@ import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import org.joml.Matrix4f; import java.util.*; @@ -44,7 +44,7 @@ @OnlyIn(Dist.CLIENT) public class BloomUtil { - private static final Map> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); + private static final Map<@Nullable IRenderSetup, List> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); @@ -74,22 +74,20 @@ public static void init() {} * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null || blockEntity == null} */ - @NotNull - public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull IBloomEffect render, - @NotNull BlockEntity blockEntity) { + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, IBloomEffect render, + BlockEntity blockEntity) { Objects.requireNonNull(blockEntity, "blockEntity == null"); return registerBloomRender(setup, new IBloomEffect() { @Override - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, - @NotNull EffectRenderContext context) { + public void renderBloomEffect(PoseStack poseStack, BufferBuilder buffer, + EffectRenderContext context) { render.renderBloomEffect(poseStack, buffer, context); } @Override - public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { + public boolean shouldRenderBloomEffect(EffectRenderContext context) { return blockEntity.getLevel() == context.getRenderViewEntity().level() && render.shouldRenderBloomEffect(context); } @@ -115,10 +113,8 @@ public boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { * @return Ticket for the registered bloom render callback * @throws NullPointerException if {@code bloomType == null || render == null || metaTileEntity == null} */ - @NotNull - public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull IBloomEffect render, - @NotNull GTParticle particle) { + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, IBloomEffect render, + GTParticle particle) { Objects.requireNonNull(particle, "particle == null"); return registerBloomRender(setup, render, t -> particle.isAlive()); } @@ -143,9 +139,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup * @see #registerBloomRender(IRenderSetup, IBloomEffect, GTParticle) * @see #registerBloomRender(IRenderSetup, IBloomEffect, Predicate, Supplier) */ - @NotNull - public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull IBloomEffect render, + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, IBloomEffect render, @Nullable Predicate validityChecker) { return registerBloomRender(setup, render, validityChecker, null); } @@ -172,11 +166,9 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup * @see #registerBloomRender(IRenderSetup, IBloomEffect, BlockEntity) * @see #registerBloomRender(IRenderSetup, IBloomEffect, GTParticle) */ - @NotNull - public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, - @NotNull IBloomEffect render, + public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, IBloomEffect render, @Nullable Predicate validityChecker, - @Nullable Supplier worldContext) { + @Nullable Supplier<@Nullable Level> worldContext) { if (!GTShaders.canUseBloomShader()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, render, validityChecker, worldContext); @@ -194,7 +186,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup * * @param level the level that was unloaded */ - public static void invalidateLevelTickets(@NotNull LevelAccessor level) { + public static void invalidateLevelTickets(LevelAccessor level) { Objects.requireNonNull(level, "level == null"); BLOOM_RENDER_LOCK.readLock().lock(); try { @@ -282,8 +274,8 @@ private static void preDraw() { } } - private static void draw(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, - @NotNull EffectRenderContext context, @NotNull List tickets) { + private static void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context, + List tickets) { boolean initialized = false; @Nullable IRenderSetup renderSetup = null; @@ -528,24 +520,21 @@ public static final class BloomRenderTicket { public static final BloomRenderTicket INVALID = new BloomRenderTicket(); - @Nullable - private final IRenderSetup renderSetup; + private final @Nullable IRenderSetup renderSetup; private final IBloomEffect render; - @Nullable - private final Predicate validityChecker; - @Nullable - private final Supplier worldContext; + private final @Nullable Predicate validityChecker; + private final @Nullable Supplier<@Nullable Level> worldContext; private boolean invalidated; - BloomRenderTicket() { + private BloomRenderTicket() { this(null, (p, b, c) -> {}, null, null); this.invalidated = true; } - BloomRenderTicket(@Nullable IRenderSetup renderSetup, @NotNull IBloomEffect render, + BloomRenderTicket(@Nullable IRenderSetup renderSetup, IBloomEffect render, @Nullable Predicate validityChecker, - @Nullable Supplier worldContext) { + @Nullable Supplier<@Nullable Level> worldContext) { this.renderSetup = renderSetup; this.render = Objects.requireNonNull(render, "render == null"); this.validityChecker = validityChecker; diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java index 5d7aa9c344a..fe82f7e7363 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.client.bloom; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.util.Mth; @@ -8,8 +9,8 @@ import lombok.Getter; import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import java.util.Objects; @@ -28,12 +29,11 @@ public static EffectRenderContext getInstance() { @Getter private Frustum frustum = new Frustum(Minecraft.getInstance().levelRenderer.getFrustum()); - @Nullable - private Entity renderViewEntity; + private @Nullable Entity renderViewEntity; @Getter private float partialTicks; @Getter - private Vec3 camPos; + private @UnknownNullability Vec3 camPos; @Getter private float rotationX; @Getter @@ -69,7 +69,6 @@ public EffectRenderContext update(@NotNull Entity renderViewEntity, Vec3 camPos, /** * @return render view entity */ - @NotNull public Entity getRenderViewEntity() { return Objects.requireNonNull(renderViewEntity, "renderViewEntity not available yet"); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java index 8bfb6db8a05..7b65014843c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java @@ -6,7 +6,6 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; -import org.jetbrains.annotations.NotNull; /** * Render callback interface for {@link BloomUtil#registerBloomRender(IRenderSetup, IBloomEffect, BlockEntity)}. @@ -21,8 +20,7 @@ public interface IBloomEffect { * @param context render context */ @OnlyIn(Dist.CLIENT) - void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, - @NotNull EffectRenderContext context); + void renderBloomEffect(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context); /** * @param context render context @@ -30,7 +28,7 @@ void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buff * {@link #renderBloomEffect(PoseStack, BufferBuilder, EffectRenderContext)}. */ @OnlyIn(Dist.CLIENT) - default boolean shouldRenderBloomEffect(@NotNull EffectRenderContext context) { + default boolean shouldRenderBloomEffect(EffectRenderContext context) { return true; } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java index eacba5c987f..79d072946f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java @@ -10,12 +10,12 @@ public interface IRenderSetup { * * @param buffer Buffer builder */ - void preDraw(@NotNull BufferBuilder buffer); + void preDraw(BufferBuilder buffer); /** * Run any post render gl code here. * * @param buffer Buffer builder */ - void postDraw(@NotNull BufferBuilder buffer); + void postDraw(BufferBuilder buffer); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/package-info.java new file mode 100644 index 00000000000..70a443e69ae --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.client.bloom; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java index 21b656e148a..b3e77131720 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTOverheatParticle.java @@ -18,7 +18,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -143,7 +142,7 @@ public static int getBlackBodyColor(int temperature) { return RenderUtil.interpolateColor(color, blackBodyColors[index + 1], temperature % 200 / 200f); } - private final CableBlockEntity tileEntity; + private final CableBlockEntity blockEntity; protected final int meltTemp; protected int temperature = 293; @@ -153,10 +152,9 @@ public static int getBlackBodyColor(int temperature) { protected float alpha = 0; protected int color = blackBodyColors[0]; - public GTOverheatParticle(@NotNull CableBlockEntity tileEntity, int meltTemp, - @NotNull VoxelShape pipeBoxes, boolean insulated) { - super(tileEntity.getBlockPos().getX(), tileEntity.getBlockPos().getY(), tileEntity.getBlockPos().getZ()); - this.tileEntity = tileEntity; + public GTOverheatParticle(CableBlockEntity blockEntity, int meltTemp, VoxelShape pipeBoxes, boolean insulated) { + super(blockEntity.getBlockPos().getX(), blockEntity.getBlockPos().getY(), blockEntity.getBlockPos().getZ()); + this.blockEntity = blockEntity; this.meltTemp = meltTemp; this.pipeBoxes = pipeBoxes; updatePipeBoxes(pipeBoxes); @@ -180,7 +178,7 @@ public void setTemperature(int temperature) { color = getBlackBodyColor(temperature); } - public void updatePipeBoxes(@NotNull VoxelShape pipeBoxes) { + public void updatePipeBoxes(VoxelShape pipeBoxes) { List boxes = pipeBoxes.toAabbs(); this.pipeBoxes = boxes.stream() .map(aabb -> aabb.inflate(0.001)) @@ -191,9 +189,9 @@ public void updatePipeBoxes(@NotNull VoxelShape pipeBoxes) { @Override public void onUpdate() { - if (tileEntity.isRemoved() || !tileEntity.isParticleAlive()) { + if (blockEntity.isRemoved() || !blockEntity.isParticleAlive()) { setExpired(); - tileEntity.killParticle(); + blockEntity.killParticle(); return; } @@ -217,19 +215,19 @@ public void onUpdate() { } private void spawnSmoke() { - BlockPos pos = tileEntity.getBlockPos(); + BlockPos pos = blockEntity.getBlockPos(); float xPos = pos.getX() + 0.5F; float yPos = pos.getY() + 0.9F; float zPos = pos.getZ() + 0.5F; - float ySpd = 0.3F + 0.1F * GTValues.RNG.nextFloat(); - tileEntity.getLevel().addParticle(ParticleTypes.LARGE_SMOKE, xPos, yPos, zPos, 0, ySpd, 0); + float ySpd = 0.3F + 0.1F * blockEntity.getLevel().random.nextFloat(); + blockEntity.getLevel().addParticle(ParticleTypes.LARGE_SMOKE, xPos, yPos, zPos, 0, ySpd, 0); } @Override public String toString() { return "GTOverheatParticle{" + - "tileEntity=" + tileEntity + + "tileEntity=" + blockEntity + ", pipeBoxes=" + pipeBoxes + ", insulated=" + insulated + ", alpha=" + alpha + @@ -243,7 +241,7 @@ public String toString() { } @Override - public boolean shouldRender(@NotNull EffectRenderContext context) { + public boolean shouldRender(EffectRenderContext context) { if (this.insulated) return false; for (AABB cuboid : pipeBoxes.toAabbs()) { if (!context.frustum().isVisible(cuboid.move(posX, posY, posZ))) { @@ -258,8 +256,7 @@ public boolean shouldRender(@NotNull EffectRenderContext context) { return SETUP; } - public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, - @NotNull EffectRenderContext context) { + public void renderBloomEffect(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) { float red = ((color >> 16) & 0xFF) / 255f; float green = ((color >> 8) & 0xFF) / 255f; float blue = (color & 0xFF) / 255f; @@ -276,7 +273,7 @@ public void renderBloomEffect(@NotNull PoseStack poseStack, @NotNull BufferBuild @Override @OnlyIn(Dist.CLIENT) - public void preDraw(@NotNull BufferBuilder buffer) { + public void preDraw(BufferBuilder buffer) { RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.enableBlend(); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); @@ -284,7 +281,7 @@ public void preDraw(@NotNull BufferBuilder buffer) { @Override @OnlyIn(Dist.CLIENT) - public void postDraw(@NotNull BufferBuilder buffer) { + public void postDraw(BufferBuilder buffer) { BufferUploader.drawWithShader(buffer.end()); RenderSystem.disableBlend(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java index 9d2f468043c..b7162675b95 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticle.java @@ -9,7 +9,6 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -47,7 +46,7 @@ protected GTParticle(double posX, double posY, double posZ) { this.posZ = posZ; } - public boolean shouldRender(@NotNull EffectRenderContext context) { + public boolean shouldRender(EffectRenderContext context) { if (squaredRenderRange < 0) return true; return context.getRenderViewEntity().getEyePosition(context.partialTicks()) .distanceToSqr(posX, posY, posZ) <= squaredRenderRange; @@ -105,8 +104,7 @@ protected void onExpired() {} * @param context render context */ @OnlyIn(Dist.CLIENT) - public void renderParticle(@NotNull PoseStack poseStack, @NotNull BufferBuilder buffer, - @NotNull EffectRenderContext context) {} + public void renderParticle(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) {} /** * @return Render setup for this particle, if exists diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 8e25d884cfb..2e6526a92fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -24,7 +24,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -42,7 +41,7 @@ public class GTParticleManager { private final List newParticleQueue = new ArrayList<>(); - public void addEffect(@NotNull GTParticle particles) { + public void addEffect(GTParticle particles) { newParticleQueue.add(particles); } @@ -69,7 +68,7 @@ public void updateEffects() { } } - private void updateQueue(Map> renderQueue) { + private void updateQueue(Map<@Nullable IRenderSetup, ArrayDeque> renderQueue) { Iterator> it = renderQueue.values().iterator(); while (it.hasNext()) { ArrayDeque particles = it.next(); @@ -116,8 +115,7 @@ public void clearAllEffects(boolean cleanNewQueue) { depthDisabledParticles.clear(); } - public void renderParticles(@NotNull PoseStack poseStack, @NotNull Entity renderViewEntity, Camera camera, - Frustum frustum, float partialTicks) { + public void renderParticles(PoseStack poseStack, Camera camera, Frustum frustum, float partialTicks) { if (depthEnabledParticles.isEmpty() && depthDisabledParticles.isEmpty()) return; EffectRenderContext instance = EffectRenderContext.getInstance() @@ -136,9 +134,9 @@ public void renderParticles(@NotNull PoseStack poseStack, @NotNull Entity render RenderSystem.disableBlend(); } - private static void renderParticlesInLayer(@NotNull PoseStack poseStack, - @NotNull Map<@Nullable IRenderSetup, ArrayDeque> renderQueue, - @NotNull EffectRenderContext context) { + private static void renderParticlesInLayer(PoseStack poseStack, + Map<@Nullable IRenderSetup, ArrayDeque> renderQueue, + EffectRenderContext context) { for (var entry : renderQueue.entrySet()) { IRenderSetup handler = entry.getKey(); ArrayDeque particles = entry.getValue(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/package-info.java b/src/main/java/com/gregtechceu/gtceu/client/particle/package-info.java new file mode 100644 index 00000000000..4f3e9248862 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.client.particle; + +import org.jetbrains.annotations.NotNullByDefault; From 764cdac3b7e96e1806f3e79a8060463e3f6104ff Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 19:48:16 +0300 Subject: [PATCH 145/269] Formatting changes --- .../gregtechceu/gtceu/client/ClientProxy.java | 2 +- .../gtceu/client/bloom/BloomUtil.java | 24 ++--- .../client/bloom/EffectRenderContext.java | 13 ++- .../client/particle/GTParticleManager.java | 87 ++++++++++--------- 4 files changed, 62 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index cc902b2dfad..99323340bae 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -189,7 +189,7 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { } @SubscribeEvent - public void onRegisterShaders(RegisterShadersEvent event) { + public void registerShaders(RegisterShadersEvent event) { GTShaders.onRegisterShaders(event); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index cf31cdff680..117bb7256f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -58,15 +58,13 @@ public class BloomUtil { public static void init() {} /** - *

* Register a custom bloom render callback for subsequent world render. The render call persists until the * {@code blockEntity} is invalidated, or the world associated with {@code blockEntity} or the ticket is * manually freed by calling {@link BloomRenderTicket#invalidate()}. - *

+ * *

* This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. - *

* * @param setup Render setup, if exists * @param render Rendering callback @@ -97,15 +95,13 @@ public boolean shouldRenderBloomEffect(EffectRenderContext context) { } /** - *

* Register a custom bloom render callback for subsequent world render. The render call persists until the * {@code particle} is invalidated, or the ticket is manually freed by calling * {@link BloomRenderTicket#invalidate()}. - *

+ * *

* This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. - *

* * @param setup Render setup, if exists * @param render Rendering callback @@ -120,14 +116,12 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup } /** - *

* Register a custom bloom render callback for subsequent world render. The render call persists until it is * manually freed by calling {@link BloomRenderTicket#invalidate()}, or invalidated by validity checker. - *

+ * *

* This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. - *

* * @param setup Render setup, if exists * @param render Rendering callback @@ -145,14 +139,12 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup } /** - *

* Register a custom bloom render callback for subsequent world render. The render call persists until it is * manually freed by calling {@link BloomRenderTicket#invalidate()}, or invalidated by validity checker. - *

+ * *

* This method does not register bloom render ticket when Iris/Oculus is present, and an invalid ticket will be * returned instead. - *

* * @param setup Render setup, if exists * @param render Rendering callback @@ -275,16 +267,15 @@ private static void preDraw() { } private static void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context, - List tickets) { + @Nullable IRenderSetup renderSetup, List tickets) { boolean initialized = false; - @Nullable - IRenderSetup renderSetup = null; + for (BloomRenderTicket ticket : tickets) { ticket.checkValidity(); if (!ticket.isValid() || !ticket.render.shouldRenderBloomEffect(context)) continue; + if (!initialized) { initialized = true; - renderSetup = ticket.renderSetup; if (renderSetup != null) { renderSetup.preDraw(buffer); } @@ -295,6 +286,7 @@ private static void draw(PoseStack poseStack, BufferBuilder buffer, EffectRender ticket.render.renderBloomEffect(poseStack, buffer, context); poseStack.popPose(); } + if (initialized && renderSetup != null) { renderSetup.postDraw(buffer); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java index fe82f7e7363..0b8826acc20 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/EffectRenderContext.java @@ -45,16 +45,15 @@ public static EffectRenderContext getInstance() { @Getter private float rotationXZ; - @NotNull - public EffectRenderContext update(@NotNull Entity renderViewEntity, Vec3 camPos, - Frustum frustum, float partialTicks) { - this.renderViewEntity = renderViewEntity; - this.camPos = camPos; + public EffectRenderContext update(Camera camera, Frustum frustum, float partialTicks) { + this.renderViewEntity = camera.getEntity(); + this.camPos = camera.getPosition(); this.partialTicks = partialTicks; float i = Minecraft.getInstance().options.getCameraType().isFirstPerson() ? 1 : -1; - float pitch = renderViewEntity.getYRot(); - float yaw = renderViewEntity.getXRot(); + float pitch = camera.getYRot(); + float yaw = camera.getXRot(); + this.rotationX = Mth.cos(yaw * Mth.DEG_TO_RAD) * i; this.rotationZ = Mth.sin(yaw * Mth.DEG_TO_RAD) * i; this.rotationYZ = -this.rotationX * Mth.sin(pitch * Mth.DEG_TO_RAD) * i; diff --git a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java index 2e6526a92fb..cf2c5ae5380 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/particle/GTParticleManager.java @@ -46,15 +46,16 @@ public void addEffect(GTParticle particles) { } public void updateEffects() { - if (!depthEnabledParticles.isEmpty()) { - updateQueue(depthEnabledParticles); + if (!this.depthEnabledParticles.isEmpty()) { + updateQueue(this.depthEnabledParticles); } - if (!depthDisabledParticles.isEmpty()) { - updateQueue(depthDisabledParticles); + if (!this.depthDisabledParticles.isEmpty()) { + updateQueue(this.depthDisabledParticles); } + if (!newParticleQueue.isEmpty()) { for (GTParticle particle : newParticleQueue) { - var queue = particle.shouldDisableDepth() ? depthDisabledParticles : depthEnabledParticles; + var queue = particle.shouldDisableDepth() ? this.depthDisabledParticles : this.depthEnabledParticles; ArrayDeque particles = queue.computeIfAbsent(particle.getRenderSetup(), setup -> new ArrayDeque<>()); @@ -64,6 +65,7 @@ public void updateEffects() { } particles.add(particle); } + newParticleQueue.clear(); } } @@ -71,24 +73,26 @@ public void updateEffects() { private void updateQueue(Map<@Nullable IRenderSetup, ArrayDeque> renderQueue) { Iterator> it = renderQueue.values().iterator(); while (it.hasNext()) { - ArrayDeque particles = it.next(); + ArrayDeque particlesForSetup = it.next(); + + Iterator particles = particlesForSetup.iterator(); + while (particles.hasNext()) { + GTParticle particle = particles.next(); - Iterator it2 = particles.iterator(); - while (it2.hasNext()) { - GTParticle particle = it2.next(); if (particle.isAlive()) { try { particle.onUpdate(); } catch (RuntimeException exception) { - GTCEu.LOGGER.error("particle update error: {}", particle, exception); + GTCEu.LOGGER.error("Particle update error: {}", particle, exception); particle.setExpired(); } if (particle.isAlive()) continue; } - it2.remove(); + + particles.remove(); } - if (particles.isEmpty()) { + if (particlesForSetup.isEmpty()) { it.remove(); } } @@ -96,40 +100,40 @@ private void updateQueue(Map<@Nullable IRenderSetup, ArrayDeque> ren public void clearAllEffects(boolean cleanNewQueue) { if (cleanNewQueue) { - for (GTParticle particle : newParticleQueue) { + for (GTParticle particle : this.newParticleQueue) { particle.setExpired(); } - newParticleQueue.clear(); + this.newParticleQueue.clear(); } - for (ArrayDeque particles : depthEnabledParticles.values()) { + for (ArrayDeque particles : this.depthEnabledParticles.values()) { for (GTParticle particle : particles) { particle.setExpired(); } } - for (ArrayDeque particles : depthDisabledParticles.values()) { + for (ArrayDeque particles : this.depthDisabledParticles.values()) { for (GTParticle particle : particles) { particle.setExpired(); } } - depthEnabledParticles.clear(); - depthDisabledParticles.clear(); + this.depthEnabledParticles.clear(); + this.depthDisabledParticles.clear(); } public void renderParticles(PoseStack poseStack, Camera camera, Frustum frustum, float partialTicks) { - if (depthEnabledParticles.isEmpty() && depthDisabledParticles.isEmpty()) return; + if (this.depthEnabledParticles.isEmpty() && this.depthDisabledParticles.isEmpty()) return; EffectRenderContext instance = EffectRenderContext.getInstance() - .update(renderViewEntity, camera.getPosition(), frustum, partialTicks); + .update(camera, frustum, partialTicks); RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - if (!depthDisabledParticles.isEmpty()) { + if (!this.depthDisabledParticles.isEmpty()) { RenderSystem.depthMask(false); - renderParticlesInLayer(poseStack, depthDisabledParticles, instance); + renderParticlesInLayer(poseStack, this.depthDisabledParticles, instance); RenderSystem.depthMask(true); } - renderParticlesInLayer(poseStack, depthEnabledParticles, instance); + renderParticlesInLayer(poseStack, this.depthEnabledParticles, instance); RenderSystem.disableBlend(); } @@ -138,26 +142,29 @@ private static void renderParticlesInLayer(PoseStack poseStack, Map<@Nullable IRenderSetup, ArrayDeque> renderQueue, EffectRenderContext context) { for (var entry : renderQueue.entrySet()) { - IRenderSetup handler = entry.getKey(); ArrayDeque particles = entry.getValue(); if (particles.isEmpty()) continue; + IRenderSetup handler = entry.getKey(); boolean initialized = false; + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); for (GTParticle particle : particles) { - if (particle.shouldRender(context)) { - try { - if (!initialized) { - initialized = true; - if (handler != null) { - handler.preDraw(buffer); - } + if (!particle.shouldRender(context)) { + continue; + } + try { + if (!initialized) { + initialized = true; + if (handler != null) { + handler.preDraw(buffer); } - particle.renderParticle(poseStack, buffer, context); - } catch (Throwable throwable) { - GTCEu.LOGGER.error("particle render error: {}", particle, throwable); - particle.setExpired(); } + particle.renderParticle(poseStack, buffer, context); + + } catch (Throwable throwable) { + GTCEu.LOGGER.error("Particle render error: {}", particle, throwable); + particle.setExpired(); } } if (initialized && handler != null) { @@ -196,8 +203,8 @@ public static void renderWorld(RenderLevelStageEvent event) { entity = Minecraft.getInstance().player; } if (entity != null) { - INSTANCE.renderParticles(event.getPoseStack(), entity, - event.getCamera(), event.getFrustum(), event.getPartialTick()); + INSTANCE.renderParticles(event.getPoseStack(), event.getCamera(), event.getFrustum(), + event.getPartialTick()); } } } @@ -214,10 +221,10 @@ public static void debugOverlay(CustomizeGuiOverlayEvent.DebugText event) { } private static int count(Map<@Nullable IRenderSetup, ArrayDeque> renderQueue) { - int g = 0; + int total = 0; for (Deque queue : renderQueue.values()) { - g += queue.size(); + total += queue.size(); } - return g; + return total; } } From be2f851819bb8ea50884f1840ef984385e14724e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 19:52:28 +0300 Subject: [PATCH 146/269] Oops, forgot to commit these in 8d4c158a --- .../gtceu/client/ClientEventListener.java | 5 ++-- .../gregtechceu/gtceu/client/ClientProxy.java | 4 +-- .../core/mixins/client/RebuildTaskMixin.java | 30 ------------------- .../embeddium/GTEmbeddiumCompat.java | 9 ++++++ .../embeddium/renderer/BloomMeshAppender.java | 14 ++++----- src/main/resources/gtceu.mixins.json | 1 - 6 files changed, 19 insertions(+), 44 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java index 5a84e9b1d50..3d688d82279 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java @@ -31,6 +31,7 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.ChunkAccess; @@ -89,9 +90,9 @@ public static void onChunkUnloadEvent(ChunkEvent.Unload event) { return; } - BlockPos.MutableBlockPos chunkPos = chunk.getPos().getWorldPosition().mutable(); + ChunkPos chunkPos = chunk.getPos(); for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { - BloomUtil.removeBloomChunk(chunkPos.setY(SectionPos.sectionToBlockCoord(y))); + BloomUtil.removeBloomChunk(SectionPos.of(chunkPos, y)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 99323340bae..209b1e7dc8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -15,6 +15,7 @@ import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; import com.gregtechceu.gtceu.client.particle.HazardParticle; import com.gregtechceu.gtceu.client.particle.MufflerParticle; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.block.MaterialBlockRenderer; import com.gregtechceu.gtceu.client.renderer.block.OreBlockRenderer; import com.gregtechceu.gtceu.client.renderer.block.SurfaceRockRenderer; @@ -65,7 +66,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraftforge.client.event.*; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -94,7 +94,7 @@ public static void init() { BloomUtil.init(); if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { - MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); + GTEmbeddiumCompat.init(); } } initializeDynamicRenders(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java deleted file mode 100644 index a166f057090..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RebuildTaskMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client; - -import com.gregtechceu.gtceu.client.bloom.BloomUtil; - -import net.minecraft.client.renderer.ChunkBufferBuilderPack; -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; -import net.minecraft.core.BlockPos; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") -public class RebuildTaskMixin { - - @Shadow(aliases = { "this$1", "f_290687_", "f" }) - @Final - ChunkRenderDispatcher.RenderChunk this$1; - - @Inject(method = "compile", at = @At(value = "HEAD")) - private void gtceu$startBloomBufferForChunk(float x, float y, float z, - ChunkBufferBuilderPack chunkBufferBuilderPack, - CallbackInfoReturnable cir) { - BlockPos pos = this.this$1.getOrigin(); - BloomUtil.CURRENT_RENDERING_CHUNK_POS.set(pos); - } -} 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 4c7b094efe6..d006e068297 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,15 +1,24 @@ package com.gregtechceu.gtceu.integration.embeddium; +import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { + public static void init() { + MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); + } @SubscribeEvent public static void registerChunkMeshAppenders(ChunkMeshEvent event) { + if (!GTShaders.canUseBloomShader()) { + return; + } + event.addMeshAppender(BloomMeshAppender.INSTANCE); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index a1bbf4e3e16..b008205d0e0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -1,10 +1,9 @@ package com.gregtechceu.gtceu.integration.embeddium.renderer; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.shader.GTShaders; import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.world.phys.Vec3; import org.embeddedt.embeddium.api.MeshAppender; @@ -15,16 +14,13 @@ public class BloomMeshAppender implements MeshAppender { @Override public void render(Context context) { - if (!GTShaders.canUseBloomShader()) { - return; - } - BlockPos chunkOrigin = context.sectionOrigin().origin(); - if (!BloomUtil.BLOOM_BUFFER_BUILDERS.containsKey(chunkOrigin)) { + SectionPos sectionOrigin = context.sectionOrigin(); + if (!BloomUtil.BLOOM_BUFFER_BUILDERS.containsKey(sectionOrigin)) { return; } Vec3 camPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); - BloomUtil.CURRENT_RENDERING_CHUNK_POS.set(chunkOrigin); - BloomUtil.bakeBloomChunkBuffers(chunkOrigin, camPos); + BloomUtil.CURRENT_RENDERING_SECTION.set(sectionOrigin); + BloomUtil.bakeBloomChunkBuffers(sectionOrigin, camPos); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index a1135e7a917..b270271220d 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -24,7 +24,6 @@ "client.PlayerInfoAccessor", "client.PostChainAccessor", "client.PostChainMixin", - "client.RebuildTaskMixin", "client.VariantDeserializerMixin", "client.VertexBufferAccessor", "dev.client.KeyboardHandlerMixin", From acbe9fb16e10611bb384f9ddf83d410b7fff305c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 19:53:22 +0300 Subject: [PATCH 147/269] Depend on a maven release of embeddium that has sources --- gradle/forge.versions.toml | 4 ++-- gradle/scripts/repositories.gradle | 9 ++++++--- .../gtceu/integration/embeddium/GTEmbeddiumCompat.java | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index 51f1f825a7a..60c998e8480 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -30,7 +30,7 @@ xaerosMinimap = "25.3.10" ## modrinth maven ## jade = "11.6.3" -embeddium = "0.3.31+mc1.20.1" +embeddium = "0.3.32-beta.57+mc1.20.1" oculus = "1.20.1-1.8.0" modernfix = "DdUByV9S" # 5.24.1+mc1.20.1 @@ -86,7 +86,7 @@ ftbteams = { module = "dev.ftb.mods:ftb-teams-forge", version.ref = " ftbquests = { module = "dev.ftb.mods:ftb-quests-forge", version.ref = "ftbquests" } ftbchunks = { module = "dev.ftb.mods:ftb-chunks-forge", version.ref = "ftbchunks" } jade = { module = "maven.modrinth:jade", version.ref = "jade" } -embeddium = { module = "maven.modrinth:embeddium", version.ref = "embeddium" } +embeddium = { module = "org.embeddedt:embeddium-1.20.1", version.ref = "embeddium" } oculus = { module = "maven.modrinth:oculus", version.ref = "oculus" } modernfix = { module = "maven.modrinth:modernfix", version.ref = "modernfix" } xaeroslib = { module = "xaero.lib:xaerolib-forge-1.20.1", version.ref = "xaerosLib" } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index af99824227d..c3bceaabbe5 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -12,9 +12,12 @@ repositories { } } - maven { // JEI - name = "Jared's Maven" - url = "https://maven.blamejared.com/" + exclusiveContent { // Create, Ponder, Flywheel + forRepository { maven { url = "https://maven.blamejared.com" } } + filter { + includeGroup("mezz.jei") + includeGroup("org.embeddedt") + } } maven { // JEI mirror, AE2 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 d006e068297..51e2a978db0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -9,6 +9,7 @@ import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { + public static void init() { MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); } From 879b63e7c90a8f7b3c9269b1949da1f082baee0c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:09:07 +0300 Subject: [PATCH 148/269] Non bloom things --- injected_interfaces/interfaces.json | 3 + .../renderer/block/FluidBlockRenderer.java | 97 ++++++++----------- .../machine/impl/FluidAreaRender.java | 2 +- .../machine/impl/QuantumTankFluidRender.java | 8 +- .../gtceu/client/util/RenderBufferHelper.java | 25 ++--- .../gtceu/client/util/RenderUtil.java | 32 ++++-- .../gtceu/core/IGTVertexConsumer.java | 22 +++++ .../gregtechceu/gtceu/core/MixinHelpers.java | 6 ++ .../mixins/client/VertexConsumerMixin.java | 10 ++ src/main/resources/gtceu.mixins.json | 1 + 10 files changed, 123 insertions(+), 83 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java diff --git a/injected_interfaces/interfaces.json b/injected_interfaces/interfaces.json index 1ab154b3032..36e97d0ced9 100644 --- a/injected_interfaces/interfaces.json +++ b/injected_interfaces/interfaces.json @@ -2,6 +2,9 @@ "net/minecraft/client/renderer/block/model/BakedQuad": [ "com/gregtechceu/gtceu/core/IGTBakedQuad" ], + "com/mojang/blaze3d/vertex/VertexConsumer": [ + "com/gregtechceu/gtceu/core/IGTVertexConsumer" + ], "net/minecraft/world/entity/Entity": [ "com/gregtechceu/gtceu/core/IFireImmuneEntity", "com/gregtechceu/gtceu/core/IBreathingEntity" diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java index 747bd2f2d79..c5a378d2518 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/FluidBlockRenderer.java @@ -1,10 +1,12 @@ package com.gregtechceu.gtceu.client.renderer.block; import com.gregtechceu.gtceu.client.util.RenderUtil; +import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.lighting.LightEngine; import net.minecraft.world.level.material.Fluid; import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; @@ -16,13 +18,13 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Data; import lombok.Getter; +import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; import org.joml.Vector3fc; import java.util.*; import static com.gregtechceu.gtceu.client.util.RenderUtil.*; -import static net.minecraft.util.FastColor.ARGB32.*; public class FluidBlockRenderer { @@ -53,27 +55,24 @@ public Vector3f[] transformVertices(Vector3fc[] vertices, Direction face) { } public void drawBlocks(Set offsets, PoseStack poseStack, VertexConsumer consumer, - Fluid fluid, - RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { + Fluid fluid, RenderUtil.FluidTextureType texture, + int combinedOverlay, int combinedLight) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); int color = fluidClientInfo.getTintColor(); - int r = red(color), g = green(color), b = blue(color), a = alpha(color); for (var pos : offsets) { poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - for (var direction : Direction.values()) { + for (var direction : GTUtil.DIRECTIONS) { if (offsets.contains(pos.relative(direction))) continue; - if (direction != Direction.UP && direction != Direction.DOWN) direction = direction.getOpposite(); + if (direction.getAxis() != Direction.Axis.Y) direction = direction.getOpposite(); + drawFace(poseStack.last(), consumer, - transformVertices(getVertices(direction), direction), - getNormal(direction), - u0, u1, v0, v1, - r, g, b, a, - combinedOverlay, combinedLight); + transformVertices(getVertices(direction), direction), getNormal(direction), + u0, u1, v0, v1, color, combinedOverlay, combinedLight); } poseStack.popPose(); } @@ -82,28 +81,31 @@ public void drawBlocks(Set offsets, PoseStack poseStack, VertexConsume public void drawPlanes(Direction[] faces, Map> directionalOffsets, PoseStack poseStack, VertexConsumer consumer, Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { - for (var face : faces) { + for (Direction face : faces) { if (!directionalOffsets.containsKey(face)) continue; - drawPlane(face, directionalOffsets.get(face), poseStack, consumer, fluid, texture, combinedOverlay, - combinedLight); + + drawPlane(face, directionalOffsets.get(face), poseStack, consumer, + fluid, texture, combinedOverlay, combinedLight); } } - public void drawPlane(Direction face, Collection offsets, PoseStack poseStack, VertexConsumer consumer, - Fluid fluid, RenderUtil.FluidTextureType texture, int combinedOverlay, BlockPos origin) { + public void drawPlane(Direction face, Collection offsets, + PoseStack poseStack, VertexConsumer consumer, + Fluid fluid, RenderUtil.FluidTextureType texture, + int combinedOverlay, BlockPos origin, @Nullable BlockAndTintGetter level) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); int color = fluidClientInfo.getTintColor(); - int r = red(color), g = green(color), b = blue(color), a = alpha(color); - var normal = getNormal(face); - var vertices = transformVertices(getVertices(face), face); + Vector3fc normal = getNormal(face); + Vector3f[] vertices = transformVertices(getVertices(face), face); - for (var offset : offsets) { + for (BlockPos offset : offsets) { poseStack.pushPose(); poseStack.translate(offset.getX(), offset.getY(), offset.getZ()); - drawFace(poseStack.last(), consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, - RenderUtil.getFluidLight(fluid, origin.offset(offset))); + drawFace(poseStack.last(), consumer, vertices, normal, + u0, u1, v0, v1, color, + combinedOverlay, RenderUtil.getFluidLight(fluid, origin.offset(offset), level)); poseStack.popPose(); } } @@ -114,61 +116,40 @@ public void drawPlane(Direction face, Collection offsets, PoseStack po var sprite = texture.map(fluidClientInfo); float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); int color = fluidClientInfo.getTintColor(); - int r = red(color), g = green(color), b = blue(color), a = alpha(color); - var normal = getNormal(face); - var vertices = transformVertices(getVertices(face), face); + Vector3fc normal = getNormal(face); + Vector3f[] vertices = transformVertices(getVertices(face), face); for (var offset : offsets) { poseStack.pushPose(); poseStack.translate(offset.getX(), offset.getY(), offset.getZ()); drawFace(poseStack.last(), consumer, vertices, normal, - u0, u1, v0, v1, r, g, b, a, - combinedOverlay, combinedLight); + u0, u1, v0, v1, color, combinedOverlay, combinedLight); poseStack.popPose(); } } - public void drawFace(Direction face, PoseStack.Pose pose, VertexConsumer consumer, Fluid fluid, - RenderUtil.FluidTextureType texture, int combinedOverlay, int combinedLight) { + public void drawFace(Direction face, PoseStack.Pose pose, VertexConsumer consumer, + Fluid fluid, RenderUtil.FluidTextureType texture, + int combinedOverlay, int combinedLight) { var fluidClientInfo = IClientFluidTypeExtensions.of(fluid); var sprite = texture.map(fluidClientInfo); float u0 = sprite.getU0(), v0 = sprite.getV0(), u1 = sprite.getU1(), v1 = sprite.getV1(); int color = fluidClientInfo.getTintColor(); - int r = red(color), g = green(color), b = blue(color), a = alpha(color); - var normal = getNormal(face); - var vertices = transformVertices(getVertices(face), face); - drawFace(pose, consumer, vertices, normal, u0, u1, v0, v1, r, g, b, a, combinedOverlay, combinedLight); + Vector3fc normal = getNormal(face); + Vector3f[] vertices = transformVertices(getVertices(face), face); + + drawFace(pose, consumer, vertices, normal, u0, u1, v0, v1, color, combinedOverlay, combinedLight); } public void drawFace(PoseStack.Pose pose, VertexConsumer consumer, Vector3f[] vertices, Vector3fc normal, float u0, float u1, float v0, float v1, - int r, int g, int b, int a, - int combinedOverlay, int combinedLight) { + int argb, int combinedOverlay, int combinedLight) { if (properties.isOverwriteLight()) combinedLight = properties.getLight(); - var vert = vertices[0]; - RenderUtil.vertex(pose, consumer, vert.x, vert.y, vert.z, - r, g, b, a, - u0, v1, - combinedOverlay, combinedLight, normal.x(), normal.y(), normal.z()); - - vert = vertices[1]; - RenderUtil.vertex(pose, consumer, vert.x, vert.y, vert.z, - r, g, b, a, - u0, v0, - combinedOverlay, combinedLight, normal.x(), normal.y(), normal.z()); - - vert = vertices[2]; - RenderUtil.vertex(pose, consumer, vert.x, vert.y, vert.z, - r, g, b, a, - u1, v0, - combinedOverlay, combinedLight, normal.x(), normal.y(), normal.z()); - - vert = vertices[3]; - RenderUtil.vertex(pose, consumer, vert.x, vert.y, vert.z, - r, g, b, a, - u1, v1, - combinedOverlay, combinedLight, normal.x(), normal.y(), normal.z()); + RenderUtil.vertex(pose, consumer, vertices[0], normal, u0, v1, argb, combinedOverlay, combinedLight); + RenderUtil.vertex(pose, consumer, vertices[1], normal, u0, v0, argb, combinedOverlay, combinedLight); + RenderUtil.vertex(pose, consumer, vertices[2], normal, u1, v0, argb, combinedOverlay, combinedLight); + RenderUtil.vertex(pose, consumer, vertices[3], normal, u1, v1, argb, combinedOverlay, combinedLight); } @Data diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java index 2b7d3aba750..d39980e2eb3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FluidAreaRender.java @@ -120,7 +120,7 @@ public void render(WorkableMultiblockMachine machine, float partialTick, if (dir.getAxis() != Direction.Axis.Y) dir = dir.getOpposite(); fluidBlockRenderer.drawPlane(dir, trait.getFluidOffsets(), poseStack, consumer, cachedFluid, - RenderUtil.FluidTextureType.STILL, packedOverlay, machine.getBlockPos()); + RenderUtil.FluidTextureType.STILL, packedOverlay, machine.getBlockPos(), machine.getLevel()); poseStack.popPose(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumTankFluidRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumTankFluidRender.java index 1489b8dc126..901deec6652 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumTankFluidRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/QuantumTankFluidRender.java @@ -101,11 +101,11 @@ public void renderTank(PoseStack poseStack, MultiBufferSource buffer, Direction EnumSet sidesToRender = EnumSet.of(frontFacing); VertexConsumer builder = buffer.getBuffer(Sheets.translucentCullBlockSheet()); - var gas = fluid.getFluid().getFluidType().isLighterThanAir(); - var percentFull = isCreative || maxAmount <= storedAmount ? 1f : (float) storedAmount / maxAmount; + boolean gas = fluid.getFluid().getFluidType().isLighterThanAir(); + float percentFull = isCreative || maxAmount <= storedAmount ? 1f : (float) storedAmount / maxAmount; - var maxTop = gas ? MAX : MIN + percentFull * (MAX - MIN); - var minBot = gas ? MIN + (1 - percentFull) * (MAX - MIN) : MIN; + float maxTop = gas ? MAX : MIN + percentFull * (MAX - MIN); + float minBot = gas ? MIN + (1 - percentFull) * (MAX - MIN) : MIN; float minY, maxY, minZ, maxZ; if (frontFacing.getAxis() == Direction.Axis.Y) { minY = MIN; 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 2db955b05ba..8792fc7af27 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderBufferHelper.java @@ -12,13 +12,12 @@ import com.mojang.blaze3d.vertex.*; import org.joml.Matrix4f; +import org.joml.Vector3f; import org.joml.Vector3fc; import java.util.EnumSet; import java.util.Set; -import static net.minecraft.util.FastColor.ARGB32.*; - @OnlyIn(Dist.CLIENT) public class RenderBufferHelper { @@ -236,15 +235,17 @@ public static void renderCubeFace(VertexConsumer buffer, PoseStack.Pose pose, float x3, float y3, float z3, float u3, float v3, float x4, float y4, float z4, float u4, float v4) { Vector3fc normal = GTMatrixUtils.getDirectionAxis(normalDir); - int r = red(color), g = green(color), b = blue(color), a = alpha(color); - - RenderUtil.vertex(pose, buffer, x1, y1, z1, r, g, b, a, u1, v1, - OverlayTexture.NO_OVERLAY, combinedLight, normal.x(), normal.y(), normal.z()); - RenderUtil.vertex(pose, buffer, x2, y2, z2, r, g, b, a, u2, v2, - OverlayTexture.NO_OVERLAY, combinedLight, normal.x(), normal.y(), normal.z()); - RenderUtil.vertex(pose, buffer, x3, y3, z3, r, g, b, a, u3, v3, - OverlayTexture.NO_OVERLAY, combinedLight, normal.x(), normal.y(), normal.z()); - RenderUtil.vertex(pose, buffer, x4, y4, z4, r, g, b, a, u4, v4, - OverlayTexture.NO_OVERLAY, combinedLight, normal.x(), normal.y(), normal.z()); + + Vector3f pos = new Vector3f(x1, y1, z1); + RenderUtil.vertex(pose, buffer, pos, normal, u1, v1, color, OverlayTexture.NO_OVERLAY, combinedLight); + + pos.set(x2, y2, z2); + RenderUtil.vertex(pose, buffer, pos, normal, u2, v2, color, OverlayTexture.NO_OVERLAY, combinedLight); + + pos.set(x3, y3, z3); + RenderUtil.vertex(pose, buffer, pos, normal, u3, v3, color, OverlayTexture.NO_OVERLAY, combinedLight); + + pos.set(x4, y4, z4); + RenderUtil.vertex(pose, buffer, pos, normal, u4, v4, color, OverlayTexture.NO_OVERLAY, combinedLight); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java index b15588fad39..366cb98e033 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/RenderUtil.java @@ -51,11 +51,9 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; -import org.joml.Quaternionf; -import org.joml.Vector3f; -import org.joml.Vector3fc; +import org.joml.*; +import java.lang.Math; import java.util.*; import java.util.function.BiFunction; @@ -138,10 +136,28 @@ public static Vector3fc getNormal(Direction direction) { return DIRECTION_NORMAL_MAP.get(direction); } - public static int getFluidLight(Fluid fluid, BlockPos pos) { - if (Minecraft.getInstance().level == null) return 0; - return LevelRenderer.getLightColor(Minecraft.getInstance().level, fluid.defaultFluidState().createLegacyBlock(), - pos); + public static int getFluidLight(Fluid fluid, BlockPos pos, @Nullable BlockAndTintGetter level) { + if (level == null) level = Minecraft.getInstance().level; + if (level == null) return 0; + + return LevelRenderer.getLightColor(level, fluid.defaultFluidState().createLegacyBlock(), pos); + } + + public static void vertex(PoseStack.Pose pose, VertexConsumer vertexConsumer, + Vector3fc pos, Vector3fc normal, float u, float v, + int argb, int packedOverlay, int packedLight) { + /* + * For future reference: + * The order of the vertex calls is important. + * Change it, and it'll break and complain that you didn't fill all elements (even though you did). + */ + vertexConsumer.gtceu$vertex(pose.pose(), pos) + .color(argb) + .uv(u, v) + .overlayCoords(packedOverlay) + .uv2(packedLight) + .gtceu$normal(pose.normal(), normal) + .endVertex(); } public static void vertex(PoseStack.Pose pose, VertexConsumer vertexConsumer, diff --git a/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java b/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java new file mode 100644 index 00000000000..6bf7fbe6809 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java @@ -0,0 +1,22 @@ +package com.gregtechceu.gtceu.core; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.joml.*; + +public interface IGTVertexConsumer { + + private VertexConsumer self() + { + return (VertexConsumer) this; + } + + default VertexConsumer gtceu$vertex(Matrix4f poseMatrix, Vector3fc pos) { + pos = poseMatrix.transformPosition(pos, MixinHelpers.scratch.get()); + return self().vertex(pos.x(), pos.y(), pos.z()); + } + + default VertexConsumer gtceu$normal(Matrix3f normalMatrix, Vector3fc normal) { + normal = normalMatrix.transform(normal, MixinHelpers.scratch.get()); + return self().normal(normal.x(), normal.y(), normal.z()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java index 26da2a0bc53..7d2482749d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java @@ -52,6 +52,8 @@ import net.minecraftforge.versions.forge.ForgeVersion; import com.tterrag.registrate.util.entry.BlockEntry; +import org.jetbrains.annotations.ApiStatus; +import org.joml.Vector3f; import java.util.ArrayList; import java.util.List; @@ -364,4 +366,8 @@ public static void addFluidTexture(Material material, FluidStorage.FluidEntry va } } } + + // package-private so only things in this package can use it + @ApiStatus.Internal + static final ThreadLocal scratch = ThreadLocal.withInitial(Vector3f::new); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java new file mode 100644 index 00000000000..3c4e8dee994 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java @@ -0,0 +1,10 @@ +package com.gregtechceu.gtceu.core.mixins.client; + +import com.gregtechceu.gtceu.core.IGTVertexConsumer; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(VertexConsumer.class) +public interface VertexConsumerMixin extends IGTVertexConsumer { +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index b270271220d..7949ce026d2 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -26,6 +26,7 @@ "client.PostChainMixin", "client.VariantDeserializerMixin", "client.VertexBufferAccessor", + "client.VertexConsumerMixin", "dev.client.KeyboardHandlerMixin", "embeddium.BlockRendererMixin", "forge.QuadLighterMixin", From f0fc8146b4a7d7cb190692e596755f9c7b3336dd Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:14:48 +0300 Subject: [PATCH 149/269] Move bloom related mixins to mixin.client.bloom --- .../gtceu/client/bloom/BloomUtil.java | 4 +-- .../mixins/client/LevelRendererAccessor.java | 14 -------- .../mixins/client/LevelRendererMixin.java | 26 +------------- .../client/bloom/LevelRendererMixin.java | 35 +++++++++++++++++++ .../{ => bloom}/ModelBlockRendererMixin.java | 2 +- .../client/{ => bloom}/PostChainAccessor.java | 2 +- .../client/{ => bloom}/PostChainMixin.java | 2 +- .../bloom}/QuadLighterMixin.java | 2 +- .../{ => bloom}/VertexBufferAccessor.java | 2 +- src/main/resources/gtceu.mixins.json | 12 +++---- 10 files changed, 49 insertions(+), 52 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/{ => bloom}/ModelBlockRendererMixin.java (96%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/{ => bloom}/PostChainAccessor.java (85%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/{ => bloom}/PostChainMixin.java (95%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{forge => client/bloom}/QuadLighterMixin.java (96%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/{ => bloom}/VertexBufferAccessor.java (84%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 117bb7256f9..c80c8da0446 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.core.mixins.client.PostChainAccessor; -import com.gregtechceu.gtceu.core.mixins.client.VertexBufferAccessor; +import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; +import com.gregtechceu.gtceu.core.mixins.client.bloom.VertexBufferAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java deleted file mode 100644 index a258129fe6c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client; - -import net.minecraft.client.renderer.LevelRenderer; - -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(LevelRenderer.class) -public interface LevelRendererAccessor { - - @Accessor("renderChunksInFrustum") - ObjectArrayList gtceu$getRenderChunksInFrustum(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index a7d3350dcb0..6aee5338511 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -20,10 +20,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; -import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.util.FastColor; import net.minecraft.util.RandomSource; @@ -36,8 +35,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.data.ModelData; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; @@ -60,7 +57,6 @@ import java.util.*; @Mixin(value = LevelRenderer.class, priority = 500) -@OnlyIn(Dist.CLIENT) public abstract class LevelRendererMixin { @Shadow @@ -78,26 +74,6 @@ public abstract class LevelRendererMixin { @Shadow private @Nullable ClientLevel level; - @Unique - private final RandomSource gtceu$modelRandom = RandomSource.create(); - - @Inject(method = "compileChunks", - at = @At(value = "INVOKE", - ordinal = 0, - target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) - private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, - @Local SectionPos chunkOrigin) { - BloomUtil.CURRENT_RENDERING_SECTION.set(chunkOrigin); - BloomUtil.bakeBloomChunkBuffers(chunkOrigin, camera.getPosition()); - } - - @Inject(method = "resize", at = @At("TAIL")) - private void gtceu$resize(int width, int height, CallbackInfo ci) { - if (GTShaders.BLOOM_CHAIN != null) { - GTShaders.BLOOM_CHAIN.resize(width, height); - } - } - @Inject(method = "renderLevel", at = @At("HEAD")) private void renderLevel(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java new file mode 100644 index 00000000000..032436555fe --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -0,0 +1,35 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.shader.GTShaders; + +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.core.SectionPos; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = LevelRenderer.class) +public class LevelRendererMixin { + + @Inject(method = "compileChunks", + at = @At(value = "INVOKE", + ordinal = 0, + target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) + private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, + @Local SectionPos chunkOrigin) { + BloomUtil.CURRENT_RENDERING_SECTION.set(chunkOrigin); + BloomUtil.bakeBloomChunkBuffers(chunkOrigin, camera.getPosition()); + } + + @Inject(method = "resize", at = @At("TAIL")) + private void gtceu$resize(int width, int height, CallbackInfo ci) { + if (GTShaders.BLOOM_CHAIN != null) { + GTShaders.BLOOM_CHAIN.resize(width, height); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java index a2ecb6e93ee..7bb6e965129 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client; +package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainAccessor.java similarity index 85% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainAccessor.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainAccessor.java index 51424d86d9e..044f5afc58d 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainAccessor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client; +package com.gregtechceu.gtceu.core.mixins.client.bloom; import net.minecraft.client.renderer.PostChain; import net.minecraft.client.renderer.PostPass; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java index cfd47cec5c2..baae0f0aba8 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/PostChainMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client; +package com.gregtechceu.gtceu.core.mixins.client.bloom; import net.minecraft.client.renderer.PostChain; import net.minecraft.util.GsonHelper; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java index d610e2cb114..92c1281b824 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/forge/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.forge; +package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexBufferAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/VertexBufferAccessor.java similarity index 84% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexBufferAccessor.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/VertexBufferAccessor.java index 6c2f88c11fe..c9bf6b925a3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexBufferAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/VertexBufferAccessor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client; +package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.mojang.blaze3d.vertex.VertexBuffer; import com.mojang.blaze3d.vertex.VertexFormat; diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 7949ce026d2..4e09a585125 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -16,20 +16,20 @@ "client.GuiGraphicsMixin", "client.GuiHeartTypeMixin", "client.HumanoidArmorLayerMixin", - "client.LevelRendererAccessor", "client.LevelRendererMixin", - "client.ModelBlockRendererMixin", "client.ModelManagerMixin", "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", - "client.PostChainAccessor", - "client.PostChainMixin", "client.VariantDeserializerMixin", - "client.VertexBufferAccessor", "client.VertexConsumerMixin", + "client.bloom.ModelBlockRendererMixin", + "client.bloom.PostChainAccessor", + "client.bloom.PostChainMixin", + "client.bloom.VertexBufferAccessor", + "client.bloom.QuadLighterMixin", + "client.bloom.LevelRendererMixin", "dev.client.KeyboardHandlerMixin", "embeddium.BlockRendererMixin", - "forge.QuadLighterMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", From 4fd1b6454e2f20d57acfb103ee7197aac2bfd2fc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:16:29 +0300 Subject: [PATCH 150/269] (TEST, might revert) Stop using forge event for the bloom rendering hook, it's too slow --- .../gtceu/client/ClientEventListener.java | 3 -- .../client/bloom/LevelRendererMixin.java | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java index 3d688d82279..807c46306c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java @@ -73,9 +73,6 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { // to render the preview after block entities, before the translucent. // so it can be seen through the transparent blocks. MultiblockInWorldPreviewRenderer.renderInWorldPreview(poseStack, camera, partialTick); - } else if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { - BloomUtil.renderBloom(camera, camera.getEntity(), levelRenderer, - poseStack, event.getProjectionMatrix(), event.getFrustum(), partialTick); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 032436555fe..009a5f02edb 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -4,13 +4,19 @@ import com.gregtechceu.gtceu.client.shader.GTShaders; import net.minecraft.client.Camera; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.SectionPos; import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.vertex.PoseStack; +import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = LevelRenderer.class) @@ -32,4 +38,37 @@ public class LevelRendererMixin { GTShaders.BLOOM_CHAIN.resize(width, height); } } + + // spotless:off + // Capture both calls to #renderChunkLayer(RenderType.tripwire(), ...) separately. Capturing them in one @At target + // means the translucent layer draw also gets caught in the targets, and we don't want that. + @Inject(method = "renderLevel", + at = { + @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", + shift = At.Shift.AFTER, + slice = "slice1"), + @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", + shift = At.Shift.AFTER, + slice = "slice2"), + }, + slice = { + @Slice(id = "slice1", + from = @At(value = "INVOKE:FIRST", target = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;"), + to = @At(value = "CONSTANT:FIRST", args = "stringValue=particles")), + @Slice(id = "slice2", + from = @At(value = "INVOKE:LAST", target = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;"), + to = @At(value = "CONSTANT:LAST", args = "stringValue=particles")), + }, + expect = 2 + ) + // spotless:on + private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, + boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, + LightTexture lightTexture, Matrix4f projectionMatrix, + CallbackInfo ci, + @Local Frustum frustum) { + BloomUtil.renderBloom(camera, (LevelRenderer) (Object) this, poseStack, projectionMatrix, frustum, partialTick); + } } From b4ddab3628948bdb1c6f71d74a9c6fdcc436171b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:16:43 +0300 Subject: [PATCH 151/269] I forgot to commit this too... --- src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 209b1e7dc8f..69397c5a653 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -193,6 +193,11 @@ public void registerShaders(RegisterShadersEvent event) { GTShaders.onRegisterShaders(event); } + @SubscribeEvent + public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { + BloomUtil.AFTER_BLOOM_RENDER_STAGE = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); + } + @SubscribeEvent(priority = EventPriority.HIGHEST) public void preRegisterDynamicAssets(RegisterDynamicResourcesEvent event) { PipeModel.DYNAMIC_MODELS.clear(); From beafe321286910d84c455c672696fa8d3bdc111d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:16:57 +0300 Subject: [PATCH 152/269] Cache discovered bloom textures --- .../client/model/BloomMetadataSection.java | 43 ++++++++----------- .../gtceu/client/util/ModelUtils.java | 3 ++ 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java index c87f55079a1..0ca1268c7cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java @@ -11,17 +11,19 @@ import net.minecraft.client.renderer.texture.atlas.SpriteSource; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.metadata.MetadataSectionSerializer; +import net.minecraft.util.GsonHelper; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import org.jetbrains.annotations.NotNull; +import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import java.io.IOException; public record BloomMetadataSection(boolean bloom) { public static final String SECTION_NAME = GTCEu.MOD_ID; - public static final BloomMetadataSection MISSING = new BloomMetadataSection(false); + + public static final Object2BooleanMap KNOWN_BLOOM_TEXTURES = new Object2BooleanOpenHashMap<>(); public static boolean hasBloom(TextureAtlasSprite sprite) { ResourceLocation textureLoc = SpriteSource.TEXTURE_ID_CONVERTER.idToFile(sprite.contents().name()); @@ -29,16 +31,19 @@ public static boolean hasBloom(TextureAtlasSprite sprite) { } public static boolean hasBloom(ResourceLocation res) { - try { - var resource = Minecraft.getInstance().getResourceManager().getResource(res); - if (resource.isPresent()) { - return resource.get().metadata().getSection(Serializer.INSTANCE) - .orElse(MISSING).bloom; + return KNOWN_BLOOM_TEXTURES.computeIfAbsent(res, loc -> { + try { + var resource = Minecraft.getInstance().getResourceManager().getResource(res); + if (resource.isPresent()) { + return resource.get().metadata() + .getSection(Serializer.INSTANCE).map(BloomMetadataSection::bloom) + .orElse(false); + } + } catch (IOException e) { + throw new RuntimeException(e); } - } catch (IOException e) { - throw new RuntimeException(e); - } - return false; + return false; + }); } public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { @@ -72,7 +77,6 @@ public static class Serializer implements MetadataSectionSerializer Date: Sat, 25 Apr 2026 20:54:23 +0300 Subject: [PATCH 153/269] Use MixinExtras expression instead of janky slices to target tripwire layer draws --- .../client/bloom/LevelRendererMixin.java | 32 ++++--------------- src/main/resources/gtceu.mixins.json | 3 ++ 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 009a5f02edb..d9550adf90e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -10,13 +10,14 @@ import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.SectionPos; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.PoseStack; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = LevelRenderer.class) @@ -39,31 +40,10 @@ public class LevelRendererMixin { } } - // spotless:off - // Capture both calls to #renderChunkLayer(RenderType.tripwire(), ...) separately. Capturing them in one @At target - // means the translucent layer draw also gets caught in the targets, and we don't want that. - @Inject(method = "renderLevel", - at = { - @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", - shift = At.Shift.AFTER, - slice = "slice1"), - @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", - shift = At.Shift.AFTER, - slice = "slice2"), - }, - slice = { - @Slice(id = "slice1", - from = @At(value = "INVOKE:FIRST", target = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;"), - to = @At(value = "CONSTANT:FIRST", args = "stringValue=particles")), - @Slice(id = "slice2", - from = @At(value = "INVOKE:LAST", target = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;"), - to = @At(value = "CONSTANT:LAST", args = "stringValue=particles")), - }, - expect = 2 - ) - // spotless:on + @Expression("this.renderChunkLayer(tripwire(), ?, ?, ?, ?, ?)") + @Definition(id = "renderChunkLayer", method = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V") + @Definition(id = "tripwire", method = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;") + @Inject(method = "renderLevel", at = @At("MIXINEXTRAS:EXPRESSION")) private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 4e09a585125..8e53bbe0fa2 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -1,6 +1,9 @@ { "required": true, "minVersion": "0.8", + "mixinextras": { + "minVersion": "0.5.0-rc.3" + }, "refmap": "gtceu.refmap.json", "package": "com.gregtechceu.gtceu.core.mixins", "compatibilityLevel": "JAVA_17", From fd4f10b1428d41ae0cfbcafca281e6c568e1f1f1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 23:43:28 +0300 Subject: [PATCH 154/269] Move bloom-related event listeners to their own class --- .../gtceu/client/ClientEventListener.java | 37 --------- .../gregtechceu/gtceu/client/ClientProxy.java | 12 --- .../client/bloom/BloomEventListeners.java | 76 +++++++++++++++++++ 3 files changed, 76 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java index 807c46306c3..572f098fa84 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientEventListener.java @@ -6,11 +6,9 @@ import com.gregtechceu.gtceu.api.cosmetics.CapeRegistry; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.renderer.BlockHighlightRenderer; import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; import com.gregtechceu.gtceu.client.renderer.cover.FacadeCoverRenderer; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.commands.GTClientCommands; import com.gregtechceu.gtceu.core.mixins.client.AbstractClientPlayerAccessor; @@ -21,9 +19,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -31,10 +27,7 @@ import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraftforge.api.distmarker.Dist; @@ -43,7 +36,6 @@ import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.event.server.ServerStoppedEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -64,7 +56,6 @@ public class ClientEventListener { @SubscribeEvent public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { - LevelRenderer levelRenderer = event.getLevelRenderer(); Camera camera = event.getCamera(); PoseStack poseStack = event.getPoseStack(); float partialTick = event.getPartialTick(); @@ -76,36 +67,8 @@ public static void onRenderLevelStageEvent(RenderLevelStageEvent event) { } } - @SubscribeEvent - public static void onChunkUnloadEvent(ChunkEvent.Unload event) { - if (!GTShaders.canUseBloomShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { - return; - } - ChunkAccess chunk = event.getChunk(); - LevelAccessor level = chunk.getWorldForge(); - if (level == null) { - return; - } - - ChunkPos chunkPos = chunk.getPos(); - for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { - BloomUtil.removeBloomChunk(SectionPos.of(chunkPos, y)); - } - } - - @SubscribeEvent - public static void onRenderTick(TickEvent.RenderTickEvent event) { - if (event.phase == TickEvent.Phase.START && Minecraft.getInstance().level != null) { - if (GTShaders.canUseBloomShader()) { - GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); - } - } - } - @SubscribeEvent public static void onLevelUnload(LevelEvent.Unload event) { - BloomUtil.invalidateLevelTickets(event.getLevel()); FacadeCoverRenderer.clearItemModelCache(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 69397c5a653..64ceaf61411 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -15,7 +15,6 @@ import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; import com.gregtechceu.gtceu.client.particle.HazardParticle; import com.gregtechceu.gtceu.client.particle.MufflerParticle; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.block.MaterialBlockRenderer; import com.gregtechceu.gtceu.client.renderer.block.OreBlockRenderer; import com.gregtechceu.gtceu.client.renderer.block.SurfaceRockRenderer; @@ -31,7 +30,6 @@ import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderManager; import com.gregtechceu.gtceu.client.renderer.machine.impl.*; import com.gregtechceu.gtceu.client.renderer.machine.impl.BoilerMultiPartRender; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.common.CommonEventListener; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; @@ -188,16 +186,6 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); } - @SubscribeEvent - public void registerShaders(RegisterShadersEvent event) { - GTShaders.onRegisterShaders(event); - } - - @SubscribeEvent - public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { - BloomUtil.AFTER_BLOOM_RENDER_STAGE = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); - } - @SubscribeEvent(priority = EventPriority.HIGHEST) public void preRegisterDynamicAssets(RegisterDynamicResourcesEvent event) { PipeModel.DYNAMIC_MODELS.clear(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java new file mode 100644 index 00000000000..5688c73d4bc --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -0,0 +1,76 @@ +package com.gregtechceu.gtceu.client.bloom; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.SectionPos; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraftforge.client.event.RegisterShadersEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.level.ChunkEvent; +import net.minecraftforge.event.level.LevelEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import lombok.experimental.UtilityClass; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) +@UtilityClass +public class BloomEventListeners { + + @SubscribeEvent + public static void onRenderTick(TickEvent.RenderTickEvent event) { + if (event.phase != TickEvent.Phase.START || Minecraft.getInstance().level == null) { + return; + } + if (!GTShaders.canUseBloomShader()) { + return; + } + + GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + Minecraft.getInstance().getMainRenderTarget().bindWrite(false); + } + + @SubscribeEvent + public static void onChunkUnloadEvent(ChunkEvent.Unload event) { + if (!GTShaders.canUseBloomShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { + return; + } + ChunkAccess chunk = event.getChunk(); + LevelAccessor level = chunk.getWorldForge(); + if (level == null) { + return; + } + + ChunkPos chunkPos = chunk.getPos(); + for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { + BloomUtil.removeBloomChunk(SectionPos.of(chunkPos, y)); + } + } + + @SubscribeEvent + public static void onLevelUnload(LevelEvent.Unload event) { + BloomUtil.invalidateLevelTickets(event.getLevel()); + } + + // Merge into parent class in 1.21, event listener discovery is smarter there + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + @UtilityClass + public static class ModBus { + + @SubscribeEvent + public void registerShaders(RegisterShadersEvent event) { + GTShaders.onRegisterShaders(event); + } + + @SubscribeEvent + public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { + BloomUtil.AFTER_BLOOM_RENDER_STAGE = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); + } + } +} From 03540482c909743be6915f0f1e7d8d6a74164cf1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 23:45:45 +0300 Subject: [PATCH 155/269] Temporary thing --- .../gtceu/client/bloom/BloomUtil.java | 62 ++++++++++--------- .../client/bloom/LevelRendererMixin.java | 13 +++- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index c80c8da0446..353f02d95dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -231,12 +231,14 @@ public static void renderBloom(Camera camera, LevelRenderer levelRenderer, postDraw(); } + /* shader uniforms are set up where this is called from if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { - setupBloomUniforms(true); + setupBloomShaderUniforms(true); drawBlockBloom(poseStack, projectionMatrix, camPos); } else { - setupBloomUniforms(false); + setupBloomShaderUniforms(false); } + */ // copy depth buffer from the main render target so bloom won't render through blocks // GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); @@ -405,7 +407,8 @@ public static void bakeBloomChunkBuffers(SectionPos pos, Vec3 camPos) { private static final String MIN_BRIGHTNESS_UNIFORM = "MinBrightness"; private static final String BLUR_DIR_UNIFORM = "BlurDir"; - private static void setupBloomUniforms(boolean drawBlockBloom) { + @ApiStatus.Internal + public static void setupBloomShaderUniforms(boolean drawBlockBloom) { var config = ConfigHolder.INSTANCE.client.shader; // Forcefully insert config values to shader @@ -432,8 +435,34 @@ private static void setupBloomUniforms(boolean drawBlockBloom) { } } + /// @return the shader to use for drawing block bloom. + private static ShaderInstance setupBlockShaderUniforms(PoseStack poseStack, Matrix4f projectionMatrix) { + ShaderInstance shader = RenderSystem.getShader(); + assert shader != null; + + for(int i = 0; i < 12; ++i) { + int textureId = RenderSystem.getShaderTexture(i); + shader.setSampler("Sampler" + i, textureId); + } + if (shader.MODEL_VIEW_MATRIX != null) shader.MODEL_VIEW_MATRIX.set(poseStack.last().pose()); + if (shader.PROJECTION_MATRIX != null) shader.PROJECTION_MATRIX.set(projectionMatrix); + if (shader.COLOR_MODULATOR != null) shader.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); + if (shader.GLINT_ALPHA != null) shader.GLINT_ALPHA.set(RenderSystem.getShaderGlintAlpha()); + if (shader.FOG_START != null) shader.FOG_START.set(RenderSystem.getShaderFogStart()); + if (shader.FOG_END != null) shader.FOG_END.set(RenderSystem.getShaderFogEnd()); + if (shader.FOG_COLOR != null) shader.FOG_COLOR.set(RenderSystem.getShaderFogColor()); + if (shader.FOG_SHAPE != null) shader.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); + if (shader.TEXTURE_MATRIX != null) shader.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); + if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + + RenderSystem.setupShaderLights(shader); + shader.apply(); + + return shader; + } + private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { - ShaderInstance shader = setupShaderUniforms(poseStack, projectionMatrix); + ShaderInstance shader = setupBlockShaderUniforms(poseStack, projectionMatrix); Uniform chunkOffsetUniform = shader.CHUNK_OFFSET; BLOOM_RENDER_LOCK.readLock().lock(); @@ -469,31 +498,6 @@ private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatri VertexBuffer.unbind(); } - private static ShaderInstance setupShaderUniforms(PoseStack poseStack, Matrix4f projectionMatrix) { - ShaderInstance shader = RenderSystem.getShader(); - assert shader != null; - - for(int i = 0; i < 12; ++i) { - int textureId = RenderSystem.getShaderTexture(i); - shader.setSampler("Sampler" + i, textureId); - } - if (shader.MODEL_VIEW_MATRIX != null) shader.MODEL_VIEW_MATRIX.set(poseStack.last().pose()); - if (shader.PROJECTION_MATRIX != null) shader.PROJECTION_MATRIX.set(projectionMatrix); - if (shader.COLOR_MODULATOR != null) shader.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); - if (shader.GLINT_ALPHA != null) shader.GLINT_ALPHA.set(RenderSystem.getShaderGlintAlpha()); - if (shader.FOG_START != null) shader.FOG_START.set(RenderSystem.getShaderFogStart()); - if (shader.FOG_END != null) shader.FOG_END.set(RenderSystem.getShaderFogEnd()); - if (shader.FOG_COLOR != null) shader.FOG_COLOR.set(RenderSystem.getShaderFogColor()); - if (shader.FOG_SHAPE != null) shader.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); - if (shader.TEXTURE_MATRIX != null) shader.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); - if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); - - RenderSystem.setupShaderLights(shader); - shader.apply(); - - return shader; - } - public static void copyToBloomBuffer(VertexConsumer originalVertexConsumer, BakedQuad quad, int[] combinedLights, Consumer draw) { draw.accept(originalVertexConsumer); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index d9550adf90e..b5bf4f37b69 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -2,13 +2,16 @@ import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Camera; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.core.SectionPos; +import net.minecraft.world.phys.Vec3; import com.llamalad7.mixinextras.expression.Definition; import com.llamalad7.mixinextras.expression.Expression; @@ -16,6 +19,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import org.joml.Matrix4f; 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; @@ -48,7 +52,14 @@ public class LevelRendererMixin { boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci, - @Local Frustum frustum) { + @Local Frustum frustum, @Local Vec3 camPos) { + if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { + BloomUtil.setupBloomShaderUniforms(true); + BloomUtil.drawBlockBloom(poseStack, projectionMatrix, camPos); + } else { + BloomUtil.setupBloomShaderUniforms(false); + } + BloomUtil.renderBloom(camera, (LevelRenderer) (Object) this, poseStack, projectionMatrix, frustum, partialTick); } } From 1fc6156f165414174fca8d2e527e75635e657fdd Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 25 Apr 2026 23:49:31 +0300 Subject: [PATCH 156/269] After all, why shouldn't I use a custom chunk render layer... My treasure. --- .../client/bloom/BloomEventListeners.java | 6 ++ .../client/model/BloomMetadataSection.java | 26 ++++- .../gtceu/client/renderer/GTRenderTypes.java | 32 ++++-- .../bloom/ForgeModelBlockRendererMixin.java | 62 +++++++++++ .../client/bloom/LevelRendererMixin.java | 9 +- .../client/bloom/ModelBlockRendererMixin.java | 93 +++++++++++++--- .../client/bloom/QuadLighterAccessor.java | 18 ++++ .../mixins/client/bloom/QuadLighterMixin.java | 29 ----- .../mixins/client/bloom/RenderTypeMixin.java | 24 +++++ .../mixins/embeddium/BlockRendererMixin.java | 101 ++---------------- .../DefaultTerrainRenderPassesMixin.java | 45 ++++++++ .../core/util/ContextualObjectHelper.java | 19 ++++ .../embeddium/GTEmbeddiumCompat.java | 7 ++ src/main/resources/gtceu.mixins.json | 7 +- 14 files changed, 331 insertions(+), 147 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/ContextualObjectHelper.java 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 5688c73d4bc..abf4a1a0415 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraftforge.client.event.RegisterNamedRenderTypesEvent; import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.event.TickEvent; @@ -72,5 +73,10 @@ public void registerShaders(RegisterShadersEvent event) { public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { BloomUtil.AFTER_BLOOM_RENDER_STAGE = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); } + + @SubscribeEvent + public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { + event.register("bloom", GTRenderTypes.bloom(), GTRenderTypes.entityBloomBlockSheet()); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java index 0ca1268c7cc..9b8f440588c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java @@ -1,11 +1,13 @@ package com.gregtechceu.gtceu.client.model; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.util.GTQuadTransformers; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.atlas.SpriteSource; @@ -16,8 +18,11 @@ import com.google.gson.JsonObject; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.util.function.Predicate; public record BloomMetadataSection(boolean bloom) { @@ -31,9 +36,9 @@ public static boolean hasBloom(TextureAtlasSprite sprite) { } public static boolean hasBloom(ResourceLocation res) { - return KNOWN_BLOOM_TEXTURES.computeIfAbsent(res, loc -> { + return KNOWN_BLOOM_TEXTURES.computeIfAbsent(res, (Predicate) (loc -> { try { - var resource = Minecraft.getInstance().getResourceManager().getResource(res); + var resource = Minecraft.getInstance().getResourceManager().getResource(loc); if (resource.isPresent()) { return resource.get().metadata() .getSection(Serializer.INSTANCE).map(BloomMetadataSection::bloom) @@ -43,7 +48,7 @@ public static boolean hasBloom(ResourceLocation res) { throw new RuntimeException(e); } return false; - }); + })); } public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { @@ -73,6 +78,21 @@ public static boolean isEmissive(BakedQuad quad, int[] ambientPackedLights) { return false; } + /// Helper function for skipping bloom quads drawn with non-bloom render types + @ApiStatus.Internal + public static boolean shouldDrawQuad(BakedQuad quad, @Nullable RenderType renderType, int[] combinedLights) { + if (renderType == null) { + return true; + } + + if (renderType != GTRenderTypes.bloom() && renderType != GTRenderTypes.entityBloomBlockSheet() && + BloomMetadataSection.hasBloom(quad, combinedLights)) { + return false; + } + + return true; + } + public static class Serializer implements MetadataSectionSerializer { static BloomMetadataSection.Serializer INSTANCE = new BloomMetadataSection.Serializer(); 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 9615378bfdb..74ffd7f7704 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -6,6 +6,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -34,21 +35,31 @@ public class GTRenderTypes extends RenderType { 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(RenderStateShard.NO_CULL) - .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) + .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, false, false, RenderType.CompositeState.builder() - .setLightmapState(RenderStateShard.LIGHTMAP) - .setShaderState(RenderStateShard.RENDERTYPE_CUTOUT_SHADER) - .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) + .setLightmapState(LIGHTMAP) + .setShaderState(RENDERTYPE_CUTOUT_SHADER) + .setTextureState(BLOCK_SHEET_MIPPED) .setOutputState(BLOOM_TARGET) .createCompositeState(false)); + private static final Function ENTITY_BLOOM = Util.memoize((texture) -> { + return create("gtceu:entity_bloom", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, + RenderType.TRANSIENT_BUFFER_SIZE, true, false, + RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_CUTOUT_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(false)); + }); private static final RenderType MONITOR = RenderType.create("central_monitor", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 256, false, false, + DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, RenderType.TRANSIENT_BUFFER_SIZE, false, false, RenderType.CompositeState.builder() .setCullState(NO_CULL) .setShaderState(POSITION_COLOR_SHADER) @@ -79,6 +90,15 @@ public static RenderType bloom() { return BLOOM; } + public static RenderType entityBloom(ResourceLocation location) { + return ENTITY_BLOOM.apply(location); + } + + @SuppressWarnings("deprecation") + public static RenderType entityBloomBlockSheet() { + return entityBloom(TextureAtlas.LOCATION_BLOCKS); + } + public static RenderType getMonitor() { return MONITOR; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java new file mode 100644 index 00000000000..92bf7b5df61 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java @@ -0,0 +1,62 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import com.gregtechceu.gtceu.client.model.BloomMetadataSection; +import com.gregtechceu.gtceu.client.shader.GTShaders; + +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraftforge.client.model.IQuadTransformer; +import net.minecraftforge.client.model.lighting.ForgeModelBlockRenderer; +import net.minecraftforge.client.model.lighting.QuadLighter; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = ForgeModelBlockRenderer.class, remap = false) +public class ForgeModelBlockRendererMixin { + + @WrapWithCondition(method = "render", + at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;process(Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;I)V")) + private static boolean gtceu$skipBloomyQuadsFromModel(QuadLighter instance, VertexConsumer consumer, + PoseStack.Pose pose, BakedQuad quad, int overlay, + @Local RenderType renderType) { + if (!GTShaders.canUseBloomShader()) { + return true; + } + int[] combinedLights = gtceu$getAmbientLightmaps((QuadLighterAccessor) instance, quad); + + return BloomMetadataSection.shouldDrawQuad(quad, renderType, combinedLights); + } + + @Unique + private static int[] gtceu$getAmbientLightmaps(QuadLighterAccessor lighter, BakedQuad quad) { + int[] results = new int[4]; + + int[] vertices = quad.getVertices(); + for (int i = 0; i < 4; i++) { + int offset = i * IQuadTransformer.STRIDE; + float xPos = Float.intBitsToFloat(vertices[offset + IQuadTransformer.POSITION]); + float yPos = Float.intBitsToFloat(vertices[offset + IQuadTransformer.POSITION + 1]); + float zPos = Float.intBitsToFloat(vertices[offset + IQuadTransformer.POSITION + 2]); + + int packedNormal = vertices[offset + IQuadTransformer.NORMAL]; + byte xNormal = (byte) (packedNormal & 0xFF); + byte yNormal = (byte) ((packedNormal >> 8) & 0xFF); + byte zNormal = (byte) ((packedNormal >> 16) & 0xFF); + + float[] adjustedPosition = new float[] { + xPos - 0.5f + (xNormal / 127f * 0.5f), + yPos - 0.5f + (yNormal / 127f * 0.5f), + zPos - 0.5f + (zNormal / 127f * 0.5f) + }; + results[i] = lighter.callCalculateLightmap(adjustedPosition, new byte[] { xNormal, yNormal, zNormal }); + } + + return results; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index b5bf4f37b69..e0b83b77b8a 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -25,7 +26,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = LevelRenderer.class) -public class LevelRendererMixin { +public abstract class LevelRendererMixin { + + @Shadow + protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseStack, + double camX, double camY, double camZ, Matrix4f projectionMatrix); @Inject(method = "compileChunks", at = @At(value = "INVOKE", @@ -55,7 +60,7 @@ public class LevelRendererMixin { @Local Frustum frustum, @Local Vec3 camPos) { if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { BloomUtil.setupBloomShaderUniforms(true); - BloomUtil.drawBlockBloom(poseStack, projectionMatrix, camPos); + this.renderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); } else { BloomUtil.setupBloomShaderUniforms(false); } 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 7bb6e965129..d090cfdec1f 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 @@ -1,28 +1,97 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.model.BloomMetadataSection; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.core.util.ContextualObjectHelper; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.vertex.*; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @Mixin(ModelBlockRenderer.class) public class ModelBlockRendererMixin { - @WrapOperation(method = "putQuadData", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) - private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - BloomUtil.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { - original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); - }); + @Unique + private static final ThreadLocal> gtceu$currentRenderType_thr = ThreadLocal + .withInitial(ContextualObjectHelper::new); + + @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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", + "tesselateWithoutAO(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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V" + }, remap = false) + private static void gtceu$removeBloomyQuadsFromModel$1$1(BlockAndTintGetter level, BakedModel model, + BlockState state, BlockPos pos, PoseStack poseStack, + VertexConsumer consumer, boolean checkSides, + RandomSource random, long seed, int packedOverlay, + ModelData modelData, RenderType renderType, + Operation original) { + if (!GTShaders.canUseBloomShader()) return; + + try (var $ = gtceu$currentRenderType_thr.get().with(renderType)) { + original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, + modelData, renderType); + } + } + + @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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", + remap = false) + private static void gtceu$removeBloomyQuadsFromModel$2$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) { + if (!GTShaders.canUseBloomShader()) return; + + try (var $ = gtceu$currentRenderType_thr.get().with(renderType)) { + original.call(pose, consumer, state, model, red, green, blue, packedLight, packedOverlay, + modelData, renderType); + } + } + + @WrapWithCondition(method = "putQuadData", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") + ) + private static boolean gtceu$skipBloomyQuadsFromModel$1$2(VertexConsumer instance, + PoseStack.Pose poseEntry, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, + boolean mulColor) { + if (!GTShaders.canUseBloomShader()) return true; + + RenderType currentRenderType = gtceu$currentRenderType_thr.get().getCurrent(); + + return BloomMetadataSection.shouldDrawQuad(quad, currentRenderType, combinedLights); + } + + @WrapWithCondition(method = "renderQuadList", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;FFFII)V") + ) + private static boolean gtceu$skipBloomyQuadsFromModel$2$2(VertexConsumer instance, + PoseStack.Pose poseEntry, BakedQuad quad, + float red, float green, float blue, + int combinedLight, int combinedOverlay) { + if (!GTShaders.canUseBloomShader()) return true; + + RenderType currentRenderType = gtceu$currentRenderType_thr.get().getCurrent(); + int[] combinedLights = new int[] { combinedLight, combinedLight, combinedLight, combinedLight }; + + return BloomMetadataSection.shouldDrawQuad(quad, currentRenderType, combinedLights); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java new file mode 100644 index 00000000000..b761efe878f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java @@ -0,0 +1,18 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraftforge.client.model.lighting.QuadLighter; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(QuadLighter.class) +public interface QuadLighterAccessor { + + @Invoker + int callCalculateLightmap(float[] position, byte[] normal); + + @Accessor + BlockAndTintGetter getLevel(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java deleted file mode 100644 index 92c1281b824..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; - -import com.gregtechceu.gtceu.client.bloom.BloomUtil; - -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraftforge.client.model.lighting.QuadLighter; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.*; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(value = QuadLighter.class, remap = false) -public class QuadLighterMixin { - - @WrapOperation(method = "process", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", - remap = true)) - private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - BloomUtil.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { - original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); - }); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java new file mode 100644 index 00000000000..021a4006835 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java @@ -0,0 +1,24 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; + +import net.minecraft.client.renderer.RenderType; + +import com.google.common.collect.ImmutableList; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(RenderType.class) +public class RenderTypeMixin { + + @ModifyExpressionValue(method = "", + at = @At(value = "INVOKE", + target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", + remap = false)) + private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { + return ImmutableList.builder() + .addAll(original).add(GTRenderTypes.bloom()) + .build(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 08439d3f1ec..e20821106a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -1,117 +1,32 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; -import net.caffeinemc.mods.sodium.api.util.ColorARGB; -import net.caffeinemc.mods.sodium.api.util.NormI8; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.world.phys.Vec3; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadOrientation; import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; -import me.jellysquid.mods.sodium.client.util.ModelQuadUtil; -import org.embeddedt.embeddium.render.chunk.ChunkColorWriter; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @Mixin(value = BlockRenderer.class, remap = false) public class BlockRendererMixin { - @Shadow - private boolean useReorienting; - - @Shadow - @Final - private ChunkVertexEncoder.Vertex[] vertices; - - @Shadow - @Final - private ChunkColorWriter colorEncoder; - - @WrapOperation(method = "renderQuadList", + @WrapWithCondition(method = "renderQuadList", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) - private void gtceu$captureBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder builder, - Vec3 offset, Material material, BakedQuadView quad, - int[] colors, QuadLightData light, Operation original) { - SectionPos chunkOrigin = SectionPos.of(ctx.pos()); - // Check if quad is full brightness OR we have bloom enabled for the quad - // TODO improve, don't mixin to embeddium, maybe ask for an API? doubt we'll get it though - if (GTShaders.canUseBloomShader() && gtceu$hasBloom(quad, light)) { - ModelQuadOrientation orientation = this.useReorienting ? - ModelQuadOrientation.orientByBrightness(light.br, light.lm) : ModelQuadOrientation.NORMAL; - - for (int dstIndex = 0; dstIndex < 4; ++dstIndex) { - int srcIndex = orientation.getVertexIndex(dstIndex); - int color = this.colorEncoder.writeColor( - ModelQuadUtil.mixARGBColors(colors[srcIndex], quad.getColor(srcIndex)), light.br[srcIndex]); - float u = quad.getTexU(srcIndex); - float v = quad.getTexV(srcIndex); - int lightUv = ModelQuadUtil.mergeBakedLight(quad.getLight(srcIndex), light.lm[srcIndex]); - int normal = quad.getForgeNormal(dstIndex); - - BloomUtil.getOrStartBloomBuffer(chunkOrigin) - .vertex(ctx.origin().x() + quad.getX(srcIndex) + (float) offset.x(), - ctx.origin().y() + quad.getY(srcIndex) + (float) offset.y(), - ctx.origin().z() + quad.getZ(srcIndex) + (float) offset.z(), - ColorARGB.unpackRed(color) / 255.0f, - ColorARGB.unpackGreen(color) / 255.0f, - ColorARGB.unpackBlue(color) / 255.0f, - ColorARGB.unpackAlpha(color) / 255.0f, - u, v, - OverlayTexture.NO_OVERLAY, - lightUv, - NormI8.unpackX(normal), - NormI8.unpackY(normal), - NormI8.unpackZ(normal)); - } - } - - original.call(instance, ctx, builder, offset, material, quad, colors, light); - } - - @Unique - private static boolean gtceu$hasBloom(BakedQuadView quad, QuadLightData light) { - if (!quad.hasShade() || !quad.hasAmbientOcclusion()) { - return true; - } - if (BloomMetadataSection.hasBloom(quad.getSprite())) { - return true; - } - - // do not apply bloom to emissive quads if this config is off - // same check is done for vanilla quads in BloomMetadataSection - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { - return false; - } - for (int i = 0; i < 4; i++) { - int quadLight = quad.getLight(i); - int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); - - int ambientLight = light.lm[i]; - int aBlock = LightTexture.block(ambientLight), aSky = LightTexture.sky(ambientLight); + private boolean gtceu$captureBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder builder, + Vec3 offset, Material material, BakedQuadView quad, + int[] colors, QuadLightData light) { + if (!GTShaders.canUseBloomShader()) return true; - if (qBlock > aBlock || qSky > aSky) { - return true; - } - } - return false; + return BloomMetadataSection.shouldDrawQuad((BakedQuad) quad, ctx.renderLayer(), light.lm); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java new file mode 100644 index 00000000000..f489cf54794 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java @@ -0,0 +1,45 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; + +import net.minecraft.client.renderer.RenderType; + +import com.google.common.collect.ImmutableMap; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import org.apache.commons.lang3.ArrayUtils; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.List; +import java.util.Map; + +@Mixin(value = DefaultTerrainRenderPasses.class, remap = false) +public class DefaultTerrainRenderPassesMixin { + + // spotless:off + @Definition(id = "ALL", field = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;ALL:[Lme/jellysquid/mods/sodium/client/render/chunk/terrain/TerrainRenderPass;") + // @Definition(id = "TerrainRenderPass", type = TerrainRenderPass.class) + @Expression("ALL = @(?)") // technically quite brittle. I don't think it matters much here, though. + @ModifyExpressionValue(method = "", at = @At("MIXINEXTRAS:EXPRESSION")) + private static TerrainRenderPass[] gtceu$forceAddBloomToTerrainRenderPasses(TerrainRenderPass[] original) { + return ArrayUtils.add(original, GTEmbeddiumCompat.BLOOM_RENDER_PASS); + } + + @Definition(id = "RENDER_PASS_MAPPINGS", field = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;RENDER_PASS_MAPPINGS:Ljava/util/Map;") + // @Definition(id = "Map", type = Map.class) + // @Definition(id = "of", method = "Ljava/util/Map;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;") + @Expression("RENDER_PASS_MAPPINGS = @(?)") // technically quite brittle. I don't think it matters much here, though. + @ModifyExpressionValue(method = "", at = @At("MIXINEXTRAS:EXPRESSION")) + private static Map> gtceu$forceAddBloomToTerrainRenderPasses(Map> original) { + return ImmutableMap.>builder() + .putAll(original) + .put(GTRenderTypes.bloom(), List.of(GTEmbeddiumCompat.BLOOM_RENDER_PASS)) + .build(); + } + // spotless:on +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/ContextualObjectHelper.java b/src/main/java/com/gregtechceu/gtceu/core/util/ContextualObjectHelper.java new file mode 100644 index 00000000000..0ffd11397a7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/util/ContextualObjectHelper.java @@ -0,0 +1,19 @@ +package com.gregtechceu.gtceu.core.util; + +import lombok.Getter; + +public class ContextualObjectHelper implements AutoCloseable { + + @Getter + private T current; + + public ContextualObjectHelper with(T object) { + this.current = object; + return this; + } + + @Override + public void close() { + this.current = null; + } +} 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 51e2a978db0..b63bdc496e0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,15 +1,22 @@ package com.gregtechceu.gtceu.integration.embeddium; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { + public static final TerrainRenderPass BLOOM_RENDER_PASS = TerrainRenderPass.builder() + .layer(GTRenderTypes.bloom()) + .fragmentDiscard(true) + .build(); + public static void init() { MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 8e53bbe0fa2..b5f8ae68343 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -25,14 +25,17 @@ "client.PlayerInfoAccessor", "client.VariantDeserializerMixin", "client.VertexConsumerMixin", + "client.bloom.ForgeModelBlockRendererMixin", + "client.bloom.LevelRendererMixin", "client.bloom.ModelBlockRendererMixin", "client.bloom.PostChainAccessor", "client.bloom.PostChainMixin", + "client.bloom.QuadLighterAccessor", + "client.bloom.RenderTypeMixin", "client.bloom.VertexBufferAccessor", - "client.bloom.QuadLighterMixin", - "client.bloom.LevelRendererMixin", "dev.client.KeyboardHandlerMixin", "embeddium.BlockRendererMixin", + "embeddium.DefaultTerrainRenderPassesMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", From b57bf190a8e75130fa1d833bfaf49cbd6f6391c9 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 15:54:13 +0300 Subject: [PATCH 157/269] Shader formatting changes --- .../gtceu/shaders/post/bloom_unity.json | 12 ++-- .../gtceu/shaders/post/bloom_unreal.json | 20 +++--- .../assets/gtceu/shaders/program/blur.fsh | 2 + .../assets/gtceu/shaders/program/blur.json | 8 +-- .../gtceu/shaders/program/down_sampling.fsh | 68 +++++++++---------- .../shaders/program/filter_bloom_color.fsh | 13 ++-- .../shaders/program/filter_bloom_color.json | 4 +- .../gtceu/shaders/program/unity_composite.fsh | 3 +- .../shaders/program/unity_composite.json | 10 +-- .../shaders/program/unreal_composite.json | 8 +-- .../gtceu/shaders/program/up_sampling.fsh | 14 ++-- 11 files changed, 83 insertions(+), 79 deletions(-) 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 81c2dc60970..bdaa985d790 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -1,6 +1,6 @@ { "targets": [ - "gtceu:filter_temp", + "filter", { "name": "swap2a", "bilinear": true @@ -36,10 +36,10 @@ { "name": "gtceu:filter_bloom_color", "intarget": "final", - "outtarget": "gtceu:filter_temp", + "outtarget": "filter", "auxtargets": [ - { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, @@ -94,10 +94,10 @@ }, { "name": "gtceu:unity_composite", - "intarget": "swap", + "intarget": "swap",w "outtarget": "final", "auxtargets": [ - { "id": "gtceu:filter_temp", "name": "HighlightSampler" }, + { "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 0e69ed16d6f..7448b103c12 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -1,6 +1,6 @@ { "targets": [ - "gtceu:filter_temp", + "filter", { "name": "swap2a", "bilinear": true @@ -39,16 +39,16 @@ { "name": "gtceu:filter_bloom_color", "intarget": "final", - "outtarget": "gtceu:filter_temp", + "outtarget": "filter", "auxtargets": [ - { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, + { "id": "final:depth", "name": "DiffuseDepthSampler" }, + { "id": "minecraft:main", "name": "MainSampler" }, { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, { "name": "gtceu:blur", - "intarget": "gtceu:filter_temp", + "intarget": "filter", "outtarget": "swap2a", "uniforms": [ { @@ -171,11 +171,11 @@ "intarget": "minecraft:main", "outtarget": "final", "auxtargets": [ - { "id": "gtceu:filter_temp", "name": "HighlightSampler" }, - { "id": "swap2b", "name": "BlurTexture1" }, - { "id": "swap4b", "name": "BlurTexture2" }, - { "id": "swap8b", "name": "BlurTexture3" }, - { "id": "swap16b", "name": "BlurTexture4" } + { "id": "filter", "name": "HighlightSampler" }, + { "id": "swap2b", "name": "BlurTexture1" }, + { "id": "swap4b", "name": "BlurTexture2" }, + { "id": "swap8b", "name": "BlurTexture3" }, + { "id": "swap16b", "name": "BlurTexture4" } ], "uniforms": [ { "name": "BloomRadius", "values": [1.0] } diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.fsh b/src/main/resources/assets/gtceu/shaders/program/blur.fsh index b8a8a5a3f78..c83ee396225 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/blur.fsh @@ -33,9 +33,11 @@ void main() { float x = float(i); float w = gaussianPdf(x, Radius); vec2 uvOffset = BlurDir * invSize * x; + // sample both +x and -x offsets vec4 sample1 = texture(DiffuseSampler, texCoord + uvOffset); vec4 sample2 = texture(DiffuseSampler, texCoord - uvOffset); + diffuseSum += (sample1 + sample2) * w; weightSum += 2.0 * w; } diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.json b/src/main/resources/assets/gtceu/shaders/program/blur.json index 52f8b6285ba..74a79b6b8bd 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.json +++ b/src/main/resources/assets/gtceu/shaders/program/blur.json @@ -11,9 +11,9 @@ { "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": "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 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh index fce0f2a9781..88c0f6d77a8 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh @@ -1,5 +1,7 @@ #version 150 +#define OUTPUT_SCALE_FACTOR (0.25 * 0.25 * 0.125) + uniform sampler2D DiffuseSampler; uniform vec2 OutSize; uniform vec2 InSize; @@ -19,41 +21,39 @@ vec2 outTexelNegX = vec2(-outTexel.x, outTexel.y); vec2 outTexelNegY = vec2(outTexel.x, -outTexel.y); vec4 four_k(vec2 uv) { - return 0.25 * ( - texture(DiffuseSampler, uv + inTexel) // 1 1 - + texture(DiffuseSampler, uv + inTexelNegX) // -1 1 - + texture(DiffuseSampler, uv + inTexelNegY) // 1 -1 - + texture(DiffuseSampler, uv - inTexel)); // -1 -1 + return texture(DiffuseSampler, uv + inTexel) // 1 1 + + texture(DiffuseSampler, uv + inTexelNegX) // -1 1 + + texture(DiffuseSampler, uv + inTexelNegY) // 1 -1 + + texture(DiffuseSampler, uv - inTexel); // -1 -1 } void main() { - fragColor = 0.25 * 0.125 * ( - four_k(texCoord - outTexel) // -1 -1 - + four_k(texCoord - outTexelX) // -1 0 - + four_k(texCoord - outTexelY) // 0 -1 - + four_k(texCoord)); // 0 0 - - fragColor += 0.25 * 0.125 * ( - four_k(texCoord + outTexelNegY) // 1 -1 - + four_k(texCoord - outTexelY) // 0 -1 - + four_k(texCoord + outTexelX) // 1 0 - + four_k(texCoord)); // 0 0 - - fragColor += 0.25 * 0.125 * ( - four_k(texCoord + outTexelNegX) // -1 1 - + four_k(texCoord - outTexelX) // -1 0 - + four_k(texCoord + outTexelY) // 0 1 - + four_k(texCoord)); // 0 0 - - fragColor += 0.25 * 0.125 * ( - four_k(texCoord + outTexel) // 1 1 - + four_k(texCoord + outTexelX) // 1 0 - + four_k(texCoord + outTexelY) // 0 1 - + four_k(texCoord)); // 0 0 - - fragColor += 0.25 * 0.125 * ( - four_k(texCoord + outTexel) // 1 1 - + four_k(texCoord + outTexelNegX) // -1 1 - + four_k(texCoord + outTexelNegY) // 1 -1 - + four_k(texCoord - outTexel)); // -1 -1 + fragColor = four_k(texCoord - outTexel) // -1 -1 + + four_k(texCoord - outTexelX) // -1 0 + + four_k(texCoord - outTexelY) // 0 -1 + + four_k(texCoord); // 0 0 + + fragColor += four_k(texCoord + outTexelNegY) // 1 -1 + + four_k(texCoord - outTexelY) // 0 -1 + + four_k(texCoord + outTexelX) // 1 0 + + four_k(texCoord); // 0 0 + + fragColor += four_k(texCoord + outTexelNegX) // -1 1 + + four_k(texCoord - outTexelX) // -1 0 + + four_k(texCoord + outTexelY) // 0 1 + + four_k(texCoord); // 0 0 + + fragColor += four_k(texCoord + outTexel) // 1 1 + + four_k(texCoord + outTexelX) // 1 0 + + four_k(texCoord + outTexelY) // 0 1 + + four_k(texCoord); // 0 0 + + fragColor += four_k(texCoord + outTexel) // 1 1 + + four_k(texCoord + outTexelNegX) // -1 1 + + four_k(texCoord + outTexelNegY) // 1 -1 + + four_k(texCoord - outTexel); // -1 -1 + + // Optimization: do multiplication in one step at the end + // They used to be done separately on each addition to fragColor (and in four_k) + fragColor *= OUTPUT_SCALE_FACTOR; } 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 e082dab15cc..13e2ba614a8 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 @@ -6,10 +6,10 @@ uniform sampler2D MainSampler; uniform sampler2D MainDepthSampler; uniform bool EnableFilter; -// from GameRenderer.PROJECTION_Z_NEAR +// GameRenderer.PROJECTION_Z_NEAR uniform float DepthNear = 0.05; -// from GameRenderer#getDepthFar -uniform float DepthFar = 482.0; +// GameRenderer#getDepthFar; 8 chunk render distance -> 8 * 16 * 4 +uniform float DepthFar = 512.0; in vec2 texCoord; @@ -28,11 +28,12 @@ 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 buffer's depth isn't the same as the bloom buffer's depth + // clear bloom color fragment if the main sampler's depth isn't the same as the bloom sampler's depth if (abs(mainDepth - diffuseDepth) > 0.01) { fragColor = vec4(0.0); - } else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { - // also clear it if the main buffer's color is off by too much + } + // also clear it if the main sampler's color is off by too much + else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { fragColor = vec4(0.0); } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 35db19d9bc5..f3648a16410 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -16,8 +16,8 @@ "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": "EnableFilter", "type": "int", "count": 1, "values": [ 1 ] }, + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 0 ] }, { "name": "DepthNear", "type": "float", "count": 1, "values": [ 0.05 ] }, - { "name": "DepthFar", "type": "float", "count": 1, "values": [ 32.0 ] } + { "name": "DepthFar", "type": "float", "count": 1, "values": [ 512.0 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh index 81bced4d6de..efe8a927568 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh @@ -20,6 +20,7 @@ void main() { float min = min(background.r, min(background.g, background.b)); float max = max(background.r, max(background.g, background.b)); + float backgroundBrightness = (max + min) / 2.0; - fragColor = vec4(background.rgb + bloom.rgb * ((1.0 - (max + min) / 2.0) * (MaxBrightness - MinBrightness) + MinBrightness + BaseBrightness), 1.0); + fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json index aaf6be1545c..c8a8df1a683 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -14,10 +14,10 @@ ], "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": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, - { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "MaxBrightness", "type": "float", "count": 1, "values": [ 1.3 ] }, - { "name": "MinBrightness", "type": "float", "count": 1, "values": [ 0.3 ] } + { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, + { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.1 ] }, + { "name": "MaxBrightness", "type": "float", "count": 1, "values": [ 0.5 ] }, + { "name": "MinBrightness", "type": "float", "count": 1, "values": [ 0.2 ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index 2b37f86dbb5..df2de69bc5b 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -16,9 +16,9 @@ { "name": "BlurTexture4" } ], "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": "BloomRadius", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] } + { "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": "BloomRadius", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh index 2e8606de50f..4254a8ece2a 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh @@ -15,19 +15,19 @@ vec2 outTexelNegX = vec2(-outTexel.x, outTexel.y); vec2 outTexelNegY = vec2(outTexel.x, -outTexel.y); void main() { - vec4 out_color = texture(DiffuseSampler, texCoord) * 4.0; // 0 0 + vec4 out_color = texture(DiffuseSampler, texCoord) * 4.0; // 0 0 - out_color += texture(DiffuseSampler, texCoord + outTexel); // 1 1 - out_color += texture(DiffuseSampler, texCoord + outTexelNegX); // -1 1 - out_color += texture(DiffuseSampler, texCoord + outTexelNegY); // 1 -1 - out_color += texture(DiffuseSampler, texCoord - outTexel); // -1 -1 + out_color += texture(DiffuseSampler, texCoord + outTexel); // 1 1 + out_color += texture(DiffuseSampler, texCoord + outTexelNegX); // -1 1 + out_color += texture(DiffuseSampler, texCoord + outTexelNegY); // 1 -1 + out_color += texture(DiffuseSampler, texCoord - outTexel); // -1 -1 out_color += texture(DiffuseSampler, texCoord + outTexelX) * 2.0; // 1 0 out_color += texture(DiffuseSampler, texCoord - outTexelX) * 2.0; // -1 0 out_color += texture(DiffuseSampler, texCoord + outTexelY) * 2.0; // 0 1 out_color += texture(DiffuseSampler, texCoord - outTexelY) * 2.0; // 0 -1 - vec3 total = out_color.rgb * 0.8 / 16.0 + texture(DownTexture, texCoord).rgb * 0.8; + vec4 total = out_color * 0.8 / 16.0 + texture(DownTexture, texCoord) * 0.8; total = clamp(total, 0.0, 1.0); - fragColor = vec4(total, 1.0); + fragColor = total; } From d615bea94129f3893941dcaef954fad80b1df952 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 15:54:50 +0300 Subject: [PATCH 158/269] Use a different (nicer) tonemap for unreal type bloom --- .../shaders/program/unreal_composite.fsh | 71 +++++++++++++++---- .../shaders/program/unreal_composite.json | 3 + 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh index 8e49a73448e..8374937cdba 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -8,9 +8,9 @@ uniform sampler2D BlurTexture3; uniform sampler2D BlurTexture4; uniform float BloomRadius; uniform float BloomStrength; -//uniform float BaseBrightness; -//uniform float MaxBrightness; -//uniform float MinBrightness; +uniform float BaseBrightness; +uniform float MaxBrightness; +uniform float MinBrightness; in vec2 texCoord; out vec4 fragColor; @@ -20,22 +20,69 @@ float lerpBloomFactor(float factor) { return mix(factor, mirrorFactor, BloomRadius); } -vec3 jodieReinhardTonemap(vec3 c) { - float l = dot(c, vec3(0.2126, 0.7152, 0.0722)); - vec3 tc = c / (c + 1.0); +// from https://www.shadertoy.com/view/4dBcD1 +vec3 jodieReinhard2(const vec3 color) { + float luma = dot(color, vec3(.2126, .7152, .0722)); - return mix(c / (l + 1.0), tc, tc); + // tonemap curve goes on this line + // (I used reinhard here) + vec4 rgbl = vec4(color, luma) / (luma + 1.); + + vec3 mappedColor = rgbl.rgb; + float mappedLuma = rgbl.a; + + float channelMax = max(max(max( + mappedColor.r, + mappedColor.g), + mappedColor.b), + 1.); + + // this is just the simplified/optimised math + // of the more human readable version below + return ( + (mappedLuma * mappedColor - mappedColor) - + (channelMax * mappedLuma - mappedLuma) + ) / (mappedLuma - channelMax); + +/* + const vec3 white = vec3(1); + + // prevent clipping + vec3 clampedColor = mappedColor / channelMax; + + // x is how much white needs to be mixed with + // clampedColor so that its luma equals the + // mapped luma + // + // mix(mappedLuma/channelMax,1.,x) = mappedLuma; + // + // mix is defined as + // x*(1-a)+y*a + // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mix.xhtml + // + // (mappedLuma/channelMax)*(1.-x)+1.*x = mappedLuma + + float x = (mappedLuma - mappedLuma * channelMax) + / (mappedLuma - channelMax); + return mix(clampedColor, white, x); +*/ } void main() { vec4 bloom = BloomStrength * ( - lerpBloomFactor(1.0) * texture(BlurTexture1, texCoord) + - lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + - lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + - lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); + lerpBloomFactor(1.0) * texture(BlurTexture1, texCoord) + + lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + + lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + + lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); + bloom.rgb = jodieReinhard2(bloom.rgb); vec4 background = texture(DiffuseSampler, texCoord); vec4 highlight = texture(HighlightSampler, texCoord); background.rgb = background.rgb * (1 - highlight.a) + highlight.a * highlight.rgb; - fragColor = vec4(background.rgb + jodieReinhardTonemap(bloom.rgb), 1.0); + + float min = min(background.r, min(background.g, background.b)); + float max = max(background.r, max(background.g, background.b)); + float backgroundBrightness = (max + min) / 2.0; + + fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index df2de69bc5b..a943b487580 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -20,5 +20,8 @@ { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, { "name": "BloomRadius", "type": "float", "count": 1, "values": [ 1.0 ] }, { "name": "BloomStrength", "type": "float", "count": 1, "values": [ 1.7 ] }, + { "name": "BaseBrightness", "type": "float", "count": 1, "values": [ 0.1 ] }, + { "name": "MaxBrightness", "type": "float", "count": 1, "values": [ 0.5 ] }, + { "name": "MinBrightness", "type": "float", "count": 1, "values": [ 0.2 ] } ] } From 6088652c65890e0aaaa5def86008c19ea9ed01b0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 15:55:08 +0300 Subject: [PATCH 159/269] Better blend function for post shaders, they draw over existing pixels anyway --- src/main/resources/assets/gtceu/shaders/program/blur.json | 6 ++++-- .../assets/gtceu/shaders/program/down_sampling.json | 8 +++++--- .../assets/gtceu/shaders/program/filter_bloom_color.json | 6 ++++-- .../assets/gtceu/shaders/program/unity_composite.json | 6 ++++-- .../assets/gtceu/shaders/program/unreal_composite.json | 6 ++++-- .../assets/gtceu/shaders/program/up_sampling.json | 6 ++++-- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.json b/src/main/resources/assets/gtceu/shaders/program/blur.json index 74a79b6b8bd..8a1ed353426 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.json +++ b/src/main/resources/assets/gtceu/shaders/program/blur.json @@ -1,8 +1,10 @@ { "blend": { "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:blur", diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json index 77c4446fc88..244807fae30 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json @@ -1,8 +1,10 @@ { "blend": { - "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:down_sampling", diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index f3648a16410..a6a31c4e6e1 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -1,8 +1,10 @@ { "blend": { "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:filter_bloom_color", diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json index c8a8df1a683..411ff0180fa 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -1,8 +1,10 @@ { "blend": { "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:unity_composite", diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index a943b487580..011e688ca50 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -1,8 +1,10 @@ { "blend": { "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:unreal_composite", diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json index 6929a93c508..1ada000f1e3 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -1,8 +1,10 @@ { "blend": { "func": "add", - "srcrgb": "one", - "dstrgb": "zero" + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:up_sampling", From 5e38c6c51bfef02e14f1082b92ec70c49874f3d8 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 16:27:41 +0300 Subject: [PATCH 160/269] Custom core shader for bloom (currently a copy of cutout) --- .../client/bloom/BloomEventListeners.java | 4 +- .../gtceu/client/renderer/GTRenderTypes.java | 11 +++-- .../gtceu/client/shader/GTShaders.java | 19 ++++++++- .../client/bloom/LevelRendererMixin.java | 4 +- .../gtceu/shaders/core/rendertype_bloom.fsh | 26 ++++++++++++ .../gtceu/shaders/core/rendertype_bloom.json | 30 ++++++++++++++ .../gtceu/shaders/core/rendertype_bloom.vsh | 32 +++++++++++++++ .../shaders/core/rendertype_entity_bloom.fsh | 30 ++++++++++++++ .../shaders/core/rendertype_entity_bloom.json | 34 ++++++++++++++++ .../shaders/core/rendertype_entity_bloom.vsh | 40 +++++++++++++++++++ 10 files changed, 222 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.fsh create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.json create mode 100644 src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.vsh 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 abf4a1a0415..1462e5f5fa2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -20,6 +20,8 @@ import lombok.experimental.UtilityClass; +import java.io.IOException; + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) @UtilityClass public class BloomEventListeners { @@ -65,7 +67,7 @@ public static void onLevelUnload(LevelEvent.Unload event) { public static class ModBus { @SubscribeEvent - public void registerShaders(RegisterShadersEvent event) { + public void registerShaders(RegisterShadersEvent event) throws IOException { GTShaders.onRegisterShaders(event); } 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 74ffd7f7704..c97f68e6d14 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -31,6 +31,8 @@ public class GTRenderTypes extends RenderType { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }); + protected static final RenderStateShard.ShaderStateShard RENDERTYPE_BLOOM_SHADER = new RenderStateShard.ShaderStateShard(GTShaders::getRendertypeBloomShader); + protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_BLOOM_SHADER = new RenderStateShard.ShaderStateShard(GTShaders::getRendertypeEntityBloomShader); private static final RenderType LIGHT_RING = RenderType.create("light_ring", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, RenderType.SMALL_BUFFER_SIZE, false, false, @@ -42,19 +44,20 @@ public class GTRenderTypes extends RenderType { private static final RenderType BLOOM = RenderType.create("gtceu:bloom", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, false, false, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_BLOOM_SHADER) + .setOutputState(BLOOM_TARGET) .setLightmapState(LIGHTMAP) - .setShaderState(RENDERTYPE_CUTOUT_SHADER) .setTextureState(BLOCK_SHEET_MIPPED) - .setOutputState(BLOOM_TARGET) .createCompositeState(false)); private static final Function ENTITY_BLOOM = Util.memoize((texture) -> { return create("gtceu:entity_bloom", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, RenderType.TRANSIENT_BUFFER_SIZE, true, false, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_CUTOUT_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) + .setShaderState(RENDERTYPE_ENTITY_BLOOM_SHADER) + .setOutputState(BLOOM_TARGET) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) + .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .createCompositeState(false)); }); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 680e623b0fe..db17f486fdd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -8,6 +8,7 @@ import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.PostChain; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -15,6 +16,9 @@ import com.google.gson.JsonSyntaxException; import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -25,10 +29,23 @@ public class GTShaders { public static BloomAlgorithm BLOOM_TYPE = ConfigHolder.INSTANCE.client.shader.bloomAlgorithm; public static RenderTarget BLOOM_TARGET = null; - public static void onRegisterShaders(RegisterShadersEvent event) { + @Getter + private static @Nullable ShaderInstance rendertypeBloomShader; + @Getter + private static @Nullable ShaderInstance rendertypeEntityBloomShader; + + public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { if (!canLoadBloomShader()) { return; } + event.registerShader(new ShaderInstance(event.getResourceProvider(), + GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), + shader -> rendertypeBloomShader = shader); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), + GTCEu.id("rendertype_entity_bloom"), DefaultVertexFormat.NEW_ENTITY), + shader -> rendertypeEntityBloomShader = shader); + initPostShaders(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index e0b83b77b8a..02cc5974c29 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -49,10 +49,10 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt } } - @Expression("this.renderChunkLayer(tripwire(), ?, ?, ?, ?, ?)") @Definition(id = "renderChunkLayer", method = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V") @Definition(id = "tripwire", method = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;") - @Inject(method = "renderLevel", at = @At("MIXINEXTRAS:EXPRESSION")) + @Expression("this.renderChunkLayer(tripwire(), ?, ?, ?, ?, ?)") + @Inject(method = "renderLevel", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh new file mode 100644 index 00000000000..758edb55dae --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.fsh @@ -0,0 +1,26 @@ +#version 150 + +#moj_import + +uniform sampler2D Sampler0; + +uniform vec4 ColorModulator; +uniform float FogStart; +uniform float FogEnd; +uniform vec4 FogColor; + +in float vertexDistance; +in vec4 vertexColor; +in vec2 texCoord0; +in vec4 normal; + +out vec4 fragColor; + +void main() { + vec4 color = texture(Sampler0, texCoord0); + if (color.a < 0.1) { + discard; + } + color *= vertexColor * ColorModulator; + fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); +} diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json new file mode 100644 index 00000000000..4550883d022 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.json @@ -0,0 +1,30 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:rendertype_bloom", + "fragment": "gtceu:rendertype_bloom", + "attributes": [ + "Position", + "Color", + "UV0", + "UV2", + "Normal" + ], + "samplers": [ + { "name": "Sampler0" }, + { "name": "Sampler2" } + ], + "uniforms": [ + { "name": "ModelViewMat", "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": "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": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, + { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, + { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh new file mode 100644 index 00000000000..39cfe866331 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_bloom.vsh @@ -0,0 +1,32 @@ +#version 150 + +#moj_import +#moj_import + +in vec3 Position; +in vec4 Color; +in vec2 UV0; +in ivec2 UV2; +in vec3 Normal; + +uniform sampler2D Sampler2; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; +uniform vec3 ChunkOffset; +uniform int FogShape; + +out float vertexDistance; +out vec4 vertexColor; +out vec2 texCoord0; +out vec4 normal; + +void main() { + vec3 pos = Position + ChunkOffset; + gl_Position = ProjMat * ModelViewMat * vec4(pos, 1.0); + + vertexDistance = fog_distance(ModelViewMat, pos, FogShape); + vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); + texCoord0 = UV0; + normal = ProjMat * ModelViewMat * vec4(Normal, 0.0); +} 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 new file mode 100644 index 00000000000..9f35ffb944d --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.fsh @@ -0,0 +1,30 @@ +#version 150 + +#moj_import + +uniform sampler2D Sampler0; + +uniform vec4 ColorModulator; +uniform float FogStart; +uniform float FogEnd; +uniform vec4 FogColor; + +in float vertexDistance; +in vec4 vertexColor; +in vec4 lightMapColor; +in vec4 overlayColor; +in vec2 texCoord0; +in vec4 normal; + +out vec4 fragColor; + +void main() { + vec4 color = texture(Sampler0, texCoord0); + 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/core/rendertype_entity_bloom.json b/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.json new file mode 100644 index 00000000000..8d2c550e87f --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.json @@ -0,0 +1,34 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtceu:rendertype_entity_bloom", + "fragment": "gtceu:rendertype_entity_bloom", + "attributes": [ + "Position", + "Color", + "UV0", + "UV1", + "UV2", + "Normal" + ], + "samplers": [ + { "name": "Sampler0" }, + { "name": "Sampler1" }, + { "name": "Sampler2" } + ], + "uniforms": [ + { "name": "ModelViewMat", "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": "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": "IViewRotMat", "type": "matrix3x3", "count": 9, "values": [ 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "Light0_Direction", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, + { "name": "Light1_Direction", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, + { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, + { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } + ] +} diff --git a/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.vsh b/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.vsh new file mode 100644 index 00000000000..955095d9366 --- /dev/null +++ b/src/main/resources/assets/gtceu/shaders/core/rendertype_entity_bloom.vsh @@ -0,0 +1,40 @@ +#version 150 + +#moj_import +#moj_import + +in vec3 Position; +in vec4 Color; +in vec2 UV0; +in ivec2 UV1; +in ivec2 UV2; +in vec3 Normal; + +uniform sampler2D Sampler1; +uniform sampler2D Sampler2; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; +uniform mat3 IViewRotMat; +uniform int FogShape; + +uniform vec3 Light0_Direction; +uniform vec3 Light1_Direction; + +out float vertexDistance; +out vec4 vertexColor; +out vec4 lightMapColor; +out vec4 overlayColor; +out vec2 texCoord0; +out vec4 normal; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + + vertexDistance = fog_distance(ModelViewMat, IViewRotMat * Position, FogShape); + vertexColor = minecraft_mix_light(Light0_Direction, Light1_Direction, Normal, Color); + lightMapColor = texelFetch(Sampler2, UV2 / 16, 0); + overlayColor = texelFetch(Sampler1, UV1, 0); + texCoord0 = UV0; + normal = ProjMat * ModelViewMat * vec4(Normal, 0.0); +} From b4979fa319bf127d6a0fde8e0b9b2c0333dcbb92 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 16:28:46 +0300 Subject: [PATCH 161/269] remove non-updating BLOOM_TYPE field in GTShaders so it can be changed while the game is running --- .../gregtechceu/gtceu/client/shader/GTShaders.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index db17f486fdd..f549202454a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -26,7 +26,6 @@ public class GTShaders { public static PostChain BLOOM_CHAIN = null; - public static BloomAlgorithm BLOOM_TYPE = ConfigHolder.INSTANCE.client.shader.bloomAlgorithm; public static RenderTarget BLOOM_TARGET = null; @Getter @@ -57,7 +56,7 @@ private static void initPostShaders() { ResourceLocation id = null; - switch (BLOOM_TYPE) { + switch (ConfigHolder.INSTANCE.client.shader.bloomAlgorithm) { case UNITY -> id = GTCEu.id("shaders/post/bloom_unity.json"); case UNREAL -> id = GTCEu.id("shaders/post/bloom_unreal.json"); case DISABLED -> { @@ -68,7 +67,6 @@ private static void initPostShaders() { if (id == null) { GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomAlgorithm); ConfigHolder.INSTANCE.client.shader.bloomAlgorithm = BloomAlgorithm.DISABLED; - BLOOM_TYPE = BloomAlgorithm.DISABLED; return; } @@ -78,12 +76,12 @@ private static void initPostShaders() { BLOOM_CHAIN = new PostChain(mc.getTextureManager(), mc.getResourceManager(), mc.getMainRenderTarget(), id); BLOOM_CHAIN.resize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); BLOOM_TARGET = BLOOM_CHAIN.getTempTarget("final"); - } catch (IOException ioexception) { - GTCEu.LOGGER.error("Failed to load shader: {}", id, ioexception); + } catch (IOException e) { + GTCEu.LOGGER.error("Failed to load shader: {}", id, e); BLOOM_CHAIN = null; BLOOM_TARGET = null; - } catch (JsonSyntaxException jsonsyntaxexception) { - GTCEu.LOGGER.error("Failed to parse shader: {}", id, jsonsyntaxexception); + } catch (JsonSyntaxException e) { + GTCEu.LOGGER.error("Failed to parse shader: {}", id, e); BLOOM_CHAIN = null; BLOOM_TARGET = null; } From 439e40d52a1e89f3243b6dcf187a8ae24e09e177 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 16:29:05 +0300 Subject: [PATCH 162/269] Remove dynamic-only rendering method wrapping from ModelBlockRendererMixin --- .../client/bloom/ModelBlockRendererMixin.java | 62 +++++-------------- .../client/bloom/QuadLighterAccessor.java | 2 +- 2 files changed, 17 insertions(+), 47 deletions(-) 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 d090cfdec1f..a1f769d0c7d 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 @@ -33,64 +33,34 @@ public class ModelBlockRendererMixin { "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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", "tesselateWithoutAO(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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V" }, remap = false) - private static void gtceu$removeBloomyQuadsFromModel$1$1(BlockAndTintGetter level, BakedModel model, - BlockState state, BlockPos pos, PoseStack poseStack, - VertexConsumer consumer, boolean checkSides, - RandomSource random, long seed, int packedOverlay, - ModelData modelData, RenderType renderType, - Operation original) { - if (!GTShaders.canUseBloomShader()) return; - - try (var $ = gtceu$currentRenderType_thr.get().with(renderType)) { + private void gtceu$captureQuadRenderType$1(BlockAndTintGetter level, BakedModel model, BlockState state, + BlockPos pos, PoseStack poseStack, VertexConsumer consumer, + boolean checkSides, RandomSource random, long seed, int packedOverlay, + ModelData modelData, RenderType renderType, + Operation original) { + if (GTShaders.canUseBloomShader()) { + try (var $ = gtceu$currentRenderType_thr.get().with(renderType)) { + original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, + modelData, renderType); + } + } else { original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, modelData, renderType); } } - @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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", - remap = false) - private static void gtceu$removeBloomyQuadsFromModel$2$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) { - if (!GTShaders.canUseBloomShader()) return; - - try (var $ = gtceu$currentRenderType_thr.get().with(renderType)) { - original.call(pose, consumer, state, model, red, green, blue, packedLight, packedOverlay, - modelData, renderType); - } - } - @WrapWithCondition(method = "putQuadData", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") ) - private static boolean gtceu$skipBloomyQuadsFromModel$1$2(VertexConsumer instance, - PoseStack.Pose poseEntry, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, - boolean mulColor) { - if (!GTShaders.canUseBloomShader()) return true; - - RenderType currentRenderType = gtceu$currentRenderType_thr.get().getCurrent(); - - return BloomMetadataSection.shouldDrawQuad(quad, currentRenderType, combinedLights); - } - - @WrapWithCondition(method = "renderQuadList", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;FFFII)V") - ) - private static boolean gtceu$skipBloomyQuadsFromModel$2$2(VertexConsumer instance, - PoseStack.Pose poseEntry, BakedQuad quad, - float red, float green, float blue, - int combinedLight, int combinedOverlay) { + private boolean gtceu$skipBloomyQuadsFromModel$1$2(VertexConsumer instance, PoseStack.Pose poseEntry, + BakedQuad quad, float[] colorMuls, + float red, float green, float blue, + int[] combinedLights, int combinedOverlay, + boolean mulColor) { if (!GTShaders.canUseBloomShader()) return true; RenderType currentRenderType = gtceu$currentRenderType_thr.get().getCurrent(); - int[] combinedLights = new int[] { combinedLight, combinedLight, combinedLight, combinedLight }; return BloomMetadataSection.shouldDrawQuad(quad, currentRenderType, combinedLights); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java index b761efe878f..2212a46a2bd 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(QuadLighter.class) +@Mixin(value = QuadLighter.class, remap = false) public interface QuadLighterAccessor { @Invoker From 6a4c400913097d181832d33bdb9c551184d458cc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 16:29:20 +0300 Subject: [PATCH 163/269] Better config comments --- .../gregtechceu/gtceu/config/ConfigHolder.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index c06f9783e38..b0b3ca58842 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -836,36 +836,39 @@ public static class ShaderOptions { @Configurable.Comment({ "Bloom Algorithm", "UNITY - Unity-like Bloom (rescale)", "UNREAL - Unreal-like Bloom (gaussian blur)", + "DISABLED - No bloom", "Default: UNREAL" }) public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; @Configurable @Configurable.Comment({ "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", - "OUTPUT = BACKGROUND + BLOOM * strength * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*({HT}-LT)))", - "This value should be greater than lowBrightnessThreshold.", "Default: 0.5" }) + "This value should be greater than minBrightness.", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + min + (1 - BACKGROUND_BRIGHTNESS) * ({max} - min)))", + "Default: 0.5" }) @Configurable.DecimalRange(min = 0) public float maxBrightness = 0.5f; @Configurable @Configurable.Comment({ "The brightness after bloom should not smaller than this value. It can be used to limit the brightness of dusky parts (e.g., night/caves)", - "OUTPUT = BACKGROUND + BLOOM * strength * (base + {LT} + (1 - BACKGROUND_BRIGHTNESS)*(HT-{LT})))", - "This value should be smaller than highBrightnessThreshold.", "Default: 0.2" }) + "This value should be lower than maxBrightness.", + "OUTPUT = BACKGROUND + BLOOM * strength * (base + {min} + (1 - BACKGROUND_BRIGHTNESS) * (max - {min})))", + "Default: 0.2" }) @Configurable.DecimalRange(min = 0) public float minBrightness = 0.2f; @Configurable @Configurable.Comment({ "The base brightness of the bloom.", "It is similar to strength", - "This value should be smaller than highBrightnessThreshold.", - "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "This value should be lower than maxBrightness.", + "OUTPUT = BACKGROUND + BLOOM * strength * ({base} + min + (1 - BACKGROUND_BRIGHTNESS) * (max - min)))", "Default: 0.1" }) @Configurable.DecimalRange(min = 0) public float baseBrightness = 0.1f; @Configurable @Configurable.Comment({ "Bloom Strength", - "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + LT + (1 - BACKGROUND_BRIGHTNESS)*(HT-LT)))", + "OUTPUT = BACKGROUND + BLOOM * {strength} * (base + min + (1 - BACKGROUND_BRIGHTNESS) * (max - min)))", "Default: 1.5" }) @Configurable.DecimalRange(min = 0) public float strength = 1.5f; From 95278f508aa14e3e7a2609f7e9c4aa59a3625b27 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 18:05:56 +0300 Subject: [PATCH 164/269] Make game run --- .../embeddium/DefaultMaterialsMixin.java | 27 +++++++++++ .../mixins/iris/WorldRenderingPhaseMixin.java | 46 +++++++++++++++++++ .../embeddium/GTEmbeddiumCompat.java | 5 ++ .../integration/embeddium/package-info.java | 4 ++ .../embeddium/renderer/package-info.java | 4 ++ .../gtceu/integration/iris/IrisHooks.java | 21 +++++++++ .../gtceu/integration/iris/package-info.java | 4 ++ src/main/resources/gtceu.mixins.json | 2 + 8 files changed, 113 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/iris/IrisHooks.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java new file mode 100644 index 00000000000..b9e587bc591 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java @@ -0,0 +1,27 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium; + +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; + +import net.minecraft.client.renderer.RenderType; + +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = DefaultMaterials.class, remap = false) +public class DefaultMaterialsMixin { + + @Inject(method = "forRenderLayer", + at = @At(value = "NEW", target = "java/lang/IllegalArgumentException"), + cancellable = true) + private static void gtceu$checkForBloomLayer(RenderType renderType, + CallbackInfoReturnable cir) { + if (renderType == GTRenderTypes.bloom()) { + cir.setReturnValue(GTEmbeddiumCompat.BLOOM_MATERIAL); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java new file mode 100644 index 00000000000..e329b5cd50a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java @@ -0,0 +1,46 @@ +package com.gregtechceu.gtceu.core.mixins.iris; + +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.integration.iris.IrisHooks; + +import net.irisshaders.iris.pipeline.WorldRenderingPhase; +import net.minecraft.client.renderer.RenderType; + +import org.apache.commons.lang3.ArrayUtils; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Invoker; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = WorldRenderingPhase.class, remap = false) +public class WorldRenderingPhaseMixin { + @Shadow + @Final + @Mutable + private static WorldRenderingPhase[] $VALUES; + + @SuppressWarnings("SameParameterValue") + @Invoker("") + private static WorldRenderingPhase gtceu$callInit(String name, int ordinal) { + throw new AssertionError(); + } + + static { + IrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("BLOOM", $VALUES.length); + $VALUES = ArrayUtils.add($VALUES, IrisHooks.BLOOM_RENDERING_PHASE); + } + + @Inject(method = "fromTerrainRenderType", + at = @At(value = "NEW", target = "java/lang/IllegalStateException"), + cancellable = true) + private static void gtceu$checkForBloomLayer(RenderType renderType, + CallbackInfoReturnable cir) { + if (renderType == GTRenderTypes.bloom()) { + cir.setReturnValue(IrisHooks.BLOOM_RENDERING_PHASE); + } + } +} 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 b63bdc496e0..63560b00008 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -8,6 +8,8 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { @@ -16,6 +18,9 @@ public class GTEmbeddiumCompat { .layer(GTRenderTypes.bloom()) .fragmentDiscard(true) .build(); + public static final Material BLOOM_MATERIAL = new Material(BLOOM_RENDER_PASS, + AlphaCutoffParameter.ONE_TENTH, false); + public static void init() { MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/package-info.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/package-info.java new file mode 100644 index 00000000000..e7e62efcfd2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.integration.embeddium; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java new file mode 100644 index 00000000000..e26dd5bcbbd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.integration.embeddium.renderer; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/iris/IrisHooks.java b/src/main/java/com/gregtechceu/gtceu/integration/iris/IrisHooks.java new file mode 100644 index 00000000000..7e78c606962 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/iris/IrisHooks.java @@ -0,0 +1,21 @@ +package com.gregtechceu.gtceu.integration.iris; + +import net.irisshaders.iris.pipeline.WorldRenderingPhase; + +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +@UtilityClass +public class IrisHooks { + + /// Do not access directly, use {@link #getBloomRenderingPhase()} + @ApiStatus.Internal + public static @Nullable WorldRenderingPhase BLOOM_RENDERING_PHASE; + + public static WorldRenderingPhase getBloomRenderingPhase() { + return Objects.requireNonNull(BLOOM_RENDERING_PHASE, "BLOOM_PHASE == null"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java b/src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java new file mode 100644 index 00000000000..7ddda1a021e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.integration.iris; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index b5f8ae68343..ee621997f19 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -35,10 +35,12 @@ "client.bloom.VertexBufferAccessor", "dev.client.KeyboardHandlerMixin", "embeddium.BlockRendererMixin", + "embeddium.DefaultMaterialsMixin", "embeddium.DefaultTerrainRenderPassesMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", + "iris.WorldRenderingPhaseMixin", "ldlib.ModularWrapperWidgetMixin", "rei.FluidEntryRendererMixin", "xaerominimap.HighlighterRegistryMixin", From 14b892db0fe27705656297b0164d940580975dd4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 22:15:41 +0300 Subject: [PATCH 165/269] Make bloom metadata cache synchronized --- .../client/model/BloomMetadataSection.java | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java index 9b8f440588c..cbb361f1f3e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java @@ -1,13 +1,11 @@ package com.gregtechceu.gtceu.client.model; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.util.GTQuadTransformers; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.atlas.SpriteSource; @@ -17,9 +15,9 @@ import com.google.gson.JsonObject; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanMaps; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.function.Predicate; @@ -28,7 +26,9 @@ public record BloomMetadataSection(boolean bloom) { public static final String SECTION_NAME = GTCEu.MOD_ID; - public static final Object2BooleanMap KNOWN_BLOOM_TEXTURES = new Object2BooleanOpenHashMap<>(); + @ApiStatus.Internal + public static final Object2BooleanMap KNOWN_BLOOM_TEXTURES = Object2BooleanMaps.synchronize( + new Object2BooleanOpenHashMap<>()); public static boolean hasBloom(TextureAtlasSprite sprite) { ResourceLocation textureLoc = SpriteSource.TEXTURE_ID_CONVERTER.idToFile(sprite.contents().name()); @@ -78,21 +78,6 @@ public static boolean isEmissive(BakedQuad quad, int[] ambientPackedLights) { return false; } - /// Helper function for skipping bloom quads drawn with non-bloom render types - @ApiStatus.Internal - public static boolean shouldDrawQuad(BakedQuad quad, @Nullable RenderType renderType, int[] combinedLights) { - if (renderType == null) { - return true; - } - - if (renderType != GTRenderTypes.bloom() && renderType != GTRenderTypes.entityBloomBlockSheet() && - BloomMetadataSection.hasBloom(quad, combinedLights)) { - return false; - } - - return true; - } - public static class Serializer implements MetadataSectionSerializer { static BloomMetadataSection.Serializer INSTANCE = new BloomMetadataSection.Serializer(); From 98ea51ce9840f60fb4e2130ca40cab85580b2b1e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 23:06:02 +0300 Subject: [PATCH 166/269] Don't check full availability every frame smh --- .../client/bloom/BloomEventListeners.java | 5 + .../gtceu/client/shader/GTShaders.java | 35 ++- .../embeddium/GTEmbeddiumCompat.java | 4 +- .../embeddium/renderer/BloomMeshAppender.java | 16 +- .../gregtechceu/gtceu/utils/ArrayHelpers.java | 237 ++++++++++++++++++ .../ContextualObjectHelper.java | 2 +- 6 files changed, 284 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java rename src/main/java/com/gregtechceu/gtceu/{core/util => utils}/ContextualObjectHelper.java (88%) 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 1462e5f5fa2..d7aa1f91956 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -39,6 +39,11 @@ public static void onRenderTick(TickEvent.RenderTickEvent event) { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + GTShaders.updateShaderAvailability(event); + } + @SubscribeEvent public static void onChunkUnloadEvent(ChunkEvent.Unload event) { if (!GTShaders.canUseBloomShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index f549202454a..60dede1379a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.client.bloom.GameRendererAccessor; import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.client.Minecraft; @@ -13,11 +14,13 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterShadersEvent; +import net.minecraftforge.event.TickEvent; import com.google.gson.JsonSyntaxException; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import lombok.Getter; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -33,7 +36,11 @@ public class GTShaders { @Getter private static @Nullable ShaderInstance rendertypeEntityBloomShader; + @ApiStatus.Internal public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { + // forcefully update availability on reload + bloomShaderAvailable = updateBloomShaderAvailability(); + if (!canLoadBloomShader()) { return; } @@ -77,11 +84,15 @@ private static void initPostShaders() { BLOOM_CHAIN.resize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); BLOOM_TARGET = BLOOM_CHAIN.getTempTarget("final"); } catch (IOException e) { - GTCEu.LOGGER.error("Failed to load shader: {}", id, e); + GTCEu.LOGGER.error("Failed to load shader {}:", id, e); BLOOM_CHAIN = null; BLOOM_TARGET = null; } catch (JsonSyntaxException e) { - GTCEu.LOGGER.error("Failed to parse shader: {}", id, e); + GTCEu.LOGGER.error("Failed to parse shader {}:", id, e); + BLOOM_CHAIN = null; + BLOOM_TARGET = null; + } catch (RuntimeException e) { + GTCEu.LOGGER.error("Unexpected error loading shader {}:", id, e); BLOOM_CHAIN = null; BLOOM_TARGET = null; } @@ -92,8 +103,24 @@ public static boolean canUseBloomShader() { } private static boolean canLoadBloomShader() { - return ConfigHolder.INSTANCE.client.shader.enableBloom && - !GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && + return ConfigHolder.INSTANCE.client.shader.enableBloom && bloomShaderAvailable; + } + + private static boolean bloomShaderAvailable; + + @ApiStatus.Internal + public static void updateShaderAvailability(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.START) return; + + int tick = ((GameRendererAccessor) Minecraft.getInstance().gameRenderer).getTick(); + // only update bloom availability once a second so every frame isn't bogged down with mod loaded checks + if (tick % 20 != 0) return; + + bloomShaderAvailable = updateBloomShaderAvailability(); + } + + private static boolean updateBloomShaderAvailability() { + return !GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); } 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 63560b00008..60190bd604e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.integration.embeddium; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; @@ -28,7 +29,8 @@ public static void init() { @SubscribeEvent public static void registerChunkMeshAppenders(ChunkMeshEvent event) { - if (!GTShaders.canUseBloomShader()) { + if (!GTShaders.canUseBloomShader()) return; + if (!BloomUtil.chunkSectionHasBloomQuads(event.getSectionOrigin().asLong())) { return; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index b008205d0e0..d859d899e16 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.integration.embeddium.renderer; import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.SectionPos; -import net.minecraft.world.phys.Vec3; import org.embeddedt.embeddium.api.MeshAppender; @@ -14,13 +14,11 @@ public class BloomMeshAppender implements MeshAppender { @Override public void render(Context context) { - SectionPos sectionOrigin = context.sectionOrigin(); - if (!BloomUtil.BLOOM_BUFFER_BUILDERS.containsKey(sectionOrigin)) { - return; - } + SectionPos sectionPos = context.sectionOrigin(); + var vertexConsumerProvider = context.vertexConsumerProvider(); - Vec3 camPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); - BloomUtil.CURRENT_RENDERING_SECTION.set(sectionOrigin); - BloomUtil.bakeBloomChunkBuffers(sectionOrigin, camPos); + BloomUtil.drawBlockBloomForChunk(sectionPos.asLong(), + vertexConsumerProvider.apply(GTRenderTypes.bloom()), + vertexConsumerProvider.apply(RenderType.cutout())); } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java new file mode 100644 index 00000000000..b08c3269917 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java @@ -0,0 +1,237 @@ +package com.gregtechceu.gtceu.utils; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Array; +import java.util.Objects; + +import static org.apache.commons.lang3.ArrayUtils.*; + +@SuppressWarnings("ForLoopReplaceableByForEach") +public class ArrayHelpers { + + /** + * Returns a copy of the specified array object, deeply copying multidimensional arrays. + * If the specified object is null, the return value is null. + * + *

+ * Note: if the array object has an element type which is a reference type that is not an array type, + * the elements themselves are not deeply copied. This method only copies array objects. + * + * @param array the array object to deep copy + * @param the type of the array to deep copy + * @return a copy of the specified array object, deeply copying multidimensional arrays, or null if the object is + * null + */ + @Contract(value = "!null -> !null; null -> null", pure = true) + public static @Nullable T @Nullable [] deepCopy(@Nullable T @Nullable [] array) { + if (array == null) { + return null; + } + + Class componentType = array.getClass().getComponentType(); + + @SuppressWarnings("unchecked") + T[] copy = (T[]) Array.newInstance(componentType, array.length); + + if (componentType.isArray()) { + for (int i = 0; i < array.length; ++i) { + //noinspection unchecked + Array.set(copy, i, deepCopy((T[]) array[i])); + } + } else { + System.arraycopy(array, 0, copy, 0, array.length); + } + + return copy; + } + + public static boolean allMatch(boolean[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + boolean firstElement = array[0]; + if (array.length == 2) return firstElement == array[1]; + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement) { + return false; + } + } + return true; + } + + public static boolean allMatch(byte[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + byte firstElement = array[0]; + if (array.length == 2) return firstElement == array[1]; + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement) { + return false; + } + } + return true; + } + + public static boolean allMatch(char[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + char firstElement = array[0]; + if (array.length == 2) return firstElement == array[1]; + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement) { + return false; + } + } + return true; + } + + public static boolean allMatch(double[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + double firstElement = array[0]; + boolean searchNaN = Double.isNaN(firstElement); + + if (array.length == 2) return array[1] == firstElement || searchNaN && Double.isNaN(array[1]); + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement && !(searchNaN && Double.isNaN(array[i]))) { + return false; + } + } + + return false; + } + + public static boolean allMatch(double[] array, double tolerance) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + double firstElement = array[0]; + double min = firstElement - tolerance; + double max = firstElement + tolerance; + + if (array.length == 2) return array[1] >= min && array[1] <= max; + + for (int i = 0; i < array.length; ++i) { + if (array[i] < min || array[i] > max) { + return false; + } + } + return true; + } + + public static boolean allMatch(float[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + float firstElement = array[0]; + boolean searchNaN = Float.isNaN(firstElement); + + if (array.length == 2) return array[1] == firstElement || searchNaN && Float.isNaN(array[1]); + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement && !(searchNaN && Float.isNaN(array[i]))) { + return false; + } + } + + return false; + } + + public static boolean allMatch(float[] array, float tolerance) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + float firstElement = array[0]; + float min = firstElement - tolerance; + float max = firstElement + tolerance; + + if (array.length == 2) return array[1] >= min && array[1] <= max; + + for (int i = 0; i < array.length; ++i) { + if (array[i] < min && array[i] > max) { + return false; + } + } + return true; + } + + public static boolean allMatch(int[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + int firstElement = array[0]; + if (array.length == 2) return firstElement == array[1]; + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement) { + return false; + } + } + return true; + } + + public static boolean allMatch(long[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + long firstElement = array[0]; + if (array.length == 2) return firstElement == array[1]; + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement) { + return false; + } + } + return true; + } + + public static boolean allMatch(Object[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + Object firstElement = array[0]; + if (array.length == 2) return Objects.equals(array[1], firstElement); + + for (int i = 0; i < array.length; ++i) { + if (!Objects.equals(array[i], firstElement)) { + return false; + } + } + return true; + } + + public static boolean allMatch(short[] array) { + if (isEmpty(array) || array.length == 1) { + return true; + } + + short firstElement = array[0]; + if (array.length == 2) return firstElement == array[1]; + + for (int i = 0; i < array.length; ++i) { + if (array[i] != firstElement) { + return false; + } + } + return true; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/ContextualObjectHelper.java b/src/main/java/com/gregtechceu/gtceu/utils/ContextualObjectHelper.java similarity index 88% rename from src/main/java/com/gregtechceu/gtceu/core/util/ContextualObjectHelper.java rename to src/main/java/com/gregtechceu/gtceu/utils/ContextualObjectHelper.java index 0ffd11397a7..6ff3e811f41 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/util/ContextualObjectHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/ContextualObjectHelper.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.util; +package com.gregtechceu.gtceu.utils; import lombok.Getter; From d3ae8f0fd7bbb75e95de00c7c7b6273a97d52476 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 23:09:02 +0300 Subject: [PATCH 167/269] Much better quad capture functionality TODO: it has memory leaks. --- .../client/bloom/BloomEventListeners.java | 2 +- .../gtceu/client/bloom/BloomUtil.java | 325 +++++++----------- .../gtceu/core/IGTQuadLighter.java | 10 + .../bloom/ForgeModelBlockRendererMixin.java | 68 ++-- .../client/bloom/GameRendererAccessor.java | 13 + .../client/bloom/LevelRendererMixin.java | 20 +- .../client/bloom/ModelBlockRendererMixin.java | 46 +-- .../client/bloom/QuadLighterAccessor.java | 18 - .../mixins/client/bloom/QuadLighterMixin.java | 55 +++ .../mixins/client/bloom/RebuildTaskMixin.java | 71 ++++ .../mixins/embeddium/BlockRendererMixin.java | 57 ++- .../gtceu/core/util/CapturedQuadData.java | 29 ++ .../resources/META-INF/accesstransformer.cfg | 4 +- src/main/resources/gtceu.mixins.json | 4 +- 14 files changed, 412 insertions(+), 310 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/GameRendererAccessor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java 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 d7aa1f91956..1214d158534 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -57,7 +57,7 @@ public static void onChunkUnloadEvent(ChunkEvent.Unload event) { ChunkPos chunkPos = chunk.getPos(); for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { - BloomUtil.removeBloomChunk(SectionPos.of(chunkPos, y)); + BloomUtil.chunkSectionUnloaded(SectionPos.of(chunkPos, y)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 353f02d95dc..9efbc26ab5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -6,27 +6,28 @@ import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; -import com.gregtechceu.gtceu.core.mixins.client.bloom.VertexBufferAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.RenderLevelStageEvent; -import com.mojang.blaze3d.shaders.Uniform; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -34,26 +35,31 @@ import org.joml.Matrix4f; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; @OnlyIn(Dist.CLIENT) public class BloomUtil { - private static final Map<@Nullable IRenderSetup, List> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); + public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM_RENDER_STAGE; + + // always outside the world border + public static final long INVALID_SECTION_POS = SectionPos.asLong(60000000, 60000000, 60000000); + + private static final Map<@Nullable IRenderSetup, BloomRenderList> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); - public static Map BLOOM_BUFFERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); + @ApiStatus.Internal + private record QuadCacheEntry(BakedQuad quad, Matrix4f transformation, int[] packedLights, int packedOverlay, + float[] brightness, float tintR, float tintG, float tintB) { } - public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM_RENDER_STAGE; + /// @implNote values are {@link LinkedHashSet}s for iteration order stability + private static final Long2ObjectMap<@Nullable Set> TEMPORARY_RENDER_QUAD_CACHE = Long2ObjectMaps + .synchronize(new Long2ObjectOpenHashMap<>()); public static void init() {} @@ -203,26 +209,21 @@ public static void invalidateLevelTickets(LevelAccessor level) { public static void renderBloom(Camera camera, LevelRenderer levelRenderer, PoseStack poseStack, Matrix4f projectionMatrix, Frustum frustum, float partialTicks) { - if (!GTShaders.canUseBloomShader()) { - return; - } ProfilerFiller profiler = Minecraft.getInstance().getProfiler(); - Vec3 camPos = camera.getPosition(); GTRenderTypes.bloom().setupRenderState(); - profiler.popPush("gtceu:bloom"); + profiler.push("special"); preDraw(); if (!BLOOM_RENDERS.isEmpty()) { - EffectRenderContext context = EffectRenderContext.getInstance() - .update(camera, frustum, partialTicks); + EffectRenderContext context = EffectRenderContext.getInstance().update(camera, frustum, partialTicks); BLOOM_RENDER_LOCK.readLock().lock(); try { BLOOM_RENDERS.forEach((renderSetup, list) -> { BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - draw(poseStack, buffer, context, renderSetup, list); + list.draw(poseStack, buffer, context); }); } finally { BLOOM_RENDER_LOCK.readLock().unlock(); @@ -231,14 +232,6 @@ public static void renderBloom(Camera camera, LevelRenderer levelRenderer, postDraw(); } - /* shader uniforms are set up where this is called from - if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { - setupBloomShaderUniforms(true); - drawBlockBloom(poseStack, projectionMatrix, camPos); - } else { - setupBloomShaderUniforms(false); - } - */ // copy depth buffer from the main render target so bloom won't render through blocks // GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); @@ -246,7 +239,8 @@ public static void renderBloom(Camera camera, LevelRenderer levelRenderer, Minecraft.getInstance().getMainRenderTarget().bindWrite(false); VertexBuffer.unbind(); - // the profiler section is popped by popPush() in the calling method so we won't pop it here. + // pop the "special" profiler section before posting forge render stage event + profiler.pop(); // noinspection UnstableApiUsage ForgeHooksClient.dispatchRenderStage(AFTER_BLOOM_RENDER_STAGE, levelRenderer, @@ -260,7 +254,7 @@ private static void preDraw() { try { for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { if (!ticket.isValid()) continue; - BLOOM_RENDERS.computeIfAbsent(ticket.renderSetup, k -> new ArrayList<>()).add(ticket); + BLOOM_RENDERS.computeIfAbsent(ticket.renderSetup, BloomRenderList::new).add(ticket); } SCHEDULED_BLOOM_RENDERS.clear(); } finally { @@ -268,134 +262,15 @@ private static void preDraw() { } } - private static void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context, - @Nullable IRenderSetup renderSetup, List tickets) { - boolean initialized = false; - - for (BloomRenderTicket ticket : tickets) { - ticket.checkValidity(); - if (!ticket.isValid() || !ticket.render.shouldRenderBloomEffect(context)) continue; - - if (!initialized) { - initialized = true; - if (renderSetup != null) { - renderSetup.preDraw(buffer); - } - } - - poseStack.pushPose(); - poseStack.translate(-context.camPos().x(), -context.camPos().y(), -context.camPos().z()); - ticket.render.renderBloomEffect(poseStack, buffer, context); - poseStack.popPose(); - } - - if (initialized && renderSetup != null) { - renderSetup.postDraw(buffer); - } - } - private static void postDraw() { BLOOM_RENDER_LOCK.writeLock().lock(); try { - for (var it = BLOOM_RENDERS.values().iterator(); it.hasNext();) { - List list = it.next(); - - if (!list.isEmpty()) { - if (!list.removeIf(ticket -> { - ticket.checkValidity(); - return !ticket.isValid(); - }) || !list.isEmpty()) continue; - } - - it.remove(); - } + BLOOM_RENDERS.values().removeIf(BloomRenderList::postDraw); } finally { BLOOM_RENDER_LOCK.writeLock().unlock(); } } - public static void finishBloomBuffer(SectionPos pos, BufferBuilder builder) { - BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); - if (buffer == null) { - return; - } - - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - BLOOM_BUFFER_BUILDERS.remove(pos, builder); - BLOOM_BUFFER_SORT_STATES.put(pos, builder.getSortState()); - - if (RenderSystem.isOnRenderThread()) { - VertexBuffer vertexBuffer = BLOOM_BUFFERS.computeIfAbsent(pos, - $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - BloomUtil.uploadBloomBuffer(buffer, vertexBuffer); - } else { - RenderSystem.recordRenderCall(() -> { - VertexBuffer vertexBuffer = BLOOM_BUFFERS.computeIfAbsent(pos, - $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - BloomUtil.uploadBloomBuffer(buffer, vertexBuffer); - }); - } - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } - - public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, VertexBuffer buffer) { - if (!buffer.isInvalid()) { - buffer.bind(); - buffer.upload(builder); - VertexBuffer.unbind(); - } - } - - public static void removeBloomChunk(SectionPos origin) { - BLOOM_RENDER_LOCK.writeLock().lock(); - - try { - BLOOM_BUFFER_BUILDERS.remove(origin); - BLOOM_BUFFER_SORT_STATES.remove(origin); - VertexBuffer buffer = BLOOM_BUFFERS.remove(origin); - - if (buffer != null) { - if (!RenderSystem.isOnRenderThread()) { - RenderSystem.recordRenderCall(buffer::close); - } else { - buffer.close(); - } - } - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } - - public static BufferBuilder getOrStartBloomBuffer(SectionPos pos) { - BufferBuilder builder = BLOOM_BUFFER_BUILDERS.computeIfAbsent(pos, - $ -> new BufferBuilder(GTRenderTypes.bloom().bufferSize())); - if (!builder.building()) { - builder.begin(GTRenderTypes.bloom().mode(), GTRenderTypes.bloom().format()); - } - return builder; - } - - public static void bakeBloomChunkBuffers(SectionPos pos, Vec3 camPos) { - if (!GTShaders.canUseBloomShader()) { - return; - } - - BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(pos); - if (builder == null || !builder.building()) { - return; - } - builder.setQuadSorting(VertexSorting.byDistance((float) camPos.x() - pos.getX(), - (float) camPos.y() - pos.getY(), (float) camPos.z() - pos.getZ())); - - finishBloomBuffer(pos, builder); - } - - @ApiStatus.Internal - public static ThreadLocal<@Nullable SectionPos> CURRENT_RENDERING_SECTION = new ThreadLocal<>(); - private static final String FILTER_TOGGLE_UNIFORM = "EnableFilter"; private static final String DEPTH_NEAR_UNIFORM = "DepthNear"; private static final String DEPTH_FAR_UNIFORM = "DepthFar"; @@ -417,6 +292,7 @@ public static void setupBloomShaderUniforms(boolean drawBlockBloom) { PostPass pass = passes.get(i); EffectInstance shader = pass.getEffect(); + // TODO investigate if filter is required shader.safeGetUniform(FILTER_TOGGLE_UNIFORM).set(drawBlockBloom ? 1 : 0); shader.safeGetUniform(DEPTH_NEAR_UNIFORM).set(GameRenderer.PROJECTION_Z_NEAR); shader.safeGetUniform(DEPTH_FAR_UNIFORM).set(Minecraft.getInstance().gameRenderer.getDepthFar()); @@ -435,80 +311,69 @@ public static void setupBloomShaderUniforms(boolean drawBlockBloom) { } } - /// @return the shader to use for drawing block bloom. - private static ShaderInstance setupBlockShaderUniforms(PoseStack poseStack, Matrix4f projectionMatrix) { - ShaderInstance shader = RenderSystem.getShader(); - assert shader != null; - - for(int i = 0; i < 12; ++i) { - int textureId = RenderSystem.getShaderTexture(i); - shader.setSampler("Sampler" + i, textureId); - } - if (shader.MODEL_VIEW_MATRIX != null) shader.MODEL_VIEW_MATRIX.set(poseStack.last().pose()); - if (shader.PROJECTION_MATRIX != null) shader.PROJECTION_MATRIX.set(projectionMatrix); - if (shader.COLOR_MODULATOR != null) shader.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); - if (shader.GLINT_ALPHA != null) shader.GLINT_ALPHA.set(RenderSystem.getShaderGlintAlpha()); - if (shader.FOG_START != null) shader.FOG_START.set(RenderSystem.getShaderFogStart()); - if (shader.FOG_END != null) shader.FOG_END.set(RenderSystem.getShaderFogEnd()); - if (shader.FOG_COLOR != null) shader.FOG_COLOR.set(RenderSystem.getShaderFogColor()); - if (shader.FOG_SHAPE != null) shader.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); - if (shader.TEXTURE_MATRIX != null) shader.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); - if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); - - RenderSystem.setupShaderLights(shader); - shader.apply(); - - return shader; + public static boolean chunkSectionHasBloomQuads(long sectionPos) { + return TEMPORARY_RENDER_QUAD_CACHE.containsKey(sectionPos); } - private static void drawBlockBloom(PoseStack poseStack, Matrix4f projectionMatrix, Vec3 camPos) { - ShaderInstance shader = setupBlockShaderUniforms(poseStack, projectionMatrix); - Uniform chunkOffsetUniform = shader.CHUNK_OFFSET; + private static final ThreadLocal poseStack_tl = ThreadLocal.withInitial(PoseStack::new); + public static void drawBlockBloomForChunk(long sectionPos, + VertexConsumer bloomVertexConsumer, + VertexConsumer cutoutVertexConsumer) { BLOOM_RENDER_LOCK.readLock().lock(); try { - for (var entry : BLOOM_BUFFERS.entrySet()) { - SectionPos pos = entry.getKey(); - VertexBuffer buffer = entry.getValue(); - - // return early if buffer is invalid or has no vertex data bound - // VertexBuffer#mode's nullness is the easiest way to check this. - if (buffer.isInvalid() || ((VertexBufferAccessor) buffer).getMode() == null) { - continue; - } + Set quads = TEMPORARY_RENDER_QUAD_CACHE.remove(sectionPos); + if (quads == null) { + return; + } - if (chunkOffsetUniform != null) { - chunkOffsetUniform.set(SectionPos.sectionToBlockCoord(pos.getX()) - (float) camPos.x(), - SectionPos.sectionToBlockCoord(pos.getY()) - (float) camPos.y(), - SectionPos.sectionToBlockCoord(pos.getZ()) - (float) camPos.z()); - chunkOffsetUniform.upload(); - } + PoseStack poseStack = poseStack_tl.get(); + for (QuadCacheEntry quad : quads) { + poseStack.pushPose(); + // push the transformation & normal matrices directly into poseStack.last() + quad.transformation.get(poseStack.last().pose()); + quad.transformation.normal(poseStack.last().normal()); + + cutoutVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, + quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); + bloomVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, + quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); - buffer.bind(); - buffer.draw(); + poseStack.popPose(); } } finally { BLOOM_RENDER_LOCK.readLock().unlock(); } + } - if (chunkOffsetUniform != null) { - chunkOffsetUniform.set(0, 0, 0); + public static void chunkSectionUnloaded(SectionPos sectionPos) { + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + TEMPORARY_RENDER_QUAD_CACHE.remove(sectionPos.asLong()); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); } - shader.clear(); - VertexBuffer.unbind(); } - public static void copyToBloomBuffer(VertexConsumer originalVertexConsumer, BakedQuad quad, int[] combinedLights, - Consumer draw) { - draw.accept(originalVertexConsumer); - - if (!GTShaders.canUseBloomShader()) { + /// Helper function for skipping bloom quads drawn with non-bloom render types + @ApiStatus.Internal + public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderType, BlockPos pos, + @Nullable Matrix4f transformation, int[] packedLights, int packedOverlay, + float[] brightness, float tintR, float tintG, float tintB) { + if (renderType == null || renderType == GTRenderTypes.bloom() || + renderType == GTRenderTypes.entityBloomBlockSheet()) { return; } - SectionPos sectionOrigin = BloomUtil.CURRENT_RENDERING_SECTION.get(); - if (sectionOrigin != null && BloomMetadataSection.hasBloom(quad, combinedLights)) { - draw.accept(BloomUtil.getOrStartBloomBuffer(sectionOrigin)); + if (BloomMetadataSection.hasBloom(quad, packedLights)) { + if (transformation == null) { + transformation = new Matrix4f(); + transformation.translate(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15); + } + + TEMPORARY_RENDER_QUAD_CACHE.computeIfAbsent(SectionPos.asLong(pos), $ -> new LinkedHashSet<>()) + .add(new QuadCacheEntry(quad, transformation, packedLights, packedOverlay, + brightness, tintR, tintG, tintB)); } } @@ -551,4 +416,56 @@ private void checkValidity() { } } } + + private static class BloomRenderList extends ArrayList { + + private final @Nullable IRenderSetup renderSetup; + + private BloomRenderList(@Nullable IRenderSetup renderSetup) { + super(2); + this.renderSetup = renderSetup; + } + + private void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) { + boolean initialized = false; + + for (BloomRenderTicket ticket : this) { + ticket.checkValidity(); + if (!ticket.isValid() || !ticket.render.shouldRenderBloomEffect(context)) continue; + + if (!initialized) { + initialized = true; + if (this.renderSetup != null) { + this.renderSetup.preDraw(buffer); + } + } + + poseStack.pushPose(); + poseStack.translate(-context.camPos().x(), -context.camPos().y(), -context.camPos().z()); + ticket.render.renderBloomEffect(poseStack, buffer, context); + poseStack.popPose(); + } + + if (initialized && this.renderSetup != null) { + this.renderSetup.postDraw(buffer); + } + } + + /** + * Do post-draw cleanup such as removing invalidated draw tickets. + * + * @return Whether this list is empty and should thus be removed from the tracking map. + */ + private boolean postDraw() { + if (this.isEmpty()) return true; + + if (!this.removeIf(ticket -> { + ticket.checkValidity(); + return !ticket.isValid(); + })) { + return true; + } + return this.isEmpty(); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java b/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java new file mode 100644 index 00000000000..bb65c775946 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java @@ -0,0 +1,10 @@ +package com.gregtechceu.gtceu.core; + +import net.minecraft.client.renderer.RenderType; + +import org.jetbrains.annotations.Nullable; + +public interface IGTQuadLighter { + + void gtceu$setRenderType(RenderType currentRenderType); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java index 92bf7b5df61..9ac2047b9af 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java @@ -1,62 +1,48 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; -import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.IGTQuadLighter; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraftforge.client.model.IQuadTransformer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.lighting.ForgeModelBlockRenderer; import net.minecraftforge.client.model.lighting.QuadLighter; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(value = ForgeModelBlockRenderer.class, remap = false) public class ForgeModelBlockRendererMixin { - @WrapWithCondition(method = "render", - at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;process(Lcom/mojang/blaze3d/vertex/VertexConsumer;Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;I)V")) - private static boolean gtceu$skipBloomyQuadsFromModel(QuadLighter instance, VertexConsumer consumer, - PoseStack.Pose pose, BakedQuad quad, int overlay, - @Local RenderType renderType) { - if (!GTShaders.canUseBloomShader()) { - return true; + @Inject(method = "render", + at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;setup(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) + private static void gtceu$skipBloomyQuadsFromModel(VertexConsumer vertexConsumer, QuadLighter lighter, + BlockAndTintGetter level, BakedModel model, BlockState state, + BlockPos pos, PoseStack poseStack, boolean checkSides, + RandomSource rand, long seed, int packedOverlay, + ModelData modelData, RenderType renderType, + CallbackInfoReturnable cir, + @Local(name = "flatLighter") QuadLighter flatLighter) { + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + return; } - int[] combinedLights = gtceu$getAmbientLightmaps((QuadLighterAccessor) instance, quad); - - return BloomMetadataSection.shouldDrawQuad(quad, renderType, combinedLights); - } - - @Unique - private static int[] gtceu$getAmbientLightmaps(QuadLighterAccessor lighter, BakedQuad quad) { - int[] results = new int[4]; - - int[] vertices = quad.getVertices(); - for (int i = 0; i < 4; i++) { - int offset = i * IQuadTransformer.STRIDE; - float xPos = Float.intBitsToFloat(vertices[offset + IQuadTransformer.POSITION]); - float yPos = Float.intBitsToFloat(vertices[offset + IQuadTransformer.POSITION + 1]); - float zPos = Float.intBitsToFloat(vertices[offset + IQuadTransformer.POSITION + 2]); - - int packedNormal = vertices[offset + IQuadTransformer.NORMAL]; - byte xNormal = (byte) (packedNormal & 0xFF); - byte yNormal = (byte) ((packedNormal >> 8) & 0xFF); - byte zNormal = (byte) ((packedNormal >> 16) & 0xFF); - - float[] adjustedPosition = new float[] { - xPos - 0.5f + (xNormal / 127f * 0.5f), - yPos - 0.5f + (yNormal / 127f * 0.5f), - zPos - 0.5f + (zNormal / 127f * 0.5f) - }; - results[i] = lighter.callCalculateLightmap(adjustedPosition, new byte[] { xNormal, yNormal, zNormal }); + if (flatLighter != null) { + // this is always in the flatLighter init block + ((IGTQuadLighter) flatLighter).gtceu$setRenderType(renderType); + } else { + // and this _should_ always be outside of it + ((IGTQuadLighter) lighter).gtceu$setRenderType(renderType); } - - return results; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/GameRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/GameRendererAccessor.java new file mode 100644 index 00000000000..50d9a1a0bef --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/GameRendererAccessor.java @@ -0,0 +1,13 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import net.minecraft.client.renderer.GameRenderer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GameRenderer.class) +public interface GameRendererAccessor { + + @Accessor + int getTick(); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 02cc5974c29..5709a18935f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.core.SectionPos; +import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.phys.Vec3; import com.llamalad7.mixinextras.expression.Definition; @@ -32,16 +32,6 @@ public abstract class LevelRendererMixin { protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, Matrix4f projectionMatrix); - @Inject(method = "compileChunks", - at = @At(value = "INVOKE", - ordinal = 0, - target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) - private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, - @Local SectionPos chunkOrigin) { - BloomUtil.CURRENT_RENDERING_SECTION.set(chunkOrigin); - BloomUtil.bakeBloomChunkBuffers(chunkOrigin, camera.getPosition()); - } - @Inject(method = "resize", at = @At("TAIL")) private void gtceu$resize(int width, int height, CallbackInfo ci) { if (GTShaders.BLOOM_CHAIN != null) { @@ -57,7 +47,11 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci, - @Local Frustum frustum, @Local Vec3 camPos) { + @Local Frustum frustum, @Local Vec3 camPos, @Local ProfilerFiller profilerFiller) { + if (!GTShaders.canUseBloomShader()) return; + + profilerFiller.popPush("gtceu:bloom"); + if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { BloomUtil.setupBloomShaderUniforms(true); this.renderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); @@ -66,5 +60,7 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt } BloomUtil.renderBloom(camera, (LevelRenderer) (Object) this, poseStack, projectionMatrix, frustum, partialTick); + + // profiler section is popped by popPush() in the calling function; don't pop it here } } 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 a1f769d0c7d..d77195b0464 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 @@ -1,8 +1,10 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; -import com.gregtechceu.gtceu.client.model.BloomMetadataSection; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.core.util.ContextualObjectHelper; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.util.CapturedQuadData; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.ModelBlockRenderer; @@ -22,24 +24,25 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +@SuppressWarnings("SameReturnValue") @Mixin(ModelBlockRenderer.class) public class ModelBlockRendererMixin { @Unique - private static final ThreadLocal> gtceu$currentRenderType_thr = ThreadLocal - .withInitial(ContextualObjectHelper::new); + private static final ThreadLocal gtceu$currentRenderType_tl = ThreadLocal + .withInitial(CapturedQuadData::new); @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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", "tesselateWithoutAO(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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V" }, remap = false) - private void gtceu$captureQuadRenderType$1(BlockAndTintGetter level, BakedModel model, BlockState state, - BlockPos pos, PoseStack poseStack, VertexConsumer consumer, - boolean checkSides, RandomSource random, long seed, int packedOverlay, - ModelData modelData, RenderType renderType, - Operation original) { - if (GTShaders.canUseBloomShader()) { - try (var $ = gtceu$currentRenderType_thr.get().with(renderType)) { + private void gtceu$captureBloomQuads$1(BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, + PoseStack poseStack, VertexConsumer consumer, boolean checkSides, + RandomSource random, long seed, int packedOverlay, + ModelData modelData, RenderType renderType, + Operation original) { + if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom && GTShaders.canUseBloomShader()) { + try (var $ = gtceu$currentRenderType_tl.get().with(renderType, pos)) { original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, modelData, renderType); } @@ -53,15 +56,18 @@ public class ModelBlockRendererMixin { at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") ) - private boolean gtceu$skipBloomyQuadsFromModel$1$2(VertexConsumer instance, PoseStack.Pose poseEntry, - BakedQuad quad, float[] colorMuls, - float red, float green, float blue, - int[] combinedLights, int combinedOverlay, - boolean mulColor) { - if (!GTShaders.canUseBloomShader()) return true; - - RenderType currentRenderType = gtceu$currentRenderType_thr.get().getCurrent(); + private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] brightness, float red, float green, float blue, + int[] packedLights, int packedOverlay, boolean mulColor) { + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + return true; + } + CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); + // don't capture quads already on the bloom layer + if (currentData.renderType() == GTRenderTypes.bloom()) return true; - return BloomMetadataSection.shouldDrawQuad(quad, currentRenderType, combinedLights); + BloomUtil.captureBloomQuad(quad, currentData.renderType(), currentData.pos(), poseEntry.pose(), + packedLights, packedOverlay, brightness, red, green, blue); + return true; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java deleted file mode 100644 index 2212a46a2bd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; - -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraftforge.client.model.lighting.QuadLighter; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(value = QuadLighter.class, remap = false) -public interface QuadLighterAccessor { - - @Invoker - int callCalculateLightmap(float[] position, byte[] normal); - - @Accessor - BlockAndTintGetter getLevel(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java new file mode 100644 index 00000000000..f4d22e6fee9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java @@ -0,0 +1,55 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.IGTQuadLighter; + +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.BlockPos; +import net.minecraftforge.client.model.lighting.QuadLighter; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +@SuppressWarnings("SameReturnValue") +@Mixin(value = QuadLighter.class, remap = false) +public class QuadLighterMixin implements IGTQuadLighter { + + @Shadow + private BlockPos pos; + @Unique + private @Nullable RenderType gtceu$renderType; + + @WrapWithCondition(method = "process", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) + private boolean gtceu$skipBloomyQuadsFromModel(VertexConsumer instance, PoseStack.Pose poseEntry, + BakedQuad quad, float[] brightness, + float red, float green, float blue, + int[] packedLights, int packedOverlay, + boolean mulColor) { + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + return true; + } + // don't capture quads already on the bloom layer + if (this.gtceu$renderType == GTRenderTypes.bloom()) return true; + + BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), + packedLights, packedOverlay, brightness, red, green, blue); + return true; + } + + @Override + public void gtceu$setRenderType(RenderType currentRenderType) { + this.gtceu$renderType = currentRenderType; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java new file mode 100644 index 00000000000..f2c9aaae0fd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java @@ -0,0 +1,71 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; + +import net.minecraft.client.renderer.ChunkBufferBuilderPack; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.vertex.BufferBuilder; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Set; + +@Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") +abstract class RebuildTaskMixin { + + @Shadow(aliases = { "this$1", "f_290687_", "f" }) + @Final + ChunkRenderDispatcher.RenderChunk this$1; + + /* + @Definition(id = "chunkBufferBuilderPack", local = @Local(type = ChunkBufferBuilderPack.class, argsOnly = true)) + @Definition(id = "builder", method = "Lnet/minecraft/client/renderer/ChunkBufferBuilderPack;builder(Lnet/minecraft/client/renderer/RenderType;)Lcom/mojang/blaze3d/vertex/BufferBuilder;") + @Definition(id = "endOrDiscardIfEmpty", method = "Lcom/mojang/blaze3d/vertex/BufferBuilder;endOrDiscardIfEmpty()Lcom/mojang/blaze3d/vertex/BufferBuilder$RenderedBuffer;") + @Definition(id = "renderType1", local = @Local(type = RenderType.class)) + @Expression("@(chunkBufferBuilderPack.builder(renderType1)).endOrDiscardIfEmpty()") + @SuppressWarnings("NameDoesntMatchTargetClass") + @ModifyExpressionValue(method = "compile", at = @At("MIXINEXTRAS:EXPRESSION")) + private BufferBuilder gtceu$tryAddBlockEntity(BufferBuilder buffer, + @Local(ordinal = 0) BlockPos sectionOrigin, + @Local(ordinal = 0) RenderType renderType) { + if (renderType != GTRenderTypes.bloom()) return buffer; + + long sectionPos = SectionPos.asLong(sectionOrigin); + if (BloomUtil.chunkSectionHasBloomQuads(sectionPos)) { + BloomUtil.drawBlockBloomForChunk(sectionPos, buffer); + } + + return buffer; + } + */ + + @SuppressWarnings("NameDoesntMatchTargetClass") + @Inject(method = "compile", + at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", remap = false)) + private void gtceu$tryAddBlockEntity(float x, float y, float z, ChunkBufferBuilderPack chunkBufferBuilders, + CallbackInfoReturnable cir, + @Local(ordinal = 0) BlockPos sectionOrigin, + @Local Set usedRenderTypes) { + long sectionPos = SectionPos.asLong(sectionOrigin); + if (BloomUtil.chunkSectionHasBloomQuads(sectionPos)) { + BufferBuilder bloomBuffer = chunkBufferBuilders.builder(GTRenderTypes.bloom()); + // no existing geometry on this layer + if (usedRenderTypes.add(GTRenderTypes.bloom())) this$1.beginLayer(bloomBuffer); + + BufferBuilder cutoutBuffer = chunkBufferBuilders.builder(RenderType.cutout()); + if (usedRenderTypes.add(RenderType.cutout())) this$1.beginLayer(cutoutBuffer); + + BloomUtil.drawBlockBloomForChunk(sectionPos, bloomBuffer, cutoutBuffer); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index e20821106a6..f2c9749ce86 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -1,12 +1,21 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; -import com.gregtechceu.gtceu.client.model.BloomMetadataSection; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ArrayHelpers; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Direction; +import net.minecraft.util.FastColor; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.sugar.Local; +import me.jellysquid.mods.sodium.client.model.color.ColorProvider; +import me.jellysquid.mods.sodium.client.model.light.LightPipeline; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; @@ -15,18 +24,46 @@ import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; @Mixin(value = BlockRenderer.class, remap = false) public class BlockRendererMixin { - @WrapWithCondition(method = "renderQuadList", - at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) - private boolean gtceu$captureBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder builder, - Vec3 offset, Material material, BakedQuadView quad, - int[] colors, QuadLightData light) { - if (!GTShaders.canUseBloomShader()) return true; + @Inject(method = "renderQuadList", + at = @At(value = "INVOKE", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) + private void gtceu$captureBloomQuads(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 = "lightData") QuadLightData lightData, + @Local(name = "vertexColors") int[] vertexColors) { + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + return; + } + // don't capture quads that are already on the bloom layer + if (ctx.renderLayer() == GTRenderTypes.bloom()) return; + + float avgR = FastColor.ABGR32.red(vertexColors[0]); + float avgG = FastColor.ABGR32.green(vertexColors[0]); + float avgB = FastColor.ABGR32.blue(vertexColors[0]); + if (!ArrayHelpers.allMatch(vertexColors)) { + // only do the averaging if the vertex color isn't the same for all quads. + // I think this should be a pretty good optimization? + for (int i = 1; i < 4; i++) { + // Sodium has per-vertex quad tint in ABGR. Average it + avgR += FastColor.ABGR32.red(vertexColors[i]); + avgG += FastColor.ABGR32.green(vertexColors[i]); + avgB += FastColor.ABGR32.blue(vertexColors[i]); + } + avgR *= 0.25f; avgG *= 0.25f; avgB *= 0.25f; + } - return BloomMetadataSection.shouldDrawQuad((BakedQuad) quad, ctx.renderLayer(), light.lm); + BloomUtil.captureBloomQuad((BakedQuad) quad, ctx.renderLayer(), ctx.pos(), null, + lightData.lm, OverlayTexture.NO_OVERLAY, lightData.br, avgR / 255f, avgG / 255f, avgB / 255f); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java b/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java new file mode 100644 index 00000000000..cbca7d0b6e6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java @@ -0,0 +1,29 @@ +package com.gregtechceu.gtceu.core.util; + +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; + +import lombok.Getter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; + +@Accessors(fluent = true) +public class CapturedQuadData implements AutoCloseable { + + @Getter + private @Nullable RenderType renderType; + @Getter + private BlockPos pos; + + public CapturedQuadData with(RenderType renderType, BlockPos pos) { + this.renderType = renderType; + this.pos = pos; + return this; + } + + @Override + public void close() { + this.renderType = null; + this.pos = null; + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 84156bf357e..cb04f0d6f61 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -25,9 +25,7 @@ public net.minecraft.world.entity.Entity m_20115_(IZ)V # setSharedFlag public net.minecraft.world.entity.vehicle.Boat f_38285_ # DATA_ID_TYPE # for bloom -public net.minecraft.client.renderer.LevelRenderer$RenderChunkInfo -public net.minecraft.client.renderer.LevelRenderer$RenderChunkInfo f_109839_ # chunk -public net.minecraft.client.renderer.LevelRenderer$RenderInfoMap +public net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk m_112805_(Lcom/mojang/blaze3d/vertex/BufferBuilder;)V # beginLayer # for AE2 to be able to load (idk why but it needs these?) public net.minecraft.world.level.block.Blocks m_50774_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # always diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index ee621997f19..2d016541b3b 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -26,11 +26,13 @@ "client.VariantDeserializerMixin", "client.VertexConsumerMixin", "client.bloom.ForgeModelBlockRendererMixin", + "client.bloom.GameRendererAccessor", "client.bloom.LevelRendererMixin", "client.bloom.ModelBlockRendererMixin", "client.bloom.PostChainAccessor", "client.bloom.PostChainMixin", - "client.bloom.QuadLighterAccessor", + "client.bloom.QuadLighterMixin", + "client.bloom.RebuildTaskMixin", "client.bloom.RenderTypeMixin", "client.bloom.VertexBufferAccessor", "dev.client.KeyboardHandlerMixin", From aa6b04fc6fcb37b2664112e862feb0bb8feb9756 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 23:09:26 +0300 Subject: [PATCH 168/269] Fix post shaders. Again. --- .../gtceu/shaders/program/unity_composite.fsh | 2 +- .../shaders/program/unreal_composite.fsh | 31 ++----------------- 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh index efe8a927568..3059e925221 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh @@ -22,5 +22,5 @@ void main() { float max = max(background.r, max(background.g, background.b)); float backgroundBrightness = (max + min) / 2.0; - fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); + fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), background.a); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh index 8374937cdba..07c1c4c8647 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -31,11 +31,7 @@ vec3 jodieReinhard2(const vec3 color) { vec3 mappedColor = rgbl.rgb; float mappedLuma = rgbl.a; - float channelMax = max(max(max( - mappedColor.r, - mappedColor.g), - mappedColor.b), - 1.); + float channelMax = max(max(max(mappedColor.r, mappedColor.g), mappedColor.b), 1.0); // this is just the simplified/optimised math // of the more human readable version below @@ -43,29 +39,6 @@ vec3 jodieReinhard2(const vec3 color) { (mappedLuma * mappedColor - mappedColor) - (channelMax * mappedLuma - mappedLuma) ) / (mappedLuma - channelMax); - -/* - const vec3 white = vec3(1); - - // prevent clipping - vec3 clampedColor = mappedColor / channelMax; - - // x is how much white needs to be mixed with - // clampedColor so that its luma equals the - // mapped luma - // - // mix(mappedLuma/channelMax,1.,x) = mappedLuma; - // - // mix is defined as - // x*(1-a)+y*a - // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mix.xhtml - // - // (mappedLuma/channelMax)*(1.-x)+1.*x = mappedLuma - - float x = (mappedLuma - mappedLuma * channelMax) - / (mappedLuma - channelMax); - return mix(clampedColor, white, x); -*/ } void main() { @@ -84,5 +57,5 @@ void main() { float max = max(background.r, max(background.g, background.b)); float backgroundBrightness = (max + min) / 2.0; - fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); + fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), background.a); } From c487acbb2882d332fe2adc996c745707f2683ad1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 23:09:47 +0300 Subject: [PATCH 169/269] Go back to original Reinhard-jodie tonemapping --- .../gtceu/shaders/program/unreal_composite.fsh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh index 07c1c4c8647..57a266f3021 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -20,8 +20,14 @@ float lerpBloomFactor(float factor) { return mix(factor, mirrorFactor, BloomRadius); } -// from https://www.shadertoy.com/view/4dBcD1 -vec3 jodieReinhard2(const vec3 color) { +// from https://www.shadertoy.com/view/4dBcD1, explanation(s) there +vec3 jodieReinhardTonemap(vec3 color) { + float luma = dot(color, vec3(0.2126, 0.7152, 0.0722)); + vec3 tc = color / (color + 1.0); + + return mix(color / (luma + 1.0), tc, tc); +} +vec3 jodieReinhard2Tonemap(const vec3 color) { float luma = dot(color, vec3(.2126, .7152, .0722)); // tonemap curve goes on this line @@ -47,7 +53,7 @@ void main() { lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); - bloom.rgb = jodieReinhard2(bloom.rgb); + bloom.rgb = jodieReinhardTonemap(bloom.rgb); vec4 background = texture(DiffuseSampler, texCoord); vec4 highlight = texture(HighlightSampler, texCoord); From abb4f59c852fe806bdf6fca453f5e3c55653415b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 23:31:31 +0300 Subject: [PATCH 170/269] Simplify VertexConsumer aquisition --- .../gtceu/client/bloom/BloomUtil.java | 31 ++++++++++---- .../client/bloom/ModelBlockRendererMixin.java | 5 +-- .../mixins/client/bloom/QuadLighterMixin.java | 3 -- .../mixins/client/bloom/RebuildTaskMixin.java | 40 +++++-------------- .../mixins/embeddium/BlockRendererMixin.java | 3 -- .../embeddium/renderer/BloomMeshAppender.java | 7 +--- 6 files changed, 34 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 9efbc26ab5b..05b358aea9a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -37,6 +37,7 @@ import java.util.*; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -54,7 +55,8 @@ public class BloomUtil { private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); @ApiStatus.Internal - private record QuadCacheEntry(BakedQuad quad, Matrix4f transformation, int[] packedLights, int packedOverlay, + private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, + Matrix4f transformation, int[] packedLights, int packedOverlay, float[] brightness, float tintR, float tintG, float tintB) { } /// @implNote values are {@link LinkedHashSet}s for iteration order stability @@ -318,8 +320,7 @@ public static boolean chunkSectionHasBloomQuads(long sectionPos) { private static final ThreadLocal poseStack_tl = ThreadLocal.withInitial(PoseStack::new); public static void drawBlockBloomForChunk(long sectionPos, - VertexConsumer bloomVertexConsumer, - VertexConsumer cutoutVertexConsumer) { + Function vertexConsumerProvider) { BLOOM_RENDER_LOCK.readLock().lock(); try { Set quads = TEMPORARY_RENDER_QUAD_CACHE.remove(sectionPos); @@ -327,6 +328,9 @@ public static void drawBlockBloomForChunk(long sectionPos, return; } + VertexConsumer bloomVertexConsumer = null; + VertexConsumer cutoutVertexConsumer = null; + PoseStack poseStack = poseStack_tl.get(); for (QuadCacheEntry quad : quads) { poseStack.pushPose(); @@ -334,10 +338,21 @@ public static void drawBlockBloomForChunk(long sectionPos, quad.transformation.get(poseStack.last().pose()); quad.transformation.normal(poseStack.last().normal()); - cutoutVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, - quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); - bloomVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, - quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); + if (quad.renderType == GTRenderTypes.bloom()) { + if (cutoutVertexConsumer == null) + cutoutVertexConsumer = vertexConsumerProvider.apply(RenderType.cutout()); + + // copy quads that are already on the bloom layer to cutout + cutoutVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, + quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); + } else { + if (bloomVertexConsumer == null) + bloomVertexConsumer = vertexConsumerProvider.apply(GTRenderTypes.bloom()); + + // copy everything else to bloom + bloomVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, + quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); + } poseStack.popPose(); } @@ -372,7 +387,7 @@ public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderT } TEMPORARY_RENDER_QUAD_CACHE.computeIfAbsent(SectionPos.asLong(pos), $ -> new LinkedHashSet<>()) - .add(new QuadCacheEntry(quad, transformation, packedLights, packedOverlay, + .add(new QuadCacheEntry(quad, renderType, transformation, packedLights, packedOverlay, brightness, tintR, tintG, tintB)); } } 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 d77195b0464..89bc5160269 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 @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.util.CapturedQuadData; @@ -62,10 +61,8 @@ public class ModelBlockRendererMixin { if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return true; } - CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); - // don't capture quads already on the bloom layer - if (currentData.renderType() == GTRenderTypes.bloom()) return true; + CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); BloomUtil.captureBloomQuad(quad, currentData.renderType(), currentData.pos(), poseEntry.pose(), packedLights, packedOverlay, brightness, red, green, blue); return true; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java index f4d22e6fee9..a3ad00806cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.IGTQuadLighter; @@ -40,8 +39,6 @@ public class QuadLighterMixin implements IGTQuadLighter { if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return true; } - // don't capture quads already on the bloom layer - if (this.gtceu$renderType == GTRenderTypes.bloom()) return true; BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), packedLights, packedOverlay, brightness, red, green, blue); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java index f2c9aaae0fd..3f65c2b3ad5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; @@ -27,28 +26,6 @@ abstract class RebuildTaskMixin { @Final ChunkRenderDispatcher.RenderChunk this$1; - /* - @Definition(id = "chunkBufferBuilderPack", local = @Local(type = ChunkBufferBuilderPack.class, argsOnly = true)) - @Definition(id = "builder", method = "Lnet/minecraft/client/renderer/ChunkBufferBuilderPack;builder(Lnet/minecraft/client/renderer/RenderType;)Lcom/mojang/blaze3d/vertex/BufferBuilder;") - @Definition(id = "endOrDiscardIfEmpty", method = "Lcom/mojang/blaze3d/vertex/BufferBuilder;endOrDiscardIfEmpty()Lcom/mojang/blaze3d/vertex/BufferBuilder$RenderedBuffer;") - @Definition(id = "renderType1", local = @Local(type = RenderType.class)) - @Expression("@(chunkBufferBuilderPack.builder(renderType1)).endOrDiscardIfEmpty()") - @SuppressWarnings("NameDoesntMatchTargetClass") - @ModifyExpressionValue(method = "compile", at = @At("MIXINEXTRAS:EXPRESSION")) - private BufferBuilder gtceu$tryAddBlockEntity(BufferBuilder buffer, - @Local(ordinal = 0) BlockPos sectionOrigin, - @Local(ordinal = 0) RenderType renderType) { - if (renderType != GTRenderTypes.bloom()) return buffer; - - long sectionPos = SectionPos.asLong(sectionOrigin); - if (BloomUtil.chunkSectionHasBloomQuads(sectionPos)) { - BloomUtil.drawBlockBloomForChunk(sectionPos, buffer); - } - - return buffer; - } - */ - @SuppressWarnings("NameDoesntMatchTargetClass") @Inject(method = "compile", at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", remap = false)) @@ -57,15 +34,16 @@ abstract class RebuildTaskMixin { @Local(ordinal = 0) BlockPos sectionOrigin, @Local Set usedRenderTypes) { long sectionPos = SectionPos.asLong(sectionOrigin); - if (BloomUtil.chunkSectionHasBloomQuads(sectionPos)) { - BufferBuilder bloomBuffer = chunkBufferBuilders.builder(GTRenderTypes.bloom()); - // no existing geometry on this layer - if (usedRenderTypes.add(GTRenderTypes.bloom())) this$1.beginLayer(bloomBuffer); + if (!BloomUtil.chunkSectionHasBloomQuads(sectionPos)) { + return; + } - BufferBuilder cutoutBuffer = chunkBufferBuilders.builder(RenderType.cutout()); - if (usedRenderTypes.add(RenderType.cutout())) this$1.beginLayer(cutoutBuffer); + BloomUtil.drawBlockBloomForChunk(sectionPos, renderType -> { + BufferBuilder buffer = chunkBufferBuilders.builder(renderType); + // no existing geometry on this layer + if (usedRenderTypes.add(renderType)) this$1.beginLayer(buffer); - BloomUtil.drawBlockBloomForChunk(sectionPos, bloomBuffer, cutoutBuffer); - } + return buffer; + }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index f2c9749ce86..dd1e02578b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ArrayHelpers; @@ -45,8 +44,6 @@ public class BlockRendererMixin { if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return; } - // don't capture quads that are already on the bloom layer - if (ctx.renderLayer() == GTRenderTypes.bloom()) return; float avgR = FastColor.ABGR32.red(vertexColors[0]); float avgG = FastColor.ABGR32.green(vertexColors[0]); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java index d859d899e16..f523af480ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java @@ -14,11 +14,6 @@ public class BloomMeshAppender implements MeshAppender { @Override public void render(Context context) { - SectionPos sectionPos = context.sectionOrigin(); - var vertexConsumerProvider = context.vertexConsumerProvider(); - - BloomUtil.drawBlockBloomForChunk(sectionPos.asLong(), - vertexConsumerProvider.apply(GTRenderTypes.bloom()), - vertexConsumerProvider.apply(RenderType.cutout())); + BloomUtil.drawBlockBloomForChunk(context.sectionOrigin().asLong(), context.vertexConsumerProvider()); } } From 8819e410196598ef6ef6ddcfffb8e6e81f35f6f1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 26 Apr 2026 23:31:42 +0300 Subject: [PATCH 171/269] Fix unity-like bloom. Also fix filtering breaking stuff (?) --- .../java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java | 2 -- src/main/resources/assets/gtceu/shaders/post/bloom_unity.json | 4 ++-- .../assets/gtceu/shaders/program/filter_bloom_color.fsh | 4 ---- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 05b358aea9a..106547a79fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -23,7 +23,6 @@ import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.RenderLevelStageEvent; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; @@ -294,7 +293,6 @@ public static void setupBloomShaderUniforms(boolean drawBlockBloom) { PostPass pass = passes.get(i); EffectInstance shader = pass.getEffect(); - // TODO investigate if filter is required shader.safeGetUniform(FILTER_TOGGLE_UNIFORM).set(drawBlockBloom ? 1 : 0); shader.safeGetUniform(DEPTH_NEAR_UNIFORM).set(GameRenderer.PROJECTION_Z_NEAR); shader.safeGetUniform(DEPTH_FAR_UNIFORM).set(Minecraft.getInstance().gameRenderer.getDepthFar()); 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 bdaa985d790..c2e2ce61857 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -89,12 +89,12 @@ "intarget": "swap2b", "outtarget": "swap", "auxtargets": [ - { "id": "gtceu:filter_temp", "name": "DownTexture" } + { "id": "filter", "name": "DownTexture" } ] }, { "name": "gtceu:unity_composite", - "intarget": "swap",w + "intarget": "swap", "outtarget": "final", "auxtargets": [ { "id": "filter", "name": "HighlightSampler" }, 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 13e2ba614a8..d342ceba752 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 @@ -32,9 +32,5 @@ void main() { if (abs(mainDepth - diffuseDepth) > 0.01) { fragColor = vec4(0.0); } - // also clear it if the main sampler's color is off by too much - else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { - fragColor = vec4(0.0); - } } } From 25c8fadf7d7e1ddf8321c398d97330b7cdd8d025 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:58:54 +0300 Subject: [PATCH 172/269] Inject equals() & hashCode() impls into BakedQuad --- .../core/mixins/client/BakedQuadMixin.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java index ea2fadc9922..af17c07abcc 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java @@ -5,8 +5,9 @@ import net.minecraft.client.renderer.block.model.BakedQuad; import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.*; + +import java.util.Arrays; @Mixin(BakedQuad.class) public class BakedQuadMixin implements IGTBakedQuad { @@ -24,4 +25,33 @@ public class BakedQuadMixin implements IGTBakedQuad { public String gtceu$getTextureKey() { return gtceu$textureKey; } + + // @Intrinsic means this'll be skipped if someone else does it too + @Intrinsic + public boolean equals(Object o) { + if (!(o instanceof BakedQuad other)) return false; + return self().isShade() == other.isShade() && + self().hasAmbientOcclusion() == other.hasAmbientOcclusion() && + self().getTintIndex() == other.getTintIndex() && + self().getDirection() == other.getDirection() && + self().getSprite() == other.getSprite() && + Arrays.equals(self().getVertices(), other.getVertices()); + } + + @Intrinsic + public int hashCode() { + int result = Boolean.hashCode(self().isShade()); + result = 31 * result + Boolean.hashCode(self().hasAmbientOcclusion()); + result = 31 * result + self().getTintIndex(); + result = 31 * result + self().getDirection().hashCode(); + result = 31 * result + self().getSprite().hashCode(); + result = 31 * result + Arrays.hashCode(self().getVertices()); + + return result; + } + + @Intrinsic + private BakedQuad self() { + return (BakedQuad) (Object) this; + } } From a5e9ab1ee79d30eb6722e90c6c2b4e3ad26f6784 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:59:39 +0300 Subject: [PATCH 173/269] Simplify the post effects' intermediary render targets --- .../gtceu/shaders/post/bloom_unity.json | 72 +++++------------ .../gtceu/shaders/post/bloom_unreal.json | 77 ++++++------------- 2 files changed, 46 insertions(+), 103 deletions(-) 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 c2e2ce61857..c9a73aa7d9a 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -1,36 +1,11 @@ { "targets": [ - "filter", - { - "name": "swap2a", - "bilinear": true - }, - { - "name": "swap4a", - "bilinear": true - }, - { - "name": "swap8a", - "bilinear": true - }, - { - "name": "swap16a", - "bilinear": true - }, - { - "name": "swap2b", - "bilinear": true - }, - { - "name": "swap4b", - "bilinear": true - }, - { - "name": "swap8b", - "bilinear": true - }, "final", - "swap" + "filter", + { "name": "swap_a2", "bilinear": true }, + { "name": "swap_a4", "bilinear": true }, + { "name": "swap_1", "bilinear": true }, + { "name": "swap_2", "bilinear": true } ], "passes": [ { @@ -46,55 +21,50 @@ { "name": "blit", "intarget": "final", - "outtarget": "swap2a" + "outtarget": "swap_a2" }, { "name": "gtceu:down_sampling", - "intarget": "swap2a", - "outtarget": "swap4a" + "intarget": "swap_a2", + "outtarget": "swap_a4" }, { "name": "gtceu:down_sampling", - "intarget": "swap4a", - "outtarget": "swap8a" + "intarget": "swap_a4", + "outtarget": "swap_1" }, { "name": "gtceu:down_sampling", - "intarget": "swap8a", - "outtarget": "swap16a" - }, - { - "name": "blit", - "intarget": "swap16a", - "outtarget": "swap8b" + "intarget": "swap_1", + "outtarget": "swap_2" }, { "name": "gtceu:up_sampling", - "intarget": "swap8b", - "outtarget": "swap4b", + "intarget": "swap_2", + "outtarget": "swap_1", "auxtargets": [ - { "id": "swap4a", "name": "DownTexture" } + { "id": "swap_a4", "name": "DownTexture" } ] }, { "name": "gtceu:up_sampling", - "intarget": "swap4b", - "outtarget": "swap2b", + "intarget": "swap_1", + "outtarget": "swap_2", "auxtargets": [ - { "id": "swap2a", "name": "DownTexture" } + { "id": "swap_a2", "name": "DownTexture" } ] }, { "name": "gtceu:up_sampling", - "intarget": "swap2b", - "outtarget": "swap", + "intarget": "swap_2", + "outtarget": "swap_1", "auxtargets": [ { "id": "filter", "name": "DownTexture" } ] }, { "name": "gtceu:unity_composite", - "intarget": "swap", + "intarget": "swap_1", "outtarget": "final", "auxtargets": [ { "id": "filter", "name": "HighlightSampler" }, 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 7448b103c12..11488db164d 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -1,39 +1,12 @@ { "targets": [ + "final", "filter", - { - "name": "swap2a", - "bilinear": true - }, - { - "name": "swap4a", - "bilinear": true - }, - { - "name": "swap8a", - "bilinear": true - }, - { - "name": "swap16a", - "bilinear": true - }, - { - "name": "swap2b", - "bilinear": true - }, - { - "name": "swap4b", - "bilinear": true - }, - { - "name": "swap8b", - "bilinear": true - }, - { - "name": "swap16b", - "bilinear": true - }, - "final" + { "name": "swap", "bilinear": true }, + { "name": "swap_b1", "bilinear": true }, + { "name": "swap_b2", "bilinear": true }, + { "name": "swap_b3", "bilinear": true }, + { "name": "swap_b4", "bilinear": true } ], "passes": [ { @@ -49,7 +22,7 @@ { "name": "gtceu:blur", "intarget": "filter", - "outtarget": "swap2a", + "outtarget": "swap", "uniforms": [ { "name": "BlurDir", @@ -63,8 +36,8 @@ }, { "name": "gtceu:blur", - "intarget": "swap2a", - "outtarget": "swap2b", + "intarget": "swap", + "outtarget": "swap_b1", "uniforms": [ { "name": "BlurDir", @@ -78,8 +51,8 @@ }, { "name": "gtceu:blur", - "intarget": "swap2b", - "outtarget": "swap4a", + "intarget": "swap_b1", + "outtarget": "swap", "uniforms": [ { "name": "BlurDir", @@ -93,8 +66,8 @@ }, { "name": "gtceu:blur", - "intarget": "swap4a", - "outtarget": "swap4b", + "intarget": "swap", + "outtarget": "swap_b2", "uniforms": [ { "name": "BlurDir", @@ -108,8 +81,8 @@ }, { "name": "gtceu:blur", - "intarget": "swap4b", - "outtarget": "swap8a", + "intarget": "swap_b2", + "outtarget": "swap", "uniforms": [ { "name": "BlurDir", @@ -123,8 +96,8 @@ }, { "name": "gtceu:blur", - "intarget": "swap8a", - "outtarget": "swap8b", + "intarget": "swap", + "outtarget": "swap_b3", "uniforms": [ { "name": "BlurDir", @@ -138,8 +111,8 @@ }, { "name": "gtceu:blur", - "intarget": "swap8b", - "outtarget": "swap16a", + "intarget": "swap_b3", + "outtarget": "swap", "uniforms": [ { "name": "BlurDir", @@ -153,8 +126,8 @@ }, { "name": "gtceu:blur", - "intarget": "swap16a", - "outtarget": "swap16b", + "intarget": "swap", + "outtarget": "swap_b4", "uniforms": [ { "name": "BlurDir", @@ -172,10 +145,10 @@ "outtarget": "final", "auxtargets": [ { "id": "filter", "name": "HighlightSampler" }, - { "id": "swap2b", "name": "BlurTexture1" }, - { "id": "swap4b", "name": "BlurTexture2" }, - { "id": "swap8b", "name": "BlurTexture3" }, - { "id": "swap16b", "name": "BlurTexture4" } + { "id": "swap_b1", "name": "BlurTexture1" }, + { "id": "swap_b2", "name": "BlurTexture2" }, + { "id": "swap_b3", "name": "BlurTexture3" }, + { "id": "swap_b4", "name": "BlurTexture4" } ], "uniforms": [ { "name": "BloomRadius", "values": [1.0] } From 3d4312062b3cfc17d76a86334fba207cf5c07300 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 18:00:01 +0300 Subject: [PATCH 174/269] Add debug printouts for duplicate quads --- gradle/scripts/moddevgradle.gradle | 3 +++ .../gtceu/client/bloom/BloomUtil.java | 27 ++++++++++++++++--- .../client/RenderStateShardAccessor.java | 12 +++++++++ src/main/resources/gtceu.mixins.json | 1 + 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index 3f857566965..fe437d67c33 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -156,6 +156,9 @@ legacyForge { // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels logLevel = org.slf4j.event.Level.INFO + + // Disable JOML using scientific notation for its types' toString() outputs + systemProperty 'joml.format', 'false' } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 106547a79fb..309e7223c33 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -1,10 +1,12 @@ package com.gregtechceu.gtceu.client.bloom; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; import net.minecraft.client.Camera; @@ -56,7 +58,20 @@ public class BloomUtil { @ApiStatus.Internal private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, Matrix4f transformation, int[] packedLights, int packedOverlay, - float[] brightness, float tintR, float tintG, float tintB) { } + float[] brightness, float tintR, float tintG, float tintB) { + + @Override + public String toString() { + return "QuadCacheEntry{" + + "renderType=" + (renderType != null ? ((RenderStateShardAccessor) renderType).getName() : null) + + ", transformation=" + transformation + + ", packedLights=" + Arrays.toString(packedLights) + + ", packedOverlay=" + packedOverlay + + ", brightness=" + Arrays.toString(brightness) + + ", tint=[" + tintR + ", " + tintG + ", " + tintB + ']' + + '}'; + } + } /// @implNote values are {@link LinkedHashSet}s for iteration order stability private static final Long2ObjectMap<@Nullable Set> TEMPORARY_RENDER_QUAD_CACHE = Long2ObjectMaps @@ -383,10 +398,14 @@ public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderT transformation = new Matrix4f(); transformation.translate(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15); } + QuadCacheEntry entry = new QuadCacheEntry(quad, renderType, transformation, packedLights, packedOverlay, + brightness, tintR, tintG, tintB); - TEMPORARY_RENDER_QUAD_CACHE.computeIfAbsent(SectionPos.asLong(pos), $ -> new LinkedHashSet<>()) - .add(new QuadCacheEntry(quad, renderType, transformation, packedLights, packedOverlay, - brightness, tintR, tintG, tintB)); + Set sectionQuads = TEMPORARY_RENDER_QUAD_CACHE.computeIfAbsent(SectionPos.asLong(pos), + $ -> new LinkedHashSet<>()); + if (!sectionQuads.add(entry)) { + GTCEu.LOGGER.warn("Duplicate quad {} on block [{}]???", entry, pos.toShortString()); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java new file mode 100644 index 00000000000..09bc17fa799 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java @@ -0,0 +1,12 @@ +package com.gregtechceu.gtceu.core.mixins.client; + +import net.minecraft.client.renderer.RenderStateShard; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RenderStateShard.class) +public interface RenderStateShardAccessor { + + @Accessor("name") + String getName(); +} \ No newline at end of file diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 2d016541b3b..5b4e839ccd7 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -23,6 +23,7 @@ "client.ModelManagerMixin", "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", + "client.RenderStateShardAccessor", "client.VariantDeserializerMixin", "client.VertexConsumerMixin", "client.bloom.ForgeModelBlockRendererMixin", From c2c28a9b44ff3efb19c74d0bf98b2ad66bb8456d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 18:34:24 +0300 Subject: [PATCH 175/269] Clean up that 'ere toString output & actually implement equals() and hashCode() --- .../gtceu/client/bloom/BloomUtil.java | 48 +++++++++++++++++-- .../gtceu/utils/FormattingUtil.java | 47 +++++++++++++++++- 2 files changed, 90 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 309e7223c33..06269187c16 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; +import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -62,14 +63,53 @@ private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, @Override public String toString() { - return "QuadCacheEntry{" + + int[][] unpackedLights = Arrays.stream(packedLights) + .mapToObj(packed -> new int[]{ LightTexture.block(packed), LightTexture.sky(packed) }) + .toArray(int[][]::new); + + return "{ " + "renderType=" + (renderType != null ? ((RenderStateShardAccessor) renderType).getName() : null) + - ", transformation=" + transformation + - ", packedLights=" + Arrays.toString(packedLights) + + ", transformation=" + FormattingUtil.matrixToSingleLineString(transformation) + + ", lights=" + Arrays.deepToString(unpackedLights) + ", packedOverlay=" + packedOverlay + ", brightness=" + Arrays.toString(brightness) + ", tint=[" + tintR + ", " + tintG + ", " + tintB + ']' + - '}'; + " }"; + } + + @Override + public boolean equals(@Nullable Object o) { + if (o == null || getClass() != o.getClass()) return false; + + QuadCacheEntry that = (QuadCacheEntry) o; + return this.renderType == that.renderType && + this.packedOverlay() == that.packedOverlay && + Float.floatToIntBits(this.tintR) == Float.floatToIntBits(that.tintR) && + Float.floatToIntBits(this.tintG) == Float.floatToIntBits(that.tintG) && + Float.floatToIntBits(this.tintB) == Float.floatToIntBits(that.tintB) && + + this.transformation.equals(that.transformation) && + Arrays.equals(this.packedLights, that.packedLights) && + Arrays.equals(this.brightness, that.brightness) && + // quad is compared last because it has the slowest equals() + this.quad.equals(that.quad); + } + + @Override + public int hashCode() { + int result = this.quad.hashCode(); + result = 31 * result + Objects.hashCode(this.renderType); + result = 31 * result + this.transformation.hashCode(); + + result = 31 * result + Arrays.hashCode(this.packedLights); + result = 31 * result + this.packedOverlay; + + result = 31 * result + Arrays.hashCode(this.brightness); + result = 31 * result + Float.hashCode(this.tintR); + result = 31 * result + Float.hashCode(this.tintG); + result = 31 * result + Float.hashCode(this.tintB); + + return result; } } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java index caeaf139aed..5630ca570b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java @@ -10,6 +10,9 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; +import org.joml.Options; +import org.joml.Runtime; import java.math.BigInteger; import java.text.DecimalFormat; @@ -79,7 +82,7 @@ private static String checkNumbers(String string, int startIndex) { * * @param string Any string with ASCII characters. * @return A string that is all lowercase, with underscores inserted before word/number boundaries: - * + * *
      *         
{@code "maragingSteel300" -> "maraging_steel_300"} *
{@code "gtceu:maraging_steel_300" -> "gtceu:maraging_steel_300"} @@ -287,4 +290,46 @@ public static String formatTemperature(int temperature) { return formatNumbers(temperature - 273) + " °C"; else return formatNumbers(temperature) + " K"; } + + /** + * Return a single-line string representation of {@code matrix} using JOML's number formatting. + * + * @return the string representation + */ + public static String matrixToSingleLineString(Matrix4f matrix) { + String str = matrixToSingleLineString(matrix, Options.NUMBER_FORMAT); + StringBuilder res = new StringBuilder(); + int eIndex = Integer.MIN_VALUE; + + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (c == 'E') { + eIndex = i; + } else if (c == ' ' && eIndex == i - 1) { + // workaround Java 1.4 DecimalFormat bug + res.append('+'); + continue; + } else if (Character.isDigit(c) && eIndex == i - 1) { + res.append('+'); + } + res.append(c); + } + return res.toString(); + } + + /** + * Return a single-line string representation of this matrix by formatting the matrix + * elements with the given {@link NumberFormat}. + * + * @param formatter the {@link NumberFormat} used to format the matrix values with + * @return the string representation + */ + // spotless:off + public static String matrixToSingleLineString(Matrix4f matrix, NumberFormat formatter) { + return "{ [" + Runtime.format(matrix.m00(), formatter) + " " + Runtime.format(matrix.m10(), formatter) + " " + Runtime.format(matrix.m20(), formatter) + " " + Runtime.format(matrix.m30(), formatter) + "]. " + + "[" + Runtime.format(matrix.m01(), formatter) + " " + Runtime.format(matrix.m11(), formatter) + " " + Runtime.format(matrix.m21(), formatter) + " " + Runtime.format(matrix.m31(), formatter) + "], " + + "[" + Runtime.format(matrix.m02(), formatter) + " " + Runtime.format(matrix.m12(), formatter) + " " + Runtime.format(matrix.m22(), formatter) + " " + Runtime.format(matrix.m32(), formatter) + "]. " + + "[" + Runtime.format(matrix.m03(), formatter) + " " + Runtime.format(matrix.m13(), formatter) + " " + Runtime.format(matrix.m23(), formatter) + " " + Runtime.format(matrix.m33(), formatter) + "] }"; + } + // spotless:on } From 3495a6128b3da6f54c01a9124a07849f7b1d97f7 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 18:34:47 +0300 Subject: [PATCH 176/269] Lock 2: Lock Harder --- .../client/bloom/BloomEventListeners.java | 9 ++--- .../gtceu/client/bloom/BloomUtil.java | 34 ++++++++++++++----- 2 files changed, 31 insertions(+), 12 deletions(-) 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 1214d158534..67b8ce3eb66 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -46,7 +46,7 @@ public static void onClientTick(TickEvent.ClientTickEvent event) { @SubscribeEvent public static void onChunkUnloadEvent(ChunkEvent.Unload event) { - if (!GTShaders.canUseBloomShader() || GTCEu.Mods.isSodiumEmbeddiumLoaded()) { + if (!GTShaders.canUseBloomShader()) { return; } ChunkAccess chunk = event.getChunk(); @@ -56,14 +56,15 @@ public static void onChunkUnloadEvent(ChunkEvent.Unload event) { } ChunkPos chunkPos = chunk.getPos(); - for (int y = level.getMinSection(); y < level.getMaxSection(); y++) { - BloomUtil.chunkSectionUnloaded(SectionPos.of(chunkPos, y)); + int minSection = level.getMinSection(), maxSection = level.getMaxSection(); + for (int y = minSection; y < maxSection; y++) { + BloomUtil.chunkSectionUnloaded(SectionPos.asLong(chunkPos.x, y, chunkPos.z)); } } @SubscribeEvent public static void onLevelUnload(LevelEvent.Unload event) { - BloomUtil.invalidateLevelTickets(event.getLevel()); + BloomUtil.invalidateLevelData(event.getLevel()); } // Merge into parent class in 1.21, event listener discovery is smarter there diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 06269187c16..bb06d3d64ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -240,7 +240,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup * * @param level the level that was unloaded */ - public static void invalidateLevelTickets(LevelAccessor level) { + public static void invalidateLevelData(LevelAccessor level) { Objects.requireNonNull(level, "level == null"); BLOOM_RENDER_LOCK.readLock().lock(); try { @@ -260,6 +260,14 @@ public static void invalidateLevelTickets(LevelAccessor level) { } finally { BLOOM_RENDER_LOCK.readLock().lock(); } + + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + // Completely dump the temp quad cache when changing dimensions etc. + TEMPORARY_RENDER_QUAD_CACHE.clear(); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } } public static void renderBloom(Camera camera, LevelRenderer levelRenderer, @@ -367,7 +375,12 @@ public static void setupBloomShaderUniforms(boolean drawBlockBloom) { } public static boolean chunkSectionHasBloomQuads(long sectionPos) { - return TEMPORARY_RENDER_QUAD_CACHE.containsKey(sectionPos); + BLOOM_RENDER_LOCK.readLock().lock(); + try { + return TEMPORARY_RENDER_QUAD_CACHE.containsKey(sectionPos); + } finally { + BLOOM_RENDER_LOCK.readLock().unlock(); + } } private static final ThreadLocal poseStack_tl = ThreadLocal.withInitial(PoseStack::new); @@ -414,10 +427,10 @@ public static void drawBlockBloomForChunk(long sectionPos, } } - public static void chunkSectionUnloaded(SectionPos sectionPos) { + public static void chunkSectionUnloaded(long sectionPos) { BLOOM_RENDER_LOCK.writeLock().lock(); try { - TEMPORARY_RENDER_QUAD_CACHE.remove(sectionPos.asLong()); + TEMPORARY_RENDER_QUAD_CACHE.remove(sectionPos); } finally { BLOOM_RENDER_LOCK.writeLock().unlock(); } @@ -441,10 +454,15 @@ public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderT QuadCacheEntry entry = new QuadCacheEntry(quad, renderType, transformation, packedLights, packedOverlay, brightness, tintR, tintG, tintB); - Set sectionQuads = TEMPORARY_RENDER_QUAD_CACHE.computeIfAbsent(SectionPos.asLong(pos), - $ -> new LinkedHashSet<>()); - if (!sectionQuads.add(entry)) { - GTCEu.LOGGER.warn("Duplicate quad {} on block [{}]???", entry, pos.toShortString()); + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + Set sectionQuads = TEMPORARY_RENDER_QUAD_CACHE.computeIfAbsent(SectionPos.asLong(pos), + $ -> new LinkedHashSet<>()); + if (!sectionQuads.add(entry)) { + GTCEu.LOGGER.warn("Duplicate quad {} on block [{}]???", entry, pos.toShortString()); + } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); } } } From 425d35a84197733f8f3daed1d4149a907b81c266 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 18:40:38 +0300 Subject: [PATCH 177/269] Move QuadCacheEntry to the end of its parent class --- .../gtceu/client/bloom/BloomUtil.java | 114 +++++++++--------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index bb06d3d64ce..0226ccb017d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -56,63 +56,6 @@ public class BloomUtil { private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); - @ApiStatus.Internal - private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, - Matrix4f transformation, int[] packedLights, int packedOverlay, - float[] brightness, float tintR, float tintG, float tintB) { - - @Override - public String toString() { - int[][] unpackedLights = Arrays.stream(packedLights) - .mapToObj(packed -> new int[]{ LightTexture.block(packed), LightTexture.sky(packed) }) - .toArray(int[][]::new); - - return "{ " + - "renderType=" + (renderType != null ? ((RenderStateShardAccessor) renderType).getName() : null) + - ", transformation=" + FormattingUtil.matrixToSingleLineString(transformation) + - ", lights=" + Arrays.deepToString(unpackedLights) + - ", packedOverlay=" + packedOverlay + - ", brightness=" + Arrays.toString(brightness) + - ", tint=[" + tintR + ", " + tintG + ", " + tintB + ']' + - " }"; - } - - @Override - public boolean equals(@Nullable Object o) { - if (o == null || getClass() != o.getClass()) return false; - - QuadCacheEntry that = (QuadCacheEntry) o; - return this.renderType == that.renderType && - this.packedOverlay() == that.packedOverlay && - Float.floatToIntBits(this.tintR) == Float.floatToIntBits(that.tintR) && - Float.floatToIntBits(this.tintG) == Float.floatToIntBits(that.tintG) && - Float.floatToIntBits(this.tintB) == Float.floatToIntBits(that.tintB) && - - this.transformation.equals(that.transformation) && - Arrays.equals(this.packedLights, that.packedLights) && - Arrays.equals(this.brightness, that.brightness) && - // quad is compared last because it has the slowest equals() - this.quad.equals(that.quad); - } - - @Override - public int hashCode() { - int result = this.quad.hashCode(); - result = 31 * result + Objects.hashCode(this.renderType); - result = 31 * result + this.transformation.hashCode(); - - result = 31 * result + Arrays.hashCode(this.packedLights); - result = 31 * result + this.packedOverlay; - - result = 31 * result + Arrays.hashCode(this.brightness); - result = 31 * result + Float.hashCode(this.tintR); - result = 31 * result + Float.hashCode(this.tintG); - result = 31 * result + Float.hashCode(this.tintB); - - return result; - } - } - /// @implNote values are {@link LinkedHashSet}s for iteration order stability private static final Long2ObjectMap<@Nullable Set> TEMPORARY_RENDER_QUAD_CACHE = Long2ObjectMaps .synchronize(new Long2ObjectOpenHashMap<>()); @@ -558,4 +501,61 @@ private boolean postDraw() { return this.isEmpty(); } } + + @ApiStatus.Internal + private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, + Matrix4f transformation, int[] packedLights, int packedOverlay, + float[] brightness, float tintR, float tintG, float tintB) { + + @Override + public String toString() { + int[][] unpackedLights = Arrays.stream(packedLights) + .mapToObj(packed -> new int[]{ LightTexture.block(packed), LightTexture.sky(packed) }) + .toArray(int[][]::new); + + return "{ " + + "renderType=" + (renderType != null ? ((RenderStateShardAccessor) renderType).getName() : null) + + ", transformation=" + FormattingUtil.matrixToSingleLineString(transformation) + + ", lights=" + Arrays.deepToString(unpackedLights) + + ", packedOverlay=" + packedOverlay + + ", brightness=" + Arrays.toString(brightness) + + ", tint=[" + tintR + ", " + tintG + ", " + tintB + ']' + + " }"; + } + + @Override + public boolean equals(@Nullable Object o) { + if (o == null || getClass() != o.getClass()) return false; + + QuadCacheEntry that = (QuadCacheEntry) o; + return this.renderType == that.renderType && + this.packedOverlay() == that.packedOverlay && + Float.floatToIntBits(this.tintR) == Float.floatToIntBits(that.tintR) && + Float.floatToIntBits(this.tintG) == Float.floatToIntBits(that.tintG) && + Float.floatToIntBits(this.tintB) == Float.floatToIntBits(that.tintB) && + + this.transformation.equals(that.transformation) && + Arrays.equals(this.packedLights, that.packedLights) && + Arrays.equals(this.brightness, that.brightness) && + // quad is compared last because it has the slowest equals() + this.quad.equals(that.quad); + } + + @Override + public int hashCode() { + int result = this.quad.hashCode(); + result = 31 * result + Objects.hashCode(this.renderType); + result = 31 * result + this.transformation.hashCode(); + + result = 31 * result + Arrays.hashCode(this.packedLights); + result = 31 * result + this.packedOverlay; + + result = 31 * result + Arrays.hashCode(this.brightness); + result = 31 * result + Float.hashCode(this.tintR); + result = 31 * result + Float.hashCode(this.tintG); + result = 31 * result + Float.hashCode(this.tintB); + + return result; + } + } } From 4ba3a2b52dd3effe282ea400750a1eb5e9a2ac92 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:48:33 +0300 Subject: [PATCH 178/269] IT WORKS ON EMBEDDIUM!!!! --- .../gtceu/client/bloom/BloomUtil.java | 94 ++++++++++++------- .../mixins/embeddium/BlockRendererMixin.java | 75 ++++++++------- .../embeddium/GTEmbeddiumCompat.java | 21 +---- .../embeddium/renderer/BloomMeshAppender.java | 19 ---- .../embeddium/renderer/package-info.java | 4 - 5 files changed, 99 insertions(+), 114 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 0226ccb017d..230472b05f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -28,13 +28,13 @@ import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Matrix4f; +import org.joml.Matrix4fc; import java.util.*; import java.util.concurrent.locks.ReadWriteLock; @@ -56,10 +56,6 @@ public class BloomUtil { private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); - /// @implNote values are {@link LinkedHashSet}s for iteration order stability - private static final Long2ObjectMap<@Nullable Set> TEMPORARY_RENDER_QUAD_CACHE = Long2ObjectMaps - .synchronize(new Long2ObjectOpenHashMap<>()); - public static void init() {} /** @@ -203,14 +199,6 @@ public static void invalidateLevelData(LevelAccessor level) { } finally { BLOOM_RENDER_LOCK.readLock().lock(); } - - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - // Completely dump the temp quad cache when changing dimensions etc. - TEMPORARY_RENDER_QUAD_CACHE.clear(); - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } } public static void renderBloom(Camera camera, LevelRenderer levelRenderer, @@ -317,10 +305,48 @@ public static void setupBloomShaderUniforms(boolean drawBlockBloom) { } } + public static void setFilterToggleUniform(final boolean fragmentFilterEnabled) { + modifyBloomPostShaders((index, shader) -> { + if (shader.getName().contains("filter_bloom_color")) { + shader.safeGetUniform("EnableFilter").set(fragmentFilterEnabled ? 1 : 0); + } + }); + } + + private static void modifyBloomPostShaders(IntObjectConsumer consumer) { + // Forcefully insert config values to shader + List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); + for (int i = 0; i < passes.size(); i++) { + PostPass pass = passes.get(i); + consumer.accept(i, pass.getEffect()); + } + } + + // region vanilla-only code paths for automagic block bloom + + /// @implNote map values are {@link LinkedHashSet}s for iteration order stability + private static final ThreadLocal<@Nullable Long2ObjectMap<@Nullable Set>> quadCache_tl = new ThreadLocal<>(); + + private static @Nullable Long2ObjectMap<@Nullable Set> getThreadQuadCache() { + return quadCache_tl.get(); + } + + private static Long2ObjectMap<@Nullable Set> getOrCreateThreadQuadCache() { + var quadCache = getThreadQuadCache(); + if (quadCache == null) { + quadCache = new Long2ObjectOpenHashMap<>(); + quadCache_tl.set(quadCache); + } + return quadCache; + } + public static boolean chunkSectionHasBloomQuads(long sectionPos) { BLOOM_RENDER_LOCK.readLock().lock(); try { - return TEMPORARY_RENDER_QUAD_CACHE.containsKey(sectionPos); + var quadCache = getThreadQuadCache(); + if (quadCache == null) return false; + + return quadCache.containsKey(sectionPos); } finally { BLOOM_RENDER_LOCK.readLock().unlock(); } @@ -332,11 +358,20 @@ public static void drawBlockBloomForChunk(long sectionPos, Function vertexConsumerProvider) { BLOOM_RENDER_LOCK.readLock().lock(); try { - Set quads = TEMPORARY_RENDER_QUAD_CACHE.remove(sectionPos); - if (quads == null) { + var quadCache = getThreadQuadCache(); + if (quadCache == null) { return; } + Set quads = quadCache.remove(sectionPos); + if (quads == null || quads.isEmpty()) { + return; + } + if (quadCache.isEmpty()) { + // remove the thread local's value if this thread's map is empty so GC can work on it + quadCache_tl.remove(); + } + VertexConsumer bloomVertexConsumer = null; VertexConsumer cutoutVertexConsumer = null; @@ -370,19 +405,10 @@ public static void drawBlockBloomForChunk(long sectionPos, } } - public static void chunkSectionUnloaded(long sectionPos) { - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - TEMPORARY_RENDER_QUAD_CACHE.remove(sectionPos); - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } - /// Helper function for skipping bloom quads drawn with non-bloom render types @ApiStatus.Internal public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderType, BlockPos pos, - @Nullable Matrix4f transformation, int[] packedLights, int packedOverlay, + Matrix4fc transformation, int[] packedLights, int packedOverlay, float[] brightness, float tintR, float tintG, float tintB) { if (renderType == null || renderType == GTRenderTypes.bloom() || renderType == GTRenderTypes.entityBloomBlockSheet()) { @@ -390,17 +416,13 @@ public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderT } if (BloomMetadataSection.hasBloom(quad, packedLights)) { - if (transformation == null) { - transformation = new Matrix4f(); - transformation.translate(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15); - } - QuadCacheEntry entry = new QuadCacheEntry(quad, renderType, transformation, packedLights, packedOverlay, - brightness, tintR, tintG, tintB); + QuadCacheEntry entry = new QuadCacheEntry(quad, renderType, transformation, + packedLights, packedOverlay, brightness, tintR, tintG, tintB); BLOOM_RENDER_LOCK.writeLock().lock(); try { - Set sectionQuads = TEMPORARY_RENDER_QUAD_CACHE.computeIfAbsent(SectionPos.asLong(pos), - $ -> new LinkedHashSet<>()); + Set sectionQuads = getOrCreateThreadQuadCache() + .computeIfAbsent(SectionPos.asLong(pos), $ -> new LinkedHashSet<>()); if (!sectionQuads.add(entry)) { GTCEu.LOGGER.warn("Duplicate quad {} on block [{}]???", entry, pos.toShortString()); } @@ -410,6 +432,8 @@ public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderT } } + // endregion + public static final class BloomRenderTicket { public static final BloomRenderTicket INVALID = new BloomRenderTicket(); @@ -504,7 +528,7 @@ private boolean postDraw() { @ApiStatus.Internal private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, - Matrix4f transformation, int[] packedLights, int packedOverlay, + Matrix4fc transformation, int[] packedLights, int packedOverlay, float[] brightness, float tintR, float tintG, float tintB) { @Override diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index dd1e02578b6..994a500e39b 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -1,66 +1,69 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.ArrayHelpers; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.Direction; -import net.minecraft.util.FastColor; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.world.phys.Vec3; -import com.llamalad7.mixinextras.sugar.Local; -import me.jellysquid.mods.sodium.client.model.color.ColorProvider; -import me.jellysquid.mods.sodium.client.model.light.LightPipeline; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildContext; import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import org.embeddedt.embeddium.impl.render.chunk.compile.GlobalChunkBuildContext; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.List; @Mixin(value = BlockRenderer.class, remap = false) public class BlockRendererMixin { - @Inject(method = "renderQuadList", + @WrapOperation(method = "renderQuadList", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) - private void gtceu$captureBloomQuads(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 = "lightData") QuadLightData lightData, - @Local(name = "vertexColors") int[] vertexColors) { + private void gtceu$copyBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder originalBuilder, + Vec3 offset, Material material, BakedQuadView quad, + int[] vertexColors, QuadLightData lightData, + Operation original, + @Share("bloomBuilder") LocalRef bloomBuilderRef) { + original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); + if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return; } - float avgR = FastColor.ABGR32.red(vertexColors[0]); - float avgG = FastColor.ABGR32.green(vertexColors[0]); - float avgB = FastColor.ABGR32.blue(vertexColors[0]); - if (!ArrayHelpers.allMatch(vertexColors)) { - // only do the averaging if the vertex color isn't the same for all quads. - // I think this should be a pretty good optimization? - for (int i = 1; i < 4; i++) { - // Sodium has per-vertex quad tint in ABGR. Average it - avgR += FastColor.ABGR32.red(vertexColors[i]); - avgG += FastColor.ABGR32.green(vertexColors[i]); - avgB += FastColor.ABGR32.blue(vertexColors[i]); - } - avgR *= 0.25f; avgG *= 0.25f; avgB *= 0.25f; + ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); + if (chunkContext != null && BloomMetadataSection.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 + original.call(instance, ctx, bloomBuilder, offset, material, quad, vertexColors, lightData); } + } - BloomUtil.captureBloomQuad((BakedQuad) quad, ctx.renderLayer(), ctx.pos(), null, - lightData.lm, OverlayTexture.NO_OVERLAY, lightData.br, avgR / 255f, avgG / 255f, avgB / 255f); + @WrapOperation(method = "renderQuadList", + at = @At(value = "INVOKE", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;addSprite(Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;)V")) + private void gtceu$copyBloomSpriteAdds(ChunkModelBuilder originalBuilder, TextureAtlasSprite sprite, + Operation original, + @Share("bloomBuilder") LocalRef bloomBuilderRef) { + original.call(originalBuilder, sprite); + + // 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) { + original.call(bloomBuilder, sprite); + } } } 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 60190bd604e..b6a5008fbe7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,17 +1,10 @@ package com.gregtechceu.gtceu.integration.embeddium; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.integration.embeddium.renderer.BloomMeshAppender; - -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.SubscribeEvent; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; -import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { @@ -23,17 +16,5 @@ public class GTEmbeddiumCompat { AlphaCutoffParameter.ONE_TENTH, false); - public static void init() { - MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); - } - - @SubscribeEvent - public static void registerChunkMeshAppenders(ChunkMeshEvent event) { - if (!GTShaders.canUseBloomShader()) return; - if (!BloomUtil.chunkSectionHasBloomQuads(event.getSectionOrigin().asLong())) { - return; - } - - event.addMeshAppender(BloomMeshAppender.INSTANCE); - } + public static void init() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java deleted file mode 100644 index f523af480ee..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/BloomMeshAppender.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gregtechceu.gtceu.integration.embeddium.renderer; - -import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; - -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.SectionPos; - -import org.embeddedt.embeddium.api.MeshAppender; - -public class BloomMeshAppender implements MeshAppender { - - public static BloomMeshAppender INSTANCE = new BloomMeshAppender(); - - @Override - public void render(Context context) { - BloomUtil.drawBlockBloomForChunk(context.sectionOrigin().asLong(), context.vertexConsumerProvider()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java deleted file mode 100644 index e26dd5bcbbd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/renderer/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@NotNullByDefault -package com.gregtechceu.gtceu.integration.embeddium.renderer; - -import org.jetbrains.annotations.NotNullByDefault; From 72fab7da8072ed3892c6ec178b3c1a82f4c532d5 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:49:43 +0300 Subject: [PATCH 179/269] Draw bloom before translucent blocks so that bit works as expected --- .../client/bloom/LevelRendererMixin.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 5709a18935f..420db09275c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -39,15 +39,17 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt } } - @Definition(id = "renderChunkLayer", method = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V") - @Definition(id = "tripwire", method = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;") - @Expression("this.renderChunkLayer(tripwire(), ?, ?, ?, ?, ?)") + @Definition(id = "renderBuffers", field = "Lnet/minecraft/client/renderer/LevelRenderer;renderBuffers:Lnet/minecraft/client/renderer/RenderBuffers;") + @Definition(id = "crumblingBufferSource", method = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;") + @Definition(id = "endBatch", method = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V") + @Expression("this.renderBuffers.crumblingBufferSource().endBatch()") @Inject(method = "renderLevel", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) - private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - LightTexture lightTexture, Matrix4f projectionMatrix, - CallbackInfo ci, - @Local Frustum frustum, @Local Vec3 camPos, @Local ProfilerFiller profilerFiller) { + private void gtceu$renderBloomBeforeTranslucent(PoseStack poseStack, float partialTick, long finishNanoTime, + boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, + LightTexture lightTexture, Matrix4f projectionMatrix, + CallbackInfo ci, + @Local Frustum frustum, @Local Vec3 camPos, + @Local ProfilerFiller profilerFiller) { if (!GTShaders.canUseBloomShader()) return; profilerFiller.popPush("gtceu:bloom"); From 768934f4e15ecc124eea6d8fe081748188d1c30f Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:53:41 +0300 Subject: [PATCH 180/269] Clean up the construct/destruct process --- .../gtceu/client/bloom/BloomUtil.java | 47 +++++++------------ .../gtceu/client/shader/GTShaders.java | 15 ++++-- .../client/bloom/LevelRendererMixin.java | 19 ++++++-- .../utils/function/IntObjectConsumer.java | 34 ++++++++++++++ 4 files changed, 79 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 230472b05f9..2bb82b26017 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -23,7 +24,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.RenderLevelStageEvent; import com.mojang.blaze3d.vertex.*; @@ -33,15 +33,12 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; -import org.joml.Matrix4f; import org.joml.Matrix4fc; import java.util.*; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; +import java.util.function.*; @OnlyIn(Dist.CLIENT) public class BloomUtil { @@ -201,14 +198,11 @@ public static void invalidateLevelData(LevelAccessor level) { } } - public static void renderBloom(Camera camera, LevelRenderer levelRenderer, - PoseStack poseStack, Matrix4f projectionMatrix, Frustum frustum, - float partialTicks) { - ProfilerFiller profiler = Minecraft.getInstance().getProfiler(); + public static void renderSpecialBloom(Camera camera, PoseStack poseStack, Frustum frustum, float partialTicks, + ProfilerFiller profilerFiller) { + profilerFiller.push("special"); - GTRenderTypes.bloom().setupRenderState(); - - profiler.push("special"); + // render state is set up & cleared in calling function preDraw(); if (!BLOOM_RENDERS.isEmpty()) { @@ -227,21 +221,19 @@ public static void renderBloom(Camera camera, LevelRenderer levelRenderer, postDraw(); } - // copy depth buffer from the main render target so bloom won't render through blocks - // GTShaders.BLOOM_TARGET.copyDepthFrom(Minecraft.getInstance().getMainRenderTarget()); + profilerFiller.pop(); + } + + public static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) { + profilerFiller.push("processPostEffect"); + + // render state is set up & cleared in calling function GTShaders.BLOOM_CHAIN.process(partialTicks); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); VertexBuffer.unbind(); - // pop the "special" profiler section before posting forge render stage event - profiler.pop(); - - // noinspection UnstableApiUsage - ForgeHooksClient.dispatchRenderStage(AFTER_BLOOM_RENDER_STAGE, levelRenderer, - poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); - - GTRenderTypes.bloom().clearRenderState(); + profilerFiller.pop(); } private static void preDraw() { @@ -278,16 +270,11 @@ private static void postDraw() { private static final String BLUR_DIR_UNIFORM = "BlurDir"; @ApiStatus.Internal - public static void setupBloomShaderUniforms(boolean drawBlockBloom) { - var config = ConfigHolder.INSTANCE.client.shader; + public static void setupBloomShaderUniforms() { + final var config = ConfigHolder.INSTANCE.client.shader; // Forcefully insert config values to shader - List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); - for (int i = 0; i < passes.size(); i++) { - PostPass pass = passes.get(i); - EffectInstance shader = pass.getEffect(); - - shader.safeGetUniform(FILTER_TOGGLE_UNIFORM).set(drawBlockBloom ? 1 : 0); + modifyBloomPostShaders((index, shader) -> { shader.safeGetUniform(DEPTH_NEAR_UNIFORM).set(GameRenderer.PROJECTION_Z_NEAR); shader.safeGetUniform(DEPTH_FAR_UNIFORM).set(Minecraft.getInstance().gameRenderer.getDepthFar()); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 60dede1379a..2f55886a3d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -57,9 +57,7 @@ public static void onRegisterShaders(RegisterShadersEvent event) throws IOExcept } private static void initPostShaders() { - if (BLOOM_CHAIN != null) { - BLOOM_CHAIN.close(); - } + deinitPostShaders(); ResourceLocation id = null; @@ -98,6 +96,17 @@ private static void initPostShaders() { } } + @ApiStatus.Internal + public static void deinitPostShaders() { + if (BLOOM_CHAIN != null) { + BLOOM_CHAIN.close(); + BLOOM_TARGET.destroyBuffers(); + + BLOOM_CHAIN = null; + BLOOM_TARGET = null; + } + } + public static boolean canUseBloomShader() { return BLOOM_CHAIN != null && BLOOM_TARGET != null && canLoadBloomShader(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 420db09275c..b680cf4e662 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -39,6 +39,11 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt } } + @Inject(method = "graphicsChanged", at = @At("TAIL")) + private void gtceu$graphicsChanged(CallbackInfo ci) { + GTShaders.deinitPostShaders(); + } + @Definition(id = "renderBuffers", field = "Lnet/minecraft/client/renderer/LevelRenderer;renderBuffers:Lnet/minecraft/client/renderer/RenderBuffers;") @Definition(id = "crumblingBufferSource", method = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;") @Definition(id = "endBatch", method = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V") @@ -54,14 +59,22 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt profilerFiller.popPush("gtceu:bloom"); + BloomUtil.setupBloomShaderUniforms(); + if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { - BloomUtil.setupBloomShaderUniforms(true); + BloomUtil.setFilterToggleUniform(true); this.renderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); } else { - BloomUtil.setupBloomShaderUniforms(false); + BloomUtil.setFilterToggleUniform(false); } - BloomUtil.renderBloom(camera, (LevelRenderer) (Object) this, poseStack, projectionMatrix, frustum, partialTick); + // have to re-setup here. so sad. very aw. + GTRenderTypes.bloom().setupRenderState(); + + BloomUtil.renderSpecialBloom(camera, poseStack, frustum, partialTick, profilerFiller); + BloomUtil.processPostEffect(partialTick, profilerFiller); + + GTRenderTypes.bloom().clearRenderState(); // profiler section is popped by popPush() in the calling function; don't pop it here } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java b/src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java new file mode 100644 index 00000000000..9b0e325c3f4 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java @@ -0,0 +1,34 @@ +package com.gregtechceu.gtceu.utils.function; + +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; + +/** + * A type-specific {@link BinaryOperator}; provides methods operating both on objects and on + * primitives. + * + * @see BinaryOperator + * @since 8.5.0 + */ +@FunctionalInterface +public interface IntObjectConsumer extends BiConsumer { + /** + * Computes the operator on the given inputs. + * + * @param t the first input. + * @param u the second input. + * @return the output of the operator on the given inputs. + */ + void accept(int t, T u); + + /** + * {@inheritDoc} + * + * @deprecated Please use the corresponding type-specific method instead. + */ + @Deprecated + @Override + default void accept(Integer integer, T u) { + accept((int) integer, u); + } +} \ No newline at end of file From ec103774794b435678fe76faa9688183b9668bb1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:55:52 +0300 Subject: [PATCH 181/269] Remove these useless constants --- .../gtceu/client/bloom/BloomUtil.java | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 2bb82b26017..21655c41c39 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -45,9 +45,6 @@ public class BloomUtil { public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM_RENDER_STAGE; - // always outside the world border - public static final long INVALID_SECTION_POS = SectionPos.asLong(60000000, 60000000, 60000000); - private static final Map<@Nullable IRenderSetup, BloomRenderList> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); @@ -258,38 +255,29 @@ private static void postDraw() { } } - private static final String FILTER_TOGGLE_UNIFORM = "EnableFilter"; - private static final String DEPTH_NEAR_UNIFORM = "DepthNear"; - private static final String DEPTH_FAR_UNIFORM = "DepthFar"; - - private static final String BLUR_SHADER_NAME = "blur"; - private static final String BLOOM_STRENGTH_UNIFORM = "BloomStrength"; - private static final String BASE_BRIGHTNESS_UNIFORM = "BaseBrightness"; - private static final String MAX_BRIGHTNESS_UNIFORM = "MaxBrightness"; - private static final String MIN_BRIGHTNESS_UNIFORM = "MinBrightness"; - private static final String BLUR_DIR_UNIFORM = "BlurDir"; - @ApiStatus.Internal public static void setupBloomShaderUniforms() { final var config = ConfigHolder.INSTANCE.client.shader; // Forcefully insert config values to shader modifyBloomPostShaders((index, shader) -> { - shader.safeGetUniform(DEPTH_NEAR_UNIFORM).set(GameRenderer.PROJECTION_Z_NEAR); - shader.safeGetUniform(DEPTH_FAR_UNIFORM).set(Minecraft.getInstance().gameRenderer.getDepthFar()); + shader.safeGetUniform("DepthNear").set(GameRenderer.PROJECTION_Z_NEAR); + shader.safeGetUniform("DepthFar").set(Minecraft.getInstance().gameRenderer.getDepthFar()); - if (shader.getName().contains(BLUR_SHADER_NAME)) { - if (i % 2 == 0) { - shader.safeGetUniform(BLUR_DIR_UNIFORM).set(0.0f, config.step); + // 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(BLUR_DIR_UNIFORM).set(config.step, 0.0f); + shader.safeGetUniform("BlurDir").set(config.step, 0.0f); } } - shader.safeGetUniform(BLOOM_STRENGTH_UNIFORM).set(config.strength); - shader.safeGetUniform(BASE_BRIGHTNESS_UNIFORM).set(config.baseBrightness); - shader.safeGetUniform(MAX_BRIGHTNESS_UNIFORM).set(config.maxBrightness); - shader.safeGetUniform(MIN_BRIGHTNESS_UNIFORM).set(config.minBrightness); - } + + shader.safeGetUniform("BloomStrength").set(config.strength); + shader.safeGetUniform("BaseBrightness").set(config.baseBrightness); + shader.safeGetUniform("MinBrightness").set(config.minBrightness); + shader.safeGetUniform("MaxBrightness").set(config.maxBrightness); + }); } public static void setFilterToggleUniform(final boolean fragmentFilterEnabled) { From ffc4d1758ba8105c920ec9db31768f3be69c3400 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:56:13 +0300 Subject: [PATCH 182/269] Whoops forgot to commit this stuff --- .../client/bloom/BloomEventListeners.java | 23 ------------------- .../core/mixins/client/BakedQuadMixin.java | 15 ++++++------ .../gtceu/utils/FormattingUtil.java | 6 ++--- 3 files changed, 11 insertions(+), 33 deletions(-) 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 67b8ce3eb66..997da7eda5c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -5,15 +5,10 @@ import com.gregtechceu.gtceu.client.shader.GTShaders; import net.minecraft.client.Minecraft; -import net.minecraft.core.SectionPos; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraftforge.client.event.RegisterNamedRenderTypesEvent; import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -44,24 +39,6 @@ public static void onClientTick(TickEvent.ClientTickEvent event) { GTShaders.updateShaderAvailability(event); } - @SubscribeEvent - public static void onChunkUnloadEvent(ChunkEvent.Unload event) { - if (!GTShaders.canUseBloomShader()) { - return; - } - ChunkAccess chunk = event.getChunk(); - LevelAccessor level = chunk.getWorldForge(); - if (level == null) { - return; - } - - ChunkPos chunkPos = chunk.getPos(); - int minSection = level.getMinSection(), maxSection = level.getMaxSection(); - for (int y = minSection; y < maxSection; y++) { - BloomUtil.chunkSectionUnloaded(SectionPos.asLong(chunkPos.x, y, chunkPos.z)); - } - } - @SubscribeEvent public static void onLevelUnload(LevelEvent.Unload event) { BloomUtil.invalidateLevelData(event.getLevel()); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java index af17c07abcc..653d001dd70 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java @@ -29,13 +29,14 @@ public class BakedQuadMixin implements IGTBakedQuad { // @Intrinsic means this'll be skipped if someone else does it too @Intrinsic public boolean equals(Object o) { - if (!(o instanceof BakedQuad other)) return false; - return self().isShade() == other.isShade() && - self().hasAmbientOcclusion() == other.hasAmbientOcclusion() && - self().getTintIndex() == other.getTintIndex() && - self().getDirection() == other.getDirection() && - self().getSprite() == other.getSprite() && - Arrays.equals(self().getVertices(), other.getVertices()); + if (!(o instanceof BakedQuad that)) return false; + + return self().isShade() == that.isShade() && + self().hasAmbientOcclusion() == that.hasAmbientOcclusion() && + self().getTintIndex() == that.getTintIndex() && + self().getDirection() == that.getDirection() && + self().getSprite() == that.getSprite() && + Arrays.equals(self().getVertices(), that.getVertices()); } @Intrinsic diff --git a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java index 5630ca570b2..dc51630821a 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.joml.Options; import org.joml.Runtime; @@ -296,7 +296,7 @@ public static String formatTemperature(int temperature) { * * @return the string representation */ - public static String matrixToSingleLineString(Matrix4f matrix) { + public static String matrixToSingleLineString(Matrix4fc matrix) { String str = matrixToSingleLineString(matrix, Options.NUMBER_FORMAT); StringBuilder res = new StringBuilder(); int eIndex = Integer.MIN_VALUE; @@ -325,7 +325,7 @@ public static String matrixToSingleLineString(Matrix4f matrix) { * @return the string representation */ // spotless:off - public static String matrixToSingleLineString(Matrix4f matrix, NumberFormat formatter) { + public static String matrixToSingleLineString(Matrix4fc matrix, NumberFormat formatter) { return "{ [" + Runtime.format(matrix.m00(), formatter) + " " + Runtime.format(matrix.m10(), formatter) + " " + Runtime.format(matrix.m20(), formatter) + " " + Runtime.format(matrix.m30(), formatter) + "]. " + "[" + Runtime.format(matrix.m01(), formatter) + " " + Runtime.format(matrix.m11(), formatter) + " " + Runtime.format(matrix.m21(), formatter) + " " + Runtime.format(matrix.m31(), formatter) + "], " + "[" + Runtime.format(matrix.m02(), formatter) + " " + Runtime.format(matrix.m12(), formatter) + " " + Runtime.format(matrix.m22(), formatter) + " " + Runtime.format(matrix.m32(), formatter) + "]. " From 379e20b45941722202a7e2093989a8432d953f7e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:57:35 +0300 Subject: [PATCH 183/269] spotless --- .../gtceu/client/bloom/BloomUtil.java | 2 +- .../gtceu/client/bloom/IRenderSetup.java | 1 - .../gtceu/client/renderer/GTRenderTypes.java | 6 ++- .../gtceu/client/shader/GTShaders.java | 5 +-- .../gtceu/core/IGTQuadLighter.java | 2 - .../gtceu/core/IGTVertexConsumer.java | 3 +- .../mixins/client/LevelRendererMixin.java | 5 --- .../client/RenderStateShardAccessor.java | 3 +- .../mixins/client/VertexConsumerMixin.java | 3 +- .../bloom/ForgeModelBlockRendererMixin.java | 3 +- .../client/bloom/LevelRendererMixin.java | 9 +++-- .../client/bloom/ModelBlockRendererMixin.java | 5 +-- .../mixins/client/bloom/QuadLighterMixin.java | 4 +- .../mixins/client/bloom/RenderTypeMixin.java | 6 +-- .../mixins/embeddium/BlockRendererMixin.java | 16 ++++---- .../mixins/iris/WorldRenderingPhaseMixin.java | 1 + .../gtceu/core/util/CapturedQuadData.java | 2 +- .../embeddium/GTEmbeddiumCompat.java | 1 - .../gregtechceu/gtceu/utils/ArrayHelpers.java | 6 +-- .../utils/function/IntObjectConsumer.java | 39 ++++++++++--------- 20 files changed, 59 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 21655c41c39..cd68724e251 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -509,7 +509,7 @@ private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, @Override public String toString() { int[][] unpackedLights = Arrays.stream(packedLights) - .mapToObj(packed -> new int[]{ LightTexture.block(packed), LightTexture.sky(packed) }) + .mapToObj(packed -> new int[] { LightTexture.block(packed), LightTexture.sky(packed) }) .toArray(int[][]::new); return "{ " + diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java index 79d072946f9..93d7af7a945 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.client.bloom; import com.mojang.blaze3d.vertex.BufferBuilder; -import org.jetbrains.annotations.NotNull; public interface IRenderSetup { 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 c97f68e6d14..9c898333058 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -31,8 +31,10 @@ public class GTRenderTypes extends RenderType { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }); - protected static final RenderStateShard.ShaderStateShard RENDERTYPE_BLOOM_SHADER = new RenderStateShard.ShaderStateShard(GTShaders::getRendertypeBloomShader); - protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_BLOOM_SHADER = new RenderStateShard.ShaderStateShard(GTShaders::getRendertypeEntityBloomShader); + protected static final RenderStateShard.ShaderStateShard RENDERTYPE_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( + GTShaders::getRendertypeBloomShader); + protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( + GTShaders::getRendertypeEntityBloomShader); private static final RenderType LIGHT_RING = RenderType.create("light_ring", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, RenderType.SMALL_BUFFER_SIZE, false, false, diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 2f55886a3d7..31ebd0ebd77 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -45,14 +45,13 @@ public static void onRegisterShaders(RegisterShadersEvent event) throws IOExcept return; } event.registerShader(new ShaderInstance(event.getResourceProvider(), - GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), + GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), shader -> rendertypeBloomShader = shader); event.registerShader(new ShaderInstance(event.getResourceProvider(), - GTCEu.id("rendertype_entity_bloom"), DefaultVertexFormat.NEW_ENTITY), + GTCEu.id("rendertype_entity_bloom"), DefaultVertexFormat.NEW_ENTITY), shader -> rendertypeEntityBloomShader = shader); - initPostShaders(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java b/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java index bb65c775946..4f0bb8b9308 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java +++ b/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java @@ -2,8 +2,6 @@ import net.minecraft.client.renderer.RenderType; -import org.jetbrains.annotations.Nullable; - public interface IGTQuadLighter { void gtceu$setRenderType(RenderType currentRenderType); diff --git a/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java b/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java index 6bf7fbe6809..cebf4140bb7 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java +++ b/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java @@ -5,8 +5,7 @@ public interface IGTVertexConsumer { - private VertexConsumer self() - { + private VertexConsumer self() { return (VertexConsumer) this; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java index 6aee5338511..55d69972b59 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/LevelRendererMixin.java @@ -10,8 +10,6 @@ import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.steam.SteamMachine; import com.gregtechceu.gtceu.api.pipenet.IPipeNode; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; @@ -22,10 +20,8 @@ import net.minecraft.client.renderer.*; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.util.FastColor; -import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; @@ -39,7 +35,6 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; import com.mojang.blaze3d.vertex.VertexConsumer; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java index 09bc17fa799..52d2cd2d926 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/RenderStateShardAccessor.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client; import net.minecraft.client.renderer.RenderStateShard; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -9,4 +10,4 @@ public interface RenderStateShardAccessor { @Accessor("name") String getName(); -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java index 3c4e8dee994..7ab1ff44abd 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java @@ -6,5 +6,4 @@ import org.spongepowered.asm.mixin.Mixin; @Mixin(VertexConsumer.class) -public interface VertexConsumerMixin extends IGTVertexConsumer { -} +public interface VertexConsumerMixin extends IGTVertexConsumer {} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java index 9ac2047b9af..677650d3cc1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java @@ -26,7 +26,8 @@ public class ForgeModelBlockRendererMixin { @Inject(method = "render", - at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;setup(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) + at = @At(value = "INVOKE", + target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;setup(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) private static void gtceu$skipBloomyQuadsFromModel(VertexConsumer vertexConsumer, QuadLighter lighter, BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, PoseStack poseStack, boolean checkSides, diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index b680cf4e662..1d46e447c38 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -44,13 +44,16 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt GTShaders.deinitPostShaders(); } - @Definition(id = "renderBuffers", field = "Lnet/minecraft/client/renderer/LevelRenderer;renderBuffers:Lnet/minecraft/client/renderer/RenderBuffers;") - @Definition(id = "crumblingBufferSource", method = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;") + @Definition(id = "renderBuffers", + field = "Lnet/minecraft/client/renderer/LevelRenderer;renderBuffers:Lnet/minecraft/client/renderer/RenderBuffers;") + @Definition(id = "crumblingBufferSource", + method = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;") @Definition(id = "endBatch", method = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V") @Expression("this.renderBuffers.crumblingBufferSource().endBatch()") @Inject(method = "renderLevel", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) private void gtceu$renderBloomBeforeTranslucent(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, + boolean renderBlockOutline, Camera camera, + GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci, @Local Frustum frustum, @Local Vec3 camPos, 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 89bc5160269..8e737f4d1a1 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 @@ -52,9 +52,8 @@ public class ModelBlockRendererMixin { } @WrapWithCondition(method = "putQuadData", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V") - ) + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java index a3ad00806cc..d85e8258885 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java @@ -29,8 +29,8 @@ public class QuadLighterMixin implements IGTQuadLighter { private @Nullable RenderType gtceu$renderType; @WrapWithCondition(method = "process", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) private boolean gtceu$skipBloomyQuadsFromModel(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java index 021a4006835..4a35b593527 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java @@ -13,9 +13,9 @@ public class RenderTypeMixin { @ModifyExpressionValue(method = "", - at = @At(value = "INVOKE", - target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", - remap = false)) + at = @At(value = "INVOKE", + target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", + remap = false)) private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { return ImmutableList.builder() .addAll(original).add(GTRenderTypes.bloom()) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 994a500e39b..75c79ebf241 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -28,13 +28,13 @@ public class BlockRendererMixin { @WrapOperation(method = "renderQuadList", - at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) + at = @At(value = "INVOKE", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) private void gtceu$copyBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder originalBuilder, - Vec3 offset, Material material, BakedQuadView quad, - int[] vertexColors, QuadLightData lightData, - Operation original, - @Share("bloomBuilder") LocalRef bloomBuilderRef) { + Vec3 offset, Material material, BakedQuadView quad, + int[] vertexColors, QuadLightData lightData, + Operation original, + @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { @@ -52,8 +52,8 @@ public class BlockRendererMixin { } @WrapOperation(method = "renderQuadList", - at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;addSprite(Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;)V")) + at = @At(value = "INVOKE", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;addSprite(Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;)V")) private void gtceu$copyBloomSpriteAdds(ChunkModelBuilder originalBuilder, TextureAtlasSprite sprite, Operation original, @Share("bloomBuilder") LocalRef bloomBuilderRef) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java index e329b5cd50a..44dbabc94d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java @@ -18,6 +18,7 @@ @Mixin(value = WorldRenderingPhase.class, remap = false) public class WorldRenderingPhaseMixin { + @Shadow @Final @Mutable diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java b/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java index cbca7d0b6e6..cedb14be680 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java +++ b/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java @@ -26,4 +26,4 @@ public void close() { this.renderType = null; this.pos = null; } -} \ No newline at end of file +} 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 b6a5008fbe7..b434f7ece7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -15,6 +15,5 @@ public class GTEmbeddiumCompat { public static final Material BLOOM_MATERIAL = new Material(BLOOM_RENDER_PASS, AlphaCutoffParameter.ONE_TENTH, false); - public static void init() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java index b08c3269917..2f373dfb297 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java @@ -19,8 +19,8 @@ public class ArrayHelpers { * Note: if the array object has an element type which is a reference type that is not an array type, * the elements themselves are not deeply copied. This method only copies array objects. * - * @param array the array object to deep copy - * @param the type of the array to deep copy + * @param array the array object to deep copy + * @param the type of the array to deep copy * @return a copy of the specified array object, deeply copying multidimensional arrays, or null if the object is * null */ @@ -37,7 +37,7 @@ public class ArrayHelpers { if (componentType.isArray()) { for (int i = 0; i < array.length; ++i) { - //noinspection unchecked + // noinspection unchecked Array.set(copy, i, deepCopy((T[]) array[i])); } } else { diff --git a/src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java b/src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java index 9b0e325c3f4..567c5d6e07b 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/function/IntObjectConsumer.java @@ -12,23 +12,24 @@ */ @FunctionalInterface public interface IntObjectConsumer extends BiConsumer { - /** - * Computes the operator on the given inputs. - * - * @param t the first input. - * @param u the second input. - * @return the output of the operator on the given inputs. - */ - void accept(int t, T u); - /** - * {@inheritDoc} - * - * @deprecated Please use the corresponding type-specific method instead. - */ - @Deprecated - @Override - default void accept(Integer integer, T u) { - accept((int) integer, u); - } -} \ No newline at end of file + /** + * Computes the operator on the given inputs. + * + * @param t the first input. + * @param u the second input. + * @return the output of the operator on the given inputs. + */ + void accept(int t, T u); + + /** + * {@inheritDoc} + * + * @deprecated Please use the corresponding type-specific method instead. + */ + @Deprecated + @Override + default void accept(Integer integer, T u) { + accept((int) integer, u); + } +} From bb225e57e7d3adc1a62a44a7ca557b151a138e6d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 23:26:59 +0300 Subject: [PATCH 184/269] Simplify them models again --- .../blockstates/black_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/black_lamp.json | 4 +-- .../blockstates/blue_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/blue_lamp.json | 4 +-- .../blockstates/brown_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/brown_lamp.json | 4 +-- .../blockstates/cyan_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/gray_lamp.json | 4 +-- .../blockstates/green_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/green_lamp.json | 4 +-- .../light_blue_borderless_lamp.json | 4 +-- .../gtceu/blockstates/light_blue_lamp.json | 4 +-- .../light_gray_borderless_lamp.json | 4 +-- .../blockstates/lime_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/lime_lamp.json | 4 +-- .../blockstates/magenta_borderless_lamp.json | 4 +-- .../gtceu/blockstates/magenta_lamp.json | 4 +-- .../blockstates/orange_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/orange_lamp.json | 4 +-- .../blockstates/purple_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/purple_lamp.json | 4 +-- .../blockstates/red_borderless_lamp.json | 4 +-- .../assets/gtceu/blockstates/red_lamp.json | 4 +-- .../blockstates/yellow_borderless_lamp.json | 4 +-- .../models/block/black_borderless_lamp.json | 6 ---- .../block/black_borderless_lamp_bloom.json | 4 +-- .../block/black_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/black_lamp.json | 7 ----- .../gtceu/models/block/black_lamp_bloom.json | 2 +- .../gtceu/models/block/black_lamp_on.json | 6 ++++ .../models/block/blue_borderless_lamp.json | 6 ---- .../block/blue_borderless_lamp_bloom.json | 4 +-- .../block/blue_borderless_lamp_off.json | 2 +- .../models/block/blue_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/blue_lamp.json | 7 ----- .../gtceu/models/block/blue_lamp_bloom.json | 2 +- .../gtceu/models/block/blue_lamp_on.json | 6 ++++ .../models/block/brown_borderless_lamp.json | 6 ---- .../block/brown_borderless_lamp_bloom.json | 4 +-- .../block/brown_borderless_lamp_off.json | 2 +- .../block/brown_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/brown_lamp.json | 7 ----- .../gtceu/models/block/brown_lamp_bloom.json | 2 +- .../gtceu/models/block/brown_lamp_on.json | 6 ++++ .../models/block/cyan_borderless_lamp.json | 6 ---- .../block/cyan_borderless_lamp_bloom.json | 4 +-- .../block/cyan_borderless_lamp_off.json | 2 +- .../models/block/cyan_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/cyan_lamp.json | 7 ----- .../gtceu/models/block/cyan_lamp_bloom.json | 2 +- .../gtceu/models/block/cyan_lamp_on.json | 6 ++++ .../models/block/gray_borderless_lamp.json | 6 ---- .../block/gray_borderless_lamp_bloom.json | 4 +-- .../block/gray_borderless_lamp_off.json | 2 +- .../models/block/gray_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/gray_lamp.json | 7 ----- .../gtceu/models/block/gray_lamp_bloom.json | 2 +- .../gtceu/models/block/gray_lamp_on.json | 6 ++++ .../models/block/green_borderless_lamp.json | 6 ---- .../block/green_borderless_lamp_bloom.json | 4 +-- .../block/green_borderless_lamp_off.json | 2 +- .../block/green_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/green_lamp.json | 7 ----- .../gtceu/models/block/green_lamp_bloom.json | 2 +- .../gtceu/models/block/green_lamp_on.json | 6 ++++ .../block/light_blue_borderless_lamp.json | 6 ---- .../light_blue_borderless_lamp_bloom.json | 4 +-- .../block/light_blue_borderless_lamp_off.json | 2 +- .../block/light_blue_borderless_lamp_on.json | 6 ++++ .../gtceu/models/block/light_blue_lamp.json | 7 ----- .../models/block/light_blue_lamp_bloom.json | 2 +- .../models/block/light_blue_lamp_on.json | 6 ++++ .../block/light_gray_borderless_lamp.json | 6 ---- .../light_gray_borderless_lamp_bloom.json | 4 +-- .../block/light_gray_borderless_lamp_off.json | 2 +- .../block/light_gray_borderless_lamp_on.json | 6 ++++ .../gtceu/models/block/light_gray_lamp.json | 7 ----- .../models/block/light_gray_lamp_on.json | 6 ++++ .../models/block/lime_borderless_lamp.json | 6 ---- .../block/lime_borderless_lamp_bloom.json | 4 +-- .../block/lime_borderless_lamp_off.json | 2 +- .../models/block/lime_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/lime_lamp.json | 7 ----- .../gtceu/models/block/lime_lamp_bloom.json | 2 +- .../gtceu/models/block/lime_lamp_on.json | 6 ++++ .../models/block/magenta_borderless_lamp.json | 6 ---- .../block/magenta_borderless_lamp_bloom.json | 4 +-- .../block/magenta_borderless_lamp_off.json | 2 +- .../block/magenta_borderless_lamp_on.json | 6 ++++ .../gtceu/models/block/magenta_lamp.json | 7 ----- .../models/block/magenta_lamp_bloom.json | 2 +- .../gtceu/models/block/magenta_lamp_on.json | 6 ++++ .../models/block/orange_borderless_lamp.json | 6 ---- .../block/orange_borderless_lamp_bloom.json | 4 +-- .../block/orange_borderless_lamp_on.json | 6 ++++ .../gtceu/models/block/orange_lamp.json | 7 ----- .../gtceu/models/block/orange_lamp_bloom.json | 2 +- .../gtceu/models/block/orange_lamp_on.json | 6 ++++ .../models/block/pink_borderless_lamp.json | 6 ---- .../block/pink_borderless_lamp_bloom.json | 4 +-- .../block/pink_borderless_lamp_off.json | 2 +- .../models/block/pink_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/pink_lamp.json | 7 ----- .../gtceu/models/block/pink_lamp_bloom.json | 2 +- .../gtceu/models/block/pink_lamp_on.json | 6 ++++ .../models/block/purple_borderless_lamp.json | 6 ---- .../block/purple_borderless_lamp_off.json | 2 +- .../block/purple_borderless_lamp_on.json | 6 ++++ .../gtceu/models/block/purple_lamp.json | 7 ----- .../gtceu/models/block/purple_lamp_bloom.json | 2 +- .../gtceu/models/block/purple_lamp_on.json | 6 ++++ .../models/block/red_borderless_lamp.json | 6 ---- .../block/red_borderless_lamp_bloom.json | 4 +-- .../models/block/red_borderless_lamp_off.json | 2 +- .../models/block/red_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/red_lamp.json | 7 ----- .../gtceu/models/block/red_lamp_bloom.json | 2 +- .../gtceu/models/block/red_lamp_on.json | 6 ++++ .../models/block/white_borderless_lamp.json | 6 ---- .../block/white_borderless_lamp_bloom.json | 4 +-- .../block/white_borderless_lamp_off.json | 2 +- .../block/white_borderless_lamp_on.json | 6 ++++ .../assets/gtceu/models/block/white_lamp.json | 7 ----- .../gtceu/models/block/white_lamp_bloom.json | 2 +- .../gtceu/models/block/white_lamp_on.json | 6 ++++ .../models/block/yellow_borderless_lamp.json | 6 ---- .../block/yellow_borderless_lamp_bloom.json | 4 +-- .../block/yellow_borderless_lamp_off.json | 2 +- .../block/yellow_borderless_lamp_on.json | 6 ++++ .../gtceu/models/block/yellow_lamp.json | 7 ----- .../gtceu/models/block/yellow_lamp_bloom.json | 2 +- .../gtceu/models/block/yellow_lamp_on.json | 6 ++++ .../models/item/black_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/black_lamp.json | 2 +- .../models/item/blue_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/blue_lamp.json | 2 +- .../models/item/brown_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/cyan_lamp.json | 2 +- .../models/item/gray_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/gray_lamp.json | 2 +- .../models/item/green_borderless_lamp.json | 2 +- .../item/light_blue_borderless_lamp.json | 2 +- .../gtceu/models/item/light_blue_lamp.json | 2 +- .../item/light_gray_borderless_lamp.json | 2 +- .../gtceu/models/item/light_gray_lamp.json | 2 +- .../models/item/lime_borderless_lamp.json | 2 +- .../models/item/magenta_borderless_lamp.json | 2 +- .../gtceu/models/item/magenta_lamp.json | 2 +- .../models/item/orange_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/orange_lamp.json | 2 +- .../models/item/pink_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/pink_lamp.json | 2 +- .../models/item/purple_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/purple_lamp.json | 2 +- .../models/item/red_borderless_lamp.json | 2 +- .../models/item/white_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/white_lamp.json | 2 +- .../models/item/yellow_borderless_lamp.json | 2 +- .../assets/gtceu/models/item/yellow_lamp.json | 2 +- .../gtceu/common/data/models/GTModels.java | 27 ++++++++---------- .../gtceu/models/block/cube/emissive/all.json | 12 ++++++++ .../models/block/cube/emissive/default.json | 19 ++++++++++++ .../block/{lamp.json => lamp_bloom.json} | 0 .../models/block/lamp_borderless_bloom.json | 6 ++++ ...orderless.json => lamp_borderless_on.json} | 0 .../assets/gtceu/models/block/lamp_on.json | 6 ++++ .../block/lamps/black_borderless_emissive.png | Bin 189 -> 0 bytes .../black_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/blue_borderless_emissive.png | Bin 189 -> 0 bytes .../lamps/blue_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/brown_borderless_emissive.png | Bin 189 -> 0 bytes .../brown_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/cyan_borderless_emissive.png | Bin 189 -> 0 bytes .../lamps/cyan_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/gray_borderless_emissive.png | Bin 189 -> 0 bytes .../lamps/gray_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/green_borderless_emissive.png | Bin 189 -> 0 bytes .../green_borderless_emissive.png.mcmeta | 5 ---- .../lamps/light_blue_borderless_emissive.png | Bin 189 -> 0 bytes .../light_blue_borderless_emissive.png.mcmeta | 5 ---- .../lamps/light_gray_borderless_emissive.png | Bin 189 -> 0 bytes .../light_gray_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/lime_borderless_emissive.png | Bin 189 -> 0 bytes .../lamps/lime_borderless_emissive.png.mcmeta | 5 ---- .../lamps/magenta_borderless_emissive.png | Bin 189 -> 0 bytes .../magenta_borderless_emissive.png.mcmeta | 5 ---- .../lamps/orange_borderless_emissive.png | Bin 189 -> 0 bytes .../orange_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/pink_borderless_emissive.png | Bin 189 -> 0 bytes .../lamps/pink_borderless_emissive.png.mcmeta | 5 ---- .../lamps/purple_borderless_emissive.png | Bin 189 -> 0 bytes .../purple_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/red_borderless_emissive.png | Bin 189 -> 0 bytes .../lamps/red_borderless_emissive.png.mcmeta | 5 ---- .../block/lamps/white_borderless_emissive.png | Bin 189 -> 0 bytes .../white_borderless_emissive.png.mcmeta | 5 ---- .../lamps/yellow_borderless_emissive.png | Bin 189 -> 0 bytes .../yellow_borderless_emissive.png.mcmeta | 5 ---- 198 files changed, 381 insertions(+), 437 deletions(-) create mode 100644 src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/black_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/green_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/red_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/white_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json create mode 100644 src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json create mode 100644 src/main/resources/assets/gtceu/models/block/cube/emissive/all.json create mode 100644 src/main/resources/assets/gtceu/models/block/cube/emissive/default.json rename src/main/resources/assets/gtceu/models/block/{lamp.json => lamp_bloom.json} (100%) create mode 100644 src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json rename src/main/resources/assets/gtceu/models/block/{lamp_borderless.json => lamp_borderless_on.json} (100%) create mode 100644 src/main/resources/assets/gtceu/models/block/lamp_on.json delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png diff --git a/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json index 2653760bdab..253a77bb05e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/black_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/black_borderless_lamp" + "model": "gtceu:block/black_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/black_borderless_lamp" + "model": "gtceu:block/black_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/black_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/black_lamp.json b/src/generated/resources/assets/gtceu/blockstates/black_lamp.json index 2ec244991e9..97737ee62ae 100644 --- a/src/generated/resources/assets/gtceu/blockstates/black_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/black_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/black_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/black_lamp" + "model": "gtceu:block/black_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/black_lamp" + "model": "gtceu:block/black_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/black_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json index cf0137a72f6..7733a352429 100644 --- a/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/blue_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/blue_borderless_lamp" + "model": "gtceu:block/blue_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/blue_borderless_lamp" + "model": "gtceu:block/blue_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/blue_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json b/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json index 551d3d7ea75..cf1cbb4680b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/blue_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/blue_lamp" + "model": "gtceu:block/blue_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/blue_lamp" + "model": "gtceu:block/blue_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/blue_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json index 648d1fc0c31..1f94c32a9c8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/brown_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/brown_borderless_lamp" + "model": "gtceu:block/brown_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/brown_borderless_lamp" + "model": "gtceu:block/brown_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/brown_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json b/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json index 416b65492b9..778a11e8ba2 100644 --- a/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/brown_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/brown_lamp" + "model": "gtceu:block/brown_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/brown_lamp" + "model": "gtceu:block/brown_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/brown_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json index dcc9951a482..059522192c9 100644 --- a/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/cyan_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/cyan_borderless_lamp" + "model": "gtceu:block/cyan_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/cyan_borderless_lamp" + "model": "gtceu:block/cyan_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/cyan_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json b/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json index fe235c636c8..02bc283ed22 100644 --- a/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/gray_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/gray_lamp" + "model": "gtceu:block/gray_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/gray_lamp" + "model": "gtceu:block/gray_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/gray_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json index 2ba1217b905..4a2aa859750 100644 --- a/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/green_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/green_borderless_lamp" + "model": "gtceu:block/green_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/green_borderless_lamp" + "model": "gtceu:block/green_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/green_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/green_lamp.json b/src/generated/resources/assets/gtceu/blockstates/green_lamp.json index a399f46cc5b..8dd25b4bf15 100644 --- a/src/generated/resources/assets/gtceu/blockstates/green_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/green_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/green_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/green_lamp" + "model": "gtceu:block/green_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/green_lamp" + "model": "gtceu:block/green_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/green_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json index 04a4c1c3598..478555ea9d3 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/light_blue_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/light_blue_borderless_lamp" + "model": "gtceu:block/light_blue_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/light_blue_borderless_lamp" + "model": "gtceu:block/light_blue_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json index 5efb2370466..a9b2c1dfdc3 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/light_blue_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/light_blue_lamp" + "model": "gtceu:block/light_blue_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/light_blue_lamp" + "model": "gtceu:block/light_blue_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_blue_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json index 35a06427bfc..a165753e8ed 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/light_gray_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/light_gray_borderless_lamp" + "model": "gtceu:block/light_gray_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/light_gray_borderless_lamp" + "model": "gtceu:block/light_gray_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json index 609090bca1a..893ead5ebb3 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/lime_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/lime_borderless_lamp" + "model": "gtceu:block/lime_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/lime_borderless_lamp" + "model": "gtceu:block/lime_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/lime_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json b/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json index 004a8210c98..7d6989cd5e3 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/lime_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/lime_lamp" + "model": "gtceu:block/lime_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/lime_lamp" + "model": "gtceu:block/lime_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/lime_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json index 662ea54a7d9..71c9fe65e62 100644 --- a/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/magenta_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/magenta_borderless_lamp" + "model": "gtceu:block/magenta_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/magenta_borderless_lamp" + "model": "gtceu:block/magenta_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/magenta_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json b/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json index 709aa6b8536..3d696c9475e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/magenta_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/magenta_lamp" + "model": "gtceu:block/magenta_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/magenta_lamp" + "model": "gtceu:block/magenta_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/magenta_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json index 8d3f051ad00..dc8a8a1774d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/orange_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/orange_borderless_lamp" + "model": "gtceu:block/orange_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/orange_borderless_lamp" + "model": "gtceu:block/orange_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/orange_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json b/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json index fe41b1e40a8..8d894e3c2e9 100644 --- a/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/orange_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/orange_lamp" + "model": "gtceu:block/orange_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/orange_lamp" + "model": "gtceu:block/orange_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/orange_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json index 9061ec60bfd..49beb311e18 100644 --- a/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/purple_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/purple_borderless_lamp" + "model": "gtceu:block/purple_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/purple_borderless_lamp" + "model": "gtceu:block/purple_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/purple_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json b/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json index a2b8df6d91d..1cc72c942c7 100644 --- a/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/purple_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/purple_lamp" + "model": "gtceu:block/purple_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/purple_lamp" + "model": "gtceu:block/purple_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/purple_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json index f34d00b2679..54eae2a378b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/red_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/red_borderless_lamp" + "model": "gtceu:block/red_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/red_borderless_lamp" + "model": "gtceu:block/red_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/red_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/red_lamp.json b/src/generated/resources/assets/gtceu/blockstates/red_lamp.json index ed2b42645b0..75b635491c2 100644 --- a/src/generated/resources/assets/gtceu/blockstates/red_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/red_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/red_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/red_lamp" + "model": "gtceu:block/red_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/red_lamp" + "model": "gtceu:block/red_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/red_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json index 7260b08a785..7ef79ba04fa 100644 --- a/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/yellow_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/yellow_borderless_lamp" + "model": "gtceu:block/yellow_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/yellow_borderless_lamp" + "model": "gtceu:block/yellow_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/yellow_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp.json index 0c19aad913c..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/black_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json index 9fa8d3f38d4..806989d43ee 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/black_borderless_emissive" + "active": "gtceu:block/lamps/black_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json new file mode 100644 index 00000000000..4088ce5b9a5 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/black_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_lamp.json b/src/generated/resources/assets/gtceu/models/block/black_lamp.json index ab020a51643..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/black_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/black", - "active_overlay": "gtceu:block/lamps/black" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json index 4f744418d6e..b16b8a9c982 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/black", "active_overlay": "gtceu:block/lamps/black_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/black_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/black_lamp_on.json new file mode 100644 index 00000000000..4338bed5bae --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/black_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/black" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp.json index 141172292fa..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/blue_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json index 7f670fdbd33..b2f0f987ed6 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/blue_borderless_emissive" + "active": "gtceu:block/lamps/blue_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json index bbddedf5449..848265e0d35 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/blue_off_borderless" + "inactive": "gtceu:block/lamps/blue_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json new file mode 100644 index 00000000000..589b7e72298 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/blue_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_lamp.json b/src/generated/resources/assets/gtceu/models/block/blue_lamp.json index 5745ea7e123..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/blue", - "active_overlay": "gtceu:block/lamps/blue" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json index 0aaa5323256..6b874a889e8 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/blue", "active_overlay": "gtceu:block/lamps/blue_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json new file mode 100644 index 00000000000..a036cbc0712 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp.json index b505d4b694d..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/brown_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json index aa7dbb55ca9..6b544f99c25 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/brown_borderless_emissive" + "active": "gtceu:block/lamps/brown_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json index b8f137c3256..1a64746e1b4 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/brown_off_borderless" + "inactive": "gtceu:block/lamps/brown_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json new file mode 100644 index 00000000000..2127af2c7ab --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/brown_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_lamp.json b/src/generated/resources/assets/gtceu/models/block/brown_lamp.json index df6eb9f6ad9..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/brown", - "active_overlay": "gtceu:block/lamps/brown" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json index 255f40f8292..99d9e783663 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/brown", "active_overlay": "gtceu:block/lamps/brown_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json new file mode 100644 index 00000000000..3ba2b9fb583 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/brown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp.json index f36df565587..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/cyan_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json index bc635568a38..b2811583923 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/cyan_borderless_emissive" + "active": "gtceu:block/lamps/cyan_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json index f96fa394e39..25d017cd16f 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/cyan_off_borderless" + "inactive": "gtceu:block/lamps/cyan_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json new file mode 100644 index 00000000000..6da55252e0e --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/cyan_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_lamp.json b/src/generated/resources/assets/gtceu/models/block/cyan_lamp.json index 1bda83da437..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/cyan", - "active_overlay": "gtceu:block/lamps/cyan" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json index 664da2a906a..86bcd1a8bac 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/cyan", "active_overlay": "gtceu:block/lamps/cyan_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json new file mode 100644 index 00000000000..842d3a7e150 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/cyan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp.json index cb1c75e15eb..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/gray_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json index 02817b26ff0..fcd5fbd5d0e 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/gray_borderless_emissive" + "active": "gtceu:block/lamps/gray_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json index 3d630919ddc..e4ae459d0b0 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/gray_off_borderless" + "inactive": "gtceu:block/lamps/gray_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json new file mode 100644 index 00000000000..4a315f7c06b --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/gray_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_lamp.json b/src/generated/resources/assets/gtceu/models/block/gray_lamp.json index 10a7355aad2..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/gray", - "active_overlay": "gtceu:block/lamps/gray" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json index 395664b8592..5d93bf6c47d 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/gray", "active_overlay": "gtceu:block/lamps/gray_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json new file mode 100644 index 00000000000..35830a31c7c --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp.json index f53ba7ebb72..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/green_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json index 77b024546bc..d2aa2b73704 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/green_borderless_emissive" + "active": "gtceu:block/lamps/green_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json index b1f22b9681d..3ab0b42d3ad 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/green_off_borderless" + "inactive": "gtceu:block/lamps/green_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json new file mode 100644 index 00000000000..1516ef02e69 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/green_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_lamp.json b/src/generated/resources/assets/gtceu/models/block/green_lamp.json index a79d65ee1a7..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/green_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/green", - "active_overlay": "gtceu:block/lamps/green" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json index 5611eae3d3e..d2e9ca3bd1c 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/green", "active_overlay": "gtceu:block/lamps/green_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/green_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/green_lamp_on.json new file mode 100644 index 00000000000..e91d7abcdcb --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/green_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/green" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp.json index 9cc7bf42d96..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/light_blue_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json index 67d13121e5e..0312ce6f180 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/light_blue_borderless_emissive" + "active": "gtceu:block/lamps/light_blue_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json index 8a476527d76..d94ec49a102 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/light_blue_off_borderless" + "inactive": "gtceu:block/lamps/light_blue_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json new file mode 100644 index 00000000000..288796028a4 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/light_blue_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp.json index c1a04f4f716..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/light_blue", - "active_overlay": "gtceu:block/lamps/light_blue" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json index c42aac43965..a8c2164a6c4 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/light_blue", "active_overlay": "gtceu:block/lamps/light_blue_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json new file mode 100644 index 00000000000..d04ee23320d --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/light_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp.json index 2d5c4a7dc0a..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/light_gray_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json index f1693f502ce..5066febf0b3 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/light_gray_borderless_emissive" + "active": "gtceu:block/lamps/light_gray_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json index 4a82d739b49..e4f0e8e573a 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/light_gray_off_borderless" + "inactive": "gtceu:block/lamps/light_gray_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json new file mode 100644 index 00000000000..749354c8ec9 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/light_gray_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp.json index 187128e5b5e..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/light_gray", - "active_overlay": "gtceu:block/lamps/light_gray" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json new file mode 100644 index 00000000000..6cd7d252d99 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/light_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp.json index e08dc19e73a..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/lime_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json index a3114c2c291..5da6a37bd34 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/lime_borderless_emissive" + "active": "gtceu:block/lamps/lime_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json index 983ce7d8035..ef82cdd5ba7 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/lime_off_borderless" + "inactive": "gtceu:block/lamps/lime_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json new file mode 100644 index 00000000000..fa848909ca9 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/lime_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_lamp.json b/src/generated/resources/assets/gtceu/models/block/lime_lamp.json index 4be47ff4c57..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/lime", - "active_overlay": "gtceu:block/lamps/lime" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json index 11569f18ac1..8fc9097d314 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/lime", "active_overlay": "gtceu:block/lamps/lime_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json new file mode 100644 index 00000000000..e1a2fe27639 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/lime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp.json index d76ba268ea5..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/magenta_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json index 5a35c2addcd..4ca7c826a0e 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/magenta_borderless_emissive" + "active": "gtceu:block/lamps/magenta_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json index e71bbf3ae42..32437f573d3 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/magenta_off_borderless" + "inactive": "gtceu:block/lamps/magenta_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json new file mode 100644 index 00000000000..075cd0952db --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/magenta_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_lamp.json b/src/generated/resources/assets/gtceu/models/block/magenta_lamp.json index 5e808a5b3bb..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/magenta", - "active_overlay": "gtceu:block/lamps/magenta" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json index b12ad018601..104d503c092 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/magenta", "active_overlay": "gtceu:block/lamps/magenta_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json new file mode 100644 index 00000000000..dbd2f889c2e --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/magenta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp.json index 268c735b953..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/orange_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json index 4d8e9ee9970..067c4871c3f 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/orange_borderless_emissive" + "active": "gtceu:block/lamps/orange_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json new file mode 100644 index 00000000000..a9533a1401f --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/orange_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_lamp.json b/src/generated/resources/assets/gtceu/models/block/orange_lamp.json index 575ac5eba7c..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/orange", - "active_overlay": "gtceu:block/lamps/orange" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json index bca9ad4c8c9..94c480a414f 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/orange", "active_overlay": "gtceu:block/lamps/orange_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json new file mode 100644 index 00000000000..7d7b2d2a0b6 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/orange" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp.json index 671ce70381d..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/pink_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json index e90375ef7e6..52767e59d91 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/pink_borderless_emissive" + "active": "gtceu:block/lamps/pink_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json index a6d100ca5f1..6208d2d9b2a 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/pink_off_borderless" + "inactive": "gtceu:block/lamps/pink_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json new file mode 100644 index 00000000000..7c871e10d88 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/pink_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_lamp.json b/src/generated/resources/assets/gtceu/models/block/pink_lamp.json index 7c3c8fbcee4..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/pink", - "active_overlay": "gtceu:block/lamps/pink" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json index 694392c18a0..e84579e9615 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/pink", "active_overlay": "gtceu:block/lamps/pink_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json new file mode 100644 index 00000000000..854a85f2546 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/pink" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp.json index a70dc190f21..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/purple_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json index a2c85e59b51..166f5328f9e 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/purple_off_borderless" + "inactive": "gtceu:block/lamps/purple_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json new file mode 100644 index 00000000000..e31e7d0a584 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/purple_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_lamp.json b/src/generated/resources/assets/gtceu/models/block/purple_lamp.json index 4a1ac93555d..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/purple", - "active_overlay": "gtceu:block/lamps/purple" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json index 7461d1ab9ea..07a9193a2a9 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/purple", "active_overlay": "gtceu:block/lamps/purple_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json new file mode 100644 index 00000000000..6e556400065 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/purple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp.json index 475c552e60c..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/red_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json index ed52fab86ba..e68e1bdfde1 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/red_borderless_emissive" + "active": "gtceu:block/lamps/red_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json index 622bb2edfb0..21b0ec08285 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/red_off_borderless" + "inactive": "gtceu:block/lamps/red_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json new file mode 100644 index 00000000000..120c01ae392 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/red_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_lamp.json b/src/generated/resources/assets/gtceu/models/block/red_lamp.json index d5ec2cf5431..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/red_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/red", - "active_overlay": "gtceu:block/lamps/red" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json index 439816ac989..bdd85e6f25b 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/red", "active_overlay": "gtceu:block/lamps/red_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/red_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/red_lamp_on.json new file mode 100644 index 00000000000..e29d346ccfe --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/red_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/red" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp.json index efaabb1b55e..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/white_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json index a77bbb1841a..9556f00bdb7 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/white_borderless_emissive" + "active": "gtceu:block/lamps/white_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json index 87da3643f27..f7d54a35b52 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/white_off_borderless" + "inactive": "gtceu:block/lamps/white_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json new file mode 100644 index 00000000000..42735b05883 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/white_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_lamp.json b/src/generated/resources/assets/gtceu/models/block/white_lamp.json index cc2fa12fc0d..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/white_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/white", - "active_overlay": "gtceu:block/lamps/white" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json index 4e8878006b4..b71b3faf8eb 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/white", "active_overlay": "gtceu:block/lamps/white_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/white_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/white_lamp_on.json new file mode 100644 index 00000000000..4522ed15ac7 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/white_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp.json index 4df35813465..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp.json @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/lamp_borderless", - "textures": { - "active": "gtceu:block/lamps/yellow_borderless" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json index 37c776a0d61..96b705cba28 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/yellow_borderless_emissive" + "active": "gtceu:block/lamps/yellow_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json index 9f5d3a4c284..ad77fe2b931 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/yellow_off_borderless" + "inactive": "gtceu:block/lamps/yellow_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json new file mode 100644 index 00000000000..aeadee0da31 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_borderless_on", + "textures": { + "active": "gtceu:block/lamps/yellow_borderless" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_lamp.json b/src/generated/resources/assets/gtceu/models/block/yellow_lamp.json index 28dd1a7124a..e69de29bb2d 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_lamp.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_lamp.json @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/lamp", - "textures": { - "active": "gtceu:block/lamps/yellow", - "active_overlay": "gtceu:block/lamps/yellow" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json index 027d8c77f32..fb7e8ae71d2 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/yellow", "active_overlay": "gtceu:block/lamps/yellow_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json new file mode 100644 index 00000000000..0f532dc8561 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/lamp_on", + "textures": { + "active": "gtceu:block/lamps/yellow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json index cb306261be0..ed0af019e1a 100644 --- a/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/black_borderless_lamp" + "parent": "gtceu:block/black_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/black_lamp.json b/src/generated/resources/assets/gtceu/models/item/black_lamp.json index 5009d942bb4..f8acb4b6c58 100644 --- a/src/generated/resources/assets/gtceu/models/item/black_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/black_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/black_lamp" + "parent": "gtceu:block/black_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json index d7c6939c703..6e499dd5755 100644 --- a/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/blue_borderless_lamp" + "parent": "gtceu:block/blue_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/blue_lamp.json b/src/generated/resources/assets/gtceu/models/item/blue_lamp.json index 21629af87f6..16b2ee53614 100644 --- a/src/generated/resources/assets/gtceu/models/item/blue_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/blue_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/blue_lamp" + "parent": "gtceu:block/blue_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json index 06c1a13eefe..c2d4ad2049a 100644 --- a/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/brown_borderless_lamp" + "parent": "gtceu:block/brown_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json b/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json index 610b95fa37a..2f5b03f59d1 100644 --- a/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/cyan_lamp" + "parent": "gtceu:block/cyan_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json index 077a9c52b0c..07abe6d60cd 100644 --- a/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/gray_borderless_lamp" + "parent": "gtceu:block/gray_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/gray_lamp.json b/src/generated/resources/assets/gtceu/models/item/gray_lamp.json index f1f49ba032a..6bcd8b968b0 100644 --- a/src/generated/resources/assets/gtceu/models/item/gray_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/gray_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/gray_lamp" + "parent": "gtceu:block/gray_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json index 6c708589feb..8cf44bd24c4 100644 --- a/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/green_borderless_lamp" + "parent": "gtceu:block/green_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json index c1c2558ff1d..c3f886d6a75 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/light_blue_borderless_lamp" + "parent": "gtceu:block/light_blue_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json index 0aa9f92d08c..62046034a02 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/light_blue_lamp" + "parent": "gtceu:block/light_blue_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json index ba98d5dba14..531884b2914 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/light_gray_borderless_lamp" + "parent": "gtceu:block/light_gray_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json index 4ff258a6e73..163222af84d 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/light_gray_lamp" + "parent": "gtceu:block/light_gray_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json index 70e7956ac61..5030d4a6508 100644 --- a/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/lime_borderless_lamp" + "parent": "gtceu:block/lime_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json index a344a461960..09df14bd560 100644 --- a/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/magenta_borderless_lamp" + "parent": "gtceu:block/magenta_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json b/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json index 917e0ebbd24..1f6f3693bab 100644 --- a/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/magenta_lamp" + "parent": "gtceu:block/magenta_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json index 2c20cdfa5ee..fbab08b7da6 100644 --- a/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/orange_borderless_lamp" + "parent": "gtceu:block/orange_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/orange_lamp.json b/src/generated/resources/assets/gtceu/models/item/orange_lamp.json index f7bfda11c79..55faf24052a 100644 --- a/src/generated/resources/assets/gtceu/models/item/orange_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/orange_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/orange_lamp" + "parent": "gtceu:block/orange_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json index 974f41940c9..4c8ec0c54a6 100644 --- a/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/pink_borderless_lamp" + "parent": "gtceu:block/pink_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/pink_lamp.json b/src/generated/resources/assets/gtceu/models/item/pink_lamp.json index f39eb45c972..dc4d410039f 100644 --- a/src/generated/resources/assets/gtceu/models/item/pink_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/pink_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/pink_lamp" + "parent": "gtceu:block/pink_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json index 32808b80261..b2cde70d299 100644 --- a/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/purple_borderless_lamp" + "parent": "gtceu:block/purple_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/purple_lamp.json b/src/generated/resources/assets/gtceu/models/item/purple_lamp.json index bfb10ac85f3..83eaa30a9b4 100644 --- a/src/generated/resources/assets/gtceu/models/item/purple_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/purple_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/purple_lamp" + "parent": "gtceu:block/purple_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json index 91cf330777d..b59947db0e7 100644 --- a/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/red_borderless_lamp" + "parent": "gtceu:block/red_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json index 969bc638329..f094edd1151 100644 --- a/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/white_borderless_lamp" + "parent": "gtceu:block/white_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/white_lamp.json b/src/generated/resources/assets/gtceu/models/item/white_lamp.json index 1c31c461357..bbc74c7fbad 100644 --- a/src/generated/resources/assets/gtceu/models/item/white_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/white_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/white_lamp" + "parent": "gtceu:block/white_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json index 9db7270eef3..fb25ba2c181 100644 --- a/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/yellow_borderless_lamp" + "parent": "gtceu:block/yellow_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json b/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json index 0156ca91e9c..a24eeb91199 100644 --- a/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/yellow_lamp" + "parent": "gtceu:block/yellow_lamp_on" } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java index 76ff524c136..bff2a3624c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java @@ -85,30 +85,27 @@ public static void rubberTreeSaplingModel(DataGenContext contex public static NonNullBiConsumer, RegistrateBlockstateProvider> lampModel(DyeColor color, boolean border) { return (ctx, prov) -> { - final String colorName = color.getSerializedName(); + final String textureBase = "block/lamps/" + color.getSerializedName(); final String borderPart = (border ? "" : "_borderless"); - ModelFile parentOn = prov.models().getExistingFile(prov.modLoc("block/lamp" + borderPart)); - ModelFile parentOff = prov.models().getExistingFile(prov.modLoc("block/lamp" + borderPart + "_off")); + final String parentModelBase = "block/lamp" + borderPart; + + ModelFile parentBloom = prov.models().getExistingFile(prov.modLoc(parentModelBase + "_bloom")); + ModelFile parentOn = prov.models().getExistingFile(prov.modLoc(parentModelBase + "_on")); + ModelFile parentOff = prov.models().getExistingFile(prov.modLoc(parentModelBase + "_off")); prov.getVariantBuilder(ctx.getEntry()) .forAllStatesExcept(state -> { if (LampBlock.isLightActive(state)) { ModelBuilder model = prov.models() - .getBuilder(ctx.getName() + (state.getValue(LampBlock.BLOOM) ? "_bloom" : "")) - .parent(parentOn); + .getBuilder(ctx.getName() + (state.getValue(LampBlock.BLOOM) ? "_bloom" : "_on")) + .parent(state.getValue(LampBlock.BLOOM) ? parentBloom : parentOn); if (border) { - model.texture("active", "block/lamps/" + colorName); + model.texture("active", textureBase); if (state.getValue(LampBlock.BLOOM)) { - model.texture("active_overlay", "block/lamps/" + colorName + "_emissive"); - } else { - model.texture("active_overlay", "block/lamps/" + colorName); + model.texture("active_overlay", textureBase + "_emissive"); } } else { - if (state.getValue(LampBlock.BLOOM)) { - model.texture("active", "block/lamps/" + colorName + "_borderless_emissive"); - } else { - model.texture("active", "block/lamps/" + colorName + "_borderless"); - } + model.texture("active", textureBase + "_borderless"); } return ConfiguredModel.builder() .modelFile(model) @@ -118,7 +115,7 @@ public static NonNullBiConsumer, RegistrateBloc .modelFile(prov.models() .getBuilder(ctx.getName() + "_off") .parent(parentOff) - .texture("inactive", "block/lamps/" + colorName + "_off" + borderPart)) + .texture("inactive", textureBase + borderPart + "_off")) .build(); } }, LampBlock.LIGHT); diff --git a/src/main/resources/assets/gtceu/models/block/cube/emissive/all.json b/src/main/resources/assets/gtceu/models/block/cube/emissive/all.json new file mode 100644 index 00000000000..d8542b27d73 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube/emissive/all.json @@ -0,0 +1,12 @@ +{ + "parent": "gtceu:block/cube/emissive/default", + "textures": { + "particle": "#all", + "down": "#all", + "up": "#all", + "north": "#all", + "east": "#all", + "south": "#all", + "west": "#all" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/cube/emissive/default.json b/src/main/resources/assets/gtceu/models/block/cube/emissive/default.json new file mode 100644 index 00000000000..039c4cdd6cb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube/emissive/default.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "shade": false, + "faces": { + "down": { "texture": "#down", "cullface": "down" }, + "up": { "texture": "#up", "cullface": "up" }, + "north": { "texture": "#north", "cullface": "north" }, + "south": { "texture": "#south", "cullface": "south" }, + "west": { "texture": "#west", "cullface": "west" }, + "east": { "texture": "#east", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/lamp.json b/src/main/resources/assets/gtceu/models/block/lamp_bloom.json similarity index 100% rename from src/main/resources/assets/gtceu/models/block/lamp.json rename to src/main/resources/assets/gtceu/models/block/lamp_bloom.json diff --git a/src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json b/src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json new file mode 100644 index 00000000000..02221906a01 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/emissive/all", + "textures": { + "all": "#active" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/lamp_borderless.json b/src/main/resources/assets/gtceu/models/block/lamp_borderless_on.json similarity index 100% rename from src/main/resources/assets/gtceu/models/block/lamp_borderless.json rename to src/main/resources/assets/gtceu/models/block/lamp_borderless_on.json diff --git a/src/main/resources/assets/gtceu/models/block/lamp_on.json b/src/main/resources/assets/gtceu/models/block/lamp_on.json new file mode 100644 index 00000000000..e24c1097eab --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/lamp_on.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "#active" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png deleted file mode 100644 index e244fd2adef6d4b32c5b18ada674975e7ba8888b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFE>PwAqJGDD$tGthqt)7XJ~}C~C~`D!5EOF~_{H4fRG~EQ c|L2Dcr{}XJriL!d1{%cR>FVdQ&MBb@0OEZ(G5`Po diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png deleted file mode 100644 index d7c80de65b7b832cfdccb7491164de1d81f4478e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF7ABoGO&& d{r~)s;q-jA#MIDb*+7FBJYD@<);T3K0RR|_I`;qo diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png deleted file mode 100644 index 30bdb8600dd37720bb2d2f41a52e1b2a69149e94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFzopr0N=4XZ~y=R diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png deleted file mode 100644 index 743480a2a9f20b4007a93a67f1c2cc2cecbe84a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8wACi1b#8MI8`Xk d`~UeN!|C~KiK(H>vVjIMc)I$ztaD0e0s!6SI&1&{ diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png deleted file mode 100644 index 2e0c168be730d95aabe86a7a824c068a82b39fb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFE>PwAqJGDD$tGthqt)7XJ~}C~C~`D!5EOF~_{H4fRG~EQ c|L2Dcr{}XJriL!d1{%cR>FVdQ&MBb@0I)AP{Qv*} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png deleted file mode 100644 index 436ab101fa21cf9fc5d83a56b9b96e5137b75777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1MG8>R*3-o?MB;Mj z*@L_X40sMZR572HR{708bAc+?7xg>NOEx)68Lig7^U+C>MUkU&F*S5qHqamjPgg&ebxsLQ09ZLWNdN!< diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png deleted file mode 100644 index 77244678a75fae833c0362ff5baaa628624673e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>77Jx2fl diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png deleted file mode 100644 index 5e60a9410fef27a113f797c1ec17ecae0a1e06e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFGR d-v7@J8BWhzopr0DH7Kg8%>k diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png deleted file mode 100644 index 6864250af2651621960ebec4a0b2da5c70b39a1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^oGZtp3d^avza;1OBOz`%DHgc*{YDJdXeX diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png deleted file mode 100644 index 11bed397b8ea8077ff6c45fe6b46ddd58e0f912c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1MG8>R*3-o?MB;Mj z*@L_X40sMZR572HR{708bAc+?7xg>NOEx)68Lig7^U+C>MUkU&F*S5qHqamjPgg&ebxsLQ0I+g7@&Et; diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png deleted file mode 100644 index 92802ad8825519a91097d63eb761797d60008bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFlBSEK+1Z9QEaLnJPT zo;}EWz<}qlLlyIBX_epnGZ(0GeNn&TykwKJl+kMKJ0G1CSrj>%HwcP33H)MiajH<7 d_y6-lhST%e5>rE$WdjXj@O1TaS?83{1OT0MJP7~* diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png deleted file mode 100644 index 87fec534a79297de6623da3201ee4d220d81f30e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_U;w|SYL`GEurJR*x382Ao@Fyrz36)8YLTTd6q5Q)p7 zXAkloFyJ}tP{n*&TIDzY%mu1kU)1k7FWKZQWwcuR&POLj7DbNc4T54$0>7ABoGO&& d{r~)s;q-jA#MIDb*+7FBJYD@<);T3K0RZ7#I%WU> diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png deleted file mode 100644 index 88aa73ca7a2ee8376e66ea3631c4a2d53af11f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1MG8>R*3-o?MB;Mj z*@L_X40sMZR572HR{708bAc+?7xg>NOEx)68Lig7^U+C>MUkU&F*S5qHqamjPgg&ebxsLQ05)wn;{X5v diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png deleted file mode 100644 index 1efa7b0104965ba75f617611cf3e7c581292c805..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^UZJ^TOw diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png deleted file mode 100644 index 4e2fd67dc41a4ef5c32da6593c0b394cfcca96da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF{70JbC~C diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta index 4da3f5f1299..e69de29bb2d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta @@ -1,5 +0,0 @@ -{ - "shimmer": { - "bloom": true - } -} From 727ae073f9d4615979be50f196ecf8c6ca38fc07 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 27 Apr 2026 23:28:22 +0300 Subject: [PATCH 185/269] Simplify lamps' "lit-on-placement" behavior by referencing how vanilla redstone lamps do it --- .../renderer/block/LampItemRenderer.java | 2 +- .../gtceu/common/block/LampBlock.java | 20 +++++++++---------- .../gtceu/common/item/LampBlockItem.java | 11 +++++----- .../gtceu/common/item/package-info.java | 4 ++++ 4 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java index 268af12e43c..27d4057548b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/LampItemRenderer.java @@ -48,7 +48,7 @@ public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext d if (!(stack.getItem() instanceof LampBlockItem item)) { return; } - BlockState state = item.getStateFromStack(stack, null); + BlockState state = item.getStateFromStack(stack, item.getBlock().defaultBlockState()); BakedModel p_model = blockRenderer.getBlockModel(state); for (var model : p_model.getRenderPasses(stack, true)) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java index f172a13d83a..cd2cddcd00f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/LampBlock.java @@ -11,6 +11,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -98,6 +99,13 @@ protected void createBlockStateDefinition(StateDefinition.Builder Date: Thu, 30 Apr 2026 12:04:52 +0300 Subject: [PATCH 186/269] Merge BloomMetadataSection into GTTextureMetadata --- .../gtceu/client/bloom/BloomUtil.java | 4 +- .../client/model/BloomMetadataSection.java | 95 ------------------- .../client/model/ctm/GTTextureMetadata.java | 5 +- .../client/util/TextureMetadataHelper.java | 39 +++++++- .../mixins/embeddium/BlockRendererMixin.java | 4 +- 5 files changed, 44 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index cd68724e251..72e72abf29f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -1,10 +1,10 @@ package com.gregtechceu.gtceu.client.bloom; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; @@ -390,7 +390,7 @@ public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderT return; } - if (BloomMetadataSection.hasBloom(quad, packedLights)) { + if (TextureMetadataHelper.hasBloom(quad, packedLights)) { QuadCacheEntry entry = new QuadCacheEntry(quad, renderType, transformation, packedLights, packedOverlay, brightness, tintR, tintG, tintB); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java b/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java deleted file mode 100644 index cbb361f1f3e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/model/BloomMetadataSection.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.gregtechceu.gtceu.client.model; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.util.GTQuadTransformers; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.atlas.SpriteSource; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.metadata.MetadataSectionSerializer; -import net.minecraft.util.GsonHelper; - -import com.google.gson.JsonObject; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; -import it.unimi.dsi.fastutil.objects.Object2BooleanMaps; -import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import org.jetbrains.annotations.ApiStatus; - -import java.io.IOException; -import java.util.function.Predicate; - -public record BloomMetadataSection(boolean bloom) { - - public static final String SECTION_NAME = GTCEu.MOD_ID; - - @ApiStatus.Internal - public static final Object2BooleanMap KNOWN_BLOOM_TEXTURES = Object2BooleanMaps.synchronize( - new Object2BooleanOpenHashMap<>()); - - public static boolean hasBloom(TextureAtlasSprite sprite) { - ResourceLocation textureLoc = SpriteSource.TEXTURE_ID_CONVERTER.idToFile(sprite.contents().name()); - return hasBloom(textureLoc); - } - - public static boolean hasBloom(ResourceLocation res) { - return KNOWN_BLOOM_TEXTURES.computeIfAbsent(res, (Predicate) (loc -> { - try { - var resource = Minecraft.getInstance().getResourceManager().getResource(loc); - if (resource.isPresent()) { - return resource.get().metadata() - .getSection(Serializer.INSTANCE).map(BloomMetadataSection::bloom) - .orElse(false); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return false; - })); - } - - public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { - if (!quad.isShade() || !quad.hasAmbientOcclusion()) { - return true; - } - if (hasBloom(quad.getSprite())) { - return true; - } - return ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom && isEmissive(quad, ambientPackedLights); - } - - public static boolean isEmissive(BakedQuad quad, int[] ambientPackedLights) { - int[] quadPackedLights = GTQuadTransformers.getPackedLights(quad); - - for (int i = 0; i < 4; i++) { - int quadLight = quadPackedLights[i]; - int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); - - int ambientLight = ambientPackedLights[i]; - int aBlock = LightTexture.block(ambientLight), aSky = LightTexture.sky(ambientLight); - - if (qBlock > aBlock || qSky > aSky) { - return true; - } - } - return false; - } - - public static class Serializer implements MetadataSectionSerializer { - - static BloomMetadataSection.Serializer INSTANCE = new BloomMetadataSection.Serializer(); - - @Override - public String getMetadataSectionName() { - return SECTION_NAME; - } - - @Override - public BloomMetadataSection fromJson(JsonObject json) { - return new BloomMetadataSection(GsonHelper.getAsBoolean(json, "bloom")); - } - } -} 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 03922701d1c..932bcdc2f20 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 @@ -18,7 +18,7 @@ import java.util.Optional; import java.util.function.Function; -public record GTTextureMetadata(@Nullable ResourceLocation connectionTexture) { +public record GTTextureMetadata(@Nullable ResourceLocation connectionTexture, boolean bloom) { public static final String SECTION_NAME = GTCEu.MOD_ID; public static final MetadataSectionSerializer SERIALIZER = new Serializer(); @@ -44,7 +44,8 @@ public static class Serializer implements MetadataSectionSerializer CODEC = RecordCodecBuilder.create(instance -> instance.group( - ResourceLocation.CODEC.optionalFieldOf("connection_texture", EMPTY_CONNECTION).forGetter(GTTextureMetadata::connectionTexture) + ResourceLocation.CODEC.optionalFieldOf("connection_texture", EMPTY_CONNECTION).forGetter(GTTextureMetadata::connectionTexture), + Codec.BOOL.optionalFieldOf("bloom", false).forGetter(GTTextureMetadata::bloom) ).apply(instance, GTTextureMetadata::new)); // spotless:on diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java index 9ed03e35404..afbde94e964 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -3,7 +3,11 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.model.ctm.GTTextureMetadata; +import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.Material; import net.minecraft.resources.ResourceLocation; @@ -11,14 +15,14 @@ import lombok.experimental.UtilityClass; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; @UtilityClass public class TextureMetadataHelper { - private static final Map metadataCache = new HashMap<>(); + private static final Map metadataCache = new ConcurrentHashMap<>(); public static Optional getMetadata(ResourceLocation res) { // Note, semantically different from computeIfAbsent, as we DO care about keys mapped to null values @@ -61,6 +65,37 @@ public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { return sprite; } + public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { + if (!quad.isShade() || !quad.hasAmbientOcclusion()) { + return true; + } + var metadata = getMetadata(quad.getSprite()); + if (metadata.isPresent() && metadata.get().bloom()) { + return true; + } else if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { + return isEmissive(quad, ambientPackedLights); + } + + return false; + } + + public static boolean isEmissive(BakedQuad quad, int[] ambientPackedLights) { + int[] quadPackedLights = GTQuadTransformers.getPackedLights(quad); + + for (int i = 0; i < 4; i++) { + int quadLight = quadPackedLights[i]; + int qBlock = LightTexture.block(quadLight), qSky = LightTexture.sky(quadLight); + + int ambientLight = ambientPackedLights[i]; + int aBlock = LightTexture.block(ambientLight), aSky = LightTexture.sky(ambientLight); + + if (qBlock > aBlock || qSky > aSky) { + return true; + } + } + return false; + } + static void invalidateCaches() { metadataCache.clear(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index 75c79ebf241..c3454535603 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.embeddium; -import com.gregtechceu.gtceu.client.model.BloomMetadataSection; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; @@ -42,7 +42,7 @@ public class BlockRendererMixin { } ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); - if (chunkContext != null && BloomMetadataSection.hasBloom((BakedQuad) quad, lightData.lm)) { + if (chunkContext != null && TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { var bloomBuilder = chunkContext.buffers.get(GTEmbeddiumCompat.BLOOM_RENDER_PASS); bloomBuilderRef.set(bloomBuilder); From 22790c69ad9017a4dd44d605d47c78fa14523dac Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 12:08:14 +0300 Subject: [PATCH 187/269] Rename "client.shader" config section to "client.bloom" --- .../java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java | 2 +- .../java/com/gregtechceu/gtceu/client/shader/GTShaders.java | 6 +++--- .../gtceu/client/util/TextureMetadataHelper.java | 2 +- .../java/com/gregtechceu/gtceu/config/ConfigHolder.java | 6 +++--- .../mixins/client/bloom/ForgeModelBlockRendererMixin.java | 2 +- .../gtceu/core/mixins/client/bloom/LevelRendererMixin.java | 2 +- .../core/mixins/client/bloom/ModelBlockRendererMixin.java | 4 ++-- .../gtceu/core/mixins/client/bloom/QuadLighterMixin.java | 2 +- .../gtceu/core/mixins/embeddium/BlockRendererMixin.java | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 72e72abf29f..4acfbdf190e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -257,7 +257,7 @@ private static void postDraw() { @ApiStatus.Internal public static void setupBloomShaderUniforms() { - final var config = ConfigHolder.INSTANCE.client.shader; + final var config = ConfigHolder.INSTANCE.client.bloom; // Forcefully insert config values to shader modifyBloomPostShaders((index, shader) -> { diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 31ebd0ebd77..aeab69b2163 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -60,7 +60,7 @@ private static void initPostShaders() { ResourceLocation id = null; - switch (ConfigHolder.INSTANCE.client.shader.bloomAlgorithm) { + switch (ConfigHolder.INSTANCE.client.bloom.bloomAlgorithm) { case UNITY -> id = GTCEu.id("shaders/post/bloom_unity.json"); case UNREAL -> id = GTCEu.id("shaders/post/bloom_unreal.json"); case DISABLED -> { @@ -69,8 +69,8 @@ private static void initPostShaders() { // skip adding a default branch in favor of the if statement below } if (id == null) { - GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.shader.bloomAlgorithm); - ConfigHolder.INSTANCE.client.shader.bloomAlgorithm = BloomAlgorithm.DISABLED; + GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.bloom.bloomAlgorithm); + ConfigHolder.INSTANCE.client.bloom.bloomAlgorithm = BloomAlgorithm.DISABLED; return; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java index afbde94e964..b5e4d16e884 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -72,7 +72,7 @@ public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { var metadata = getMetadata(quad.getSprite()); if (metadata.isPresent() && metadata.get().bloom()) { return true; - } else if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { + } else if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom) { return isEmissive(quad, ambientPackedLights); } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index b0b3ca58842..d340788b1e6 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -794,8 +794,8 @@ public static class ClientConfigs { @Configurable public RendererOptions renderer = new RendererOptions(); @Configurable - @Configurable.Comment("Config options for Shaders and Post-processing Effects") - public ShaderOptions shader = new ShaderOptions(); + @Configurable.Comment("Config options for bloom and other post-processing effects") + public BloomOptions bloom = new BloomOptions(); @Configurable public TankItemFluidPreview tankItemFluidPreview = new TankItemFluidPreview(); @@ -822,7 +822,7 @@ public static class ArmorHud { public int hudOffsetY = 0; } - public static class ShaderOptions { + public static class BloomOptions { @Configurable @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java index 677650d3cc1..09c7de27231 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java @@ -35,7 +35,7 @@ public class ForgeModelBlockRendererMixin { ModelData modelData, RenderType renderType, CallbackInfoReturnable cir, @Local(name = "flatLighter") QuadLighter flatLighter) { - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return; } if (flatLighter != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 1d46e447c38..0d9a8ed79f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -64,7 +64,7 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt BloomUtil.setupBloomShaderUniforms(); - if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom) { + if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom) { BloomUtil.setFilterToggleUniform(true); this.renderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); } else { 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 8e737f4d1a1..d102b2a17de 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 @@ -40,7 +40,7 @@ public class ModelBlockRendererMixin { RandomSource random, long seed, int packedOverlay, ModelData modelData, RenderType renderType, Operation original) { - if (ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom && GTShaders.canUseBloomShader()) { + if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom && GTShaders.canUseBloomShader()) { try (var $ = gtceu$currentRenderType_tl.get().with(renderType, pos)) { original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, modelData, renderType); @@ -57,7 +57,7 @@ public class ModelBlockRendererMixin { private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java index d85e8258885..20d9ac8df0c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java @@ -36,7 +36,7 @@ public class QuadLighterMixin implements IGTQuadLighter { float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java index c3454535603..4db637c87ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java @@ -37,7 +37,7 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); - if (!ConfigHolder.INSTANCE.client.shader.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { + if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { return; } From 170caf126c1a19adb849d09d79ad89170caeef28 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 12:08:51 +0300 Subject: [PATCH 188/269] merge `enableBloom` and `bloomAlgorithm` config fields --- .../gregtechceu/gtceu/client/shader/GTShaders.java | 8 ++++---- .../com/gregtechceu/gtceu/config/ConfigHolder.java | 14 +++++--------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index aeab69b2163..bc88c9c2b1b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -60,7 +60,7 @@ private static void initPostShaders() { ResourceLocation id = null; - switch (ConfigHolder.INSTANCE.client.bloom.bloomAlgorithm) { + switch (ConfigHolder.INSTANCE.client.bloom.bloomType) { case UNITY -> id = GTCEu.id("shaders/post/bloom_unity.json"); case UNREAL -> id = GTCEu.id("shaders/post/bloom_unreal.json"); case DISABLED -> { @@ -69,8 +69,8 @@ private static void initPostShaders() { // skip adding a default branch in favor of the if statement below } if (id == null) { - GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.bloom.bloomAlgorithm); - ConfigHolder.INSTANCE.client.bloom.bloomAlgorithm = BloomAlgorithm.DISABLED; + GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.bloom.bloomType); + ConfigHolder.INSTANCE.client.bloom.bloomType = BloomAlgorithm.DISABLED; return; } @@ -111,7 +111,7 @@ public static boolean canUseBloomShader() { } private static boolean canLoadBloomShader() { - return ConfigHolder.INSTANCE.client.shader.enableBloom && bloomShaderAvailable; + return ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && bloomShaderAvailable; } private static boolean bloomShaderAvailable; diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index d340788b1e6..a432356d2c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -824,21 +824,17 @@ public static class ArmorHud { public static class BloomOptions { - @Configurable - @Configurable.Comment({ "Whether to use custom shaders for bloom", "Default: true" }) - public boolean enableBloom = true; - - @Configurable - @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) - public boolean emissiveTexturesHaveBloom = true; - @Configurable @Configurable.Comment({ "Bloom Algorithm", "UNITY - Unity-like Bloom (rescale)", "UNREAL - Unreal-like Bloom (gaussian blur)", "DISABLED - No bloom", "Default: UNREAL" }) - public BloomAlgorithm bloomAlgorithm = BloomAlgorithm.UNREAL; + public BloomAlgorithm bloomType = BloomAlgorithm.UNREAL; + + @Configurable + @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) + public boolean emissiveTexturesHaveBloom = true; @Configurable @Configurable.Comment({ From 3756c96d05099fcff37f133470036edf02b631a0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 12:19:31 +0300 Subject: [PATCH 189/269] Fix block bloom only being rendered if the emissive texture bloom config is enabled --- .../core/mixins/client/bloom/LevelRendererMixin.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 0d9a8ed79f5..976ad1afe71 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -64,12 +64,10 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt BloomUtil.setupBloomShaderUniforms(); - if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom) { - BloomUtil.setFilterToggleUniform(true); - this.renderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); - } else { - BloomUtil.setFilterToggleUniform(false); - } + + BloomUtil.setFilterToggleUniform(true); + this.renderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); + BloomUtil.setFilterToggleUniform(false); // have to re-setup here. so sad. very aw. GTRenderTypes.bloom().setupRenderState(); From accac63c13d774903f356fc72df7f3c92c6947c3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:42:38 +0300 Subject: [PATCH 190/269] Implement a sort of 'safe mode' for bloom that's more stable but slower --- .../client/bloom/BloomEventListeners.java | 37 ++- .../gtceu/client/bloom/BloomSafeMode.java | 223 ++++++++++++++++++ .../gtceu/client/bloom/BloomUtil.java | 109 ++++++--- .../gtceu/config/ConfigHolder.java | 8 + .../bloom/ForgeModelBlockRendererMixin.java | 8 +- .../client/bloom/LevelRendererMixin.java | 39 +-- .../client/bloom/ModelBlockRendererMixin.java | 14 +- .../mixins/client/bloom/QuadLighterMixin.java | 5 +- .../mixins/client/bloom/RebuildTaskMixin.java | 11 +- .../mixins/client/bloom/RenderTypeMixin.java | 5 + .../client/bloom/VertexBufferAccessor.java | 13 - .../bloom/safemode/LevelRendererAccessor.java | 16 ++ .../bloom/safemode/LevelRendererMixin.java | 30 +++ .../safemode/ModelBlockRendererMixin.java | 32 +++ .../bloom/safemode/QuadLighterMixin.java | 34 +++ .../bloom/safemode/RebuildTaskMixin.java | 39 +++ .../{ => bloom}/BlockRendererMixin.java | 10 +- .../{ => bloom}/DefaultMaterialsMixin.java | 14 +- .../DefaultTerrainRenderPassesMixin.java | 21 +- .../bloom/safemode/BlockRendererMixin.java | 84 +++++++ .../mixins/iris/WorldRenderingPhaseMixin.java | 21 +- .../gtceu/core/util/CapturedQuadData.java | 7 + .../embeddium/GTEmbeddiumCompat.java | 30 ++- .../iris/{IrisHooks.java => GTIrisHooks.java} | 2 +- src/main/resources/gtceu.mixins.json | 13 +- 25 files changed, 699 insertions(+), 126 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/VertexBufferAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java rename src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/{ => bloom}/BlockRendererMixin.java (93%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/{ => bloom}/DefaultMaterialsMixin.java (64%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/{ => bloom}/DefaultTerrainRenderPassesMixin.java (74%) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/safemode/BlockRendererMixin.java rename src/main/java/com/gregtechceu/gtceu/integration/iris/{IrisHooks.java => GTIrisHooks.java} (95%) 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 997da7eda5c..06927f5e1aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -4,11 +4,19 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.SectionPos; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraftforge.client.ForgeRenderTypes; import net.minecraftforge.client.event.RegisterNamedRenderTypesEvent; import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -44,6 +52,24 @@ public static void onLevelUnload(LevelEvent.Unload event) { BloomUtil.invalidateLevelData(event.getLevel()); } + @SubscribeEvent + public static void onChunkUnload(ChunkEvent.Unload event) { + if (!GTShaders.canUseBloomShader()) { + return; + } + ChunkAccess chunk = event.getChunk(); + LevelAccessor level = chunk.getWorldForge(); + if (level == null) { + return; + } + + ChunkPos chunkPos = chunk.getPos(); + int minSection = level.getMinSection(), maxSection = level.getMaxSection(); + for (int y = minSection; y < maxSection; y++) { + BloomUtil.invalidateSectionData(SectionPos.of(chunkPos.x, y, chunkPos.z)); + } + } + // Merge into parent class in 1.21, event listener discovery is smarter there @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) @UtilityClass @@ -61,7 +87,16 @@ public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent e @SubscribeEvent public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { - event.register("bloom", GTRenderTypes.bloom(), GTRenderTypes.entityBloomBlockSheet()); + RenderType block, entity; + if (ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.canUseBloomShader()) { + // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' + block = RenderType.cutout(); + entity = ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); + } else { + block = GTRenderTypes.bloom(); + entity = GTRenderTypes.entityBloomBlockSheet(); + } + event.register("gtceu:bloom", block, entity); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java new file mode 100644 index 00000000000..337e68af089 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java @@ -0,0 +1,223 @@ +package com.gregtechceu.gtceu.client.bloom; + +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.mojang.blaze3d.pipeline.RenderCall; +import com.mojang.blaze3d.shaders.Uniform; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.core.SectionPos; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.ForgeHooksClient; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +import static com.gregtechceu.gtceu.client.bloom.BloomUtil.*; + +/** + * A 'safe mode' for bloom rendering that's less intrusive but slower than the normal implementation. + */ +public class BloomSafeMode { + + // it's most likely better to use ConcurrentHashMaps rather than synchronized Long2ObjectMaps for this + // even with the boxing overhead + public static Map BLOOM_BUFFERS = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); + + @ApiStatus.Internal + public static ThreadLocal<@Nullable SectionPos> CURRENT_RENDERING_SECTION = new ThreadLocal<>(); + + public static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, + LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { + Vec3 camPos = camera.getPosition(); + profilerFiller.push("safe_mode"); + + ShaderInstance shader = setupBlockShaderUniforms(poseStack, projectionMatrix); + Uniform chunkOffset = shader.CHUNK_OFFSET; + + BLOOM_RENDER_LOCK.readLock().lock(); + try { + for (var entry : BLOOM_BUFFERS.entrySet()) { + SectionPos sectionPos = entry.getKey(); + VertexBuffer buffer = entry.getValue(); + + // noinspection ConstantValue it just isn't annotated :)) + if (buffer.isInvalid() || buffer.getFormat() == null) { + // return early if buffer is invalid or has no vertex data bound + continue; + } + + if (chunkOffset != null) { + chunkOffset.set(sectionPos.minBlockX() - (float) camPos.x(), + sectionPos.minBlockY() - (float) camPos.y(), + sectionPos.minBlockZ() - (float) camPos.z()); + chunkOffset.upload(); + } + + buffer.bind(); + buffer.draw(); + } + } finally { + BLOOM_RENDER_LOCK.readLock().unlock(); + } + + if (chunkOffset != null) { + chunkOffset.set(0, 0, 0); + } + shader.clear(); + VertexBuffer.unbind(); + + // pop the "safe_mode" profiler section before posting forge render stage event + profilerFiller.pop(); + + // noinspection UnstableApiUsage + ForgeHooksClient.dispatchRenderStage(AFTER_BLOOM_RENDER_STAGE, levelRenderer, poseStack, projectionMatrix, + levelRenderer.getTicks(), camera, frustum); + } + + public static void copyToBloomBuffer(VertexConsumer originalVertexConsumer, BakedQuad quad, int[] combinedLights, + Consumer draw) { + draw.accept(originalVertexConsumer); + + if (!ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.canUseBloomShader()) { + return; + } + + SectionPos sectionOrigin = CURRENT_RENDERING_SECTION.get(); + if (sectionOrigin != null && TextureMetadataHelper.hasBloom(quad, combinedLights)) { + draw.accept(getOrStartBloomBuffer(sectionOrigin)); + } + } + + public static void finishBloomBuffer(SectionPos sectionPos, BufferBuilder builder) { + BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); + if (buffer == null) { + return; + } + + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + BLOOM_BUFFER_BUILDERS.remove(sectionPos, builder); + BLOOM_BUFFER_SORT_STATES.put(sectionPos, builder.getSortState()); + + RenderCall upload = () -> { + VertexBuffer vertexBuffer = BLOOM_BUFFERS.computeIfAbsent(sectionPos, + $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); + uploadBloomBuffer(buffer, vertexBuffer); + }; + if (RenderSystem.isOnRenderThread()) { + upload.execute(); + } else { + RenderSystem.recordRenderCall(upload); + } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + } + + public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, VertexBuffer buffer) { + if (!buffer.isInvalid()) { + buffer.bind(); + buffer.upload(builder); + VertexBuffer.unbind(); + } + } + + public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { + BufferBuilder builder = BLOOM_BUFFER_BUILDERS.computeIfAbsent(sectionPos, + $ -> new BufferBuilder(GTRenderTypes.bloom().bufferSize())); + if (!builder.building()) { + builder.begin(GTRenderTypes.bloom().mode(), GTRenderTypes.bloom().format()); + } + return builder; + } + + public static void bakeBloomChunkBuffers(SectionPos sectionPos, Vec3 camPos) { + if (!ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.canUseBloomShader()) { + return; + } + + BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(sectionPos); + if (builder == null || !builder.building()) { + return; + } + builder.setQuadSorting(VertexSorting.byDistance( + (float) camPos.x() - sectionPos.minBlockX(), + (float) camPos.y() - sectionPos.minBlockY(), + (float) camPos.z() - sectionPos.minBlockZ() + )); + + finishBloomBuffer(sectionPos, builder); + } + + /// @return the shader to use for drawing block bloom. + private static ShaderInstance setupBlockShaderUniforms(PoseStack poseStack, Matrix4f projectionMatrix) { + ShaderInstance shader = RenderSystem.getShader(); + assert shader != null; + + for(int i = 0; i < 12; ++i) { + int textureId = RenderSystem.getShaderTexture(i); + shader.setSampler("Sampler" + i, textureId); + } + if (shader.MODEL_VIEW_MATRIX != null) shader.MODEL_VIEW_MATRIX.set(poseStack.last().pose()); + if (shader.PROJECTION_MATRIX != null) shader.PROJECTION_MATRIX.set(projectionMatrix); + if (shader.COLOR_MODULATOR != null) shader.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); + if (shader.GLINT_ALPHA != null) shader.GLINT_ALPHA.set(RenderSystem.getShaderGlintAlpha()); + if (shader.FOG_START != null) shader.FOG_START.set(RenderSystem.getShaderFogStart()); + if (shader.FOG_END != null) shader.FOG_END.set(RenderSystem.getShaderFogEnd()); + if (shader.FOG_COLOR != null) shader.FOG_COLOR.set(RenderSystem.getShaderFogColor()); + if (shader.FOG_SHAPE != null) shader.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); + if (shader.TEXTURE_MATRIX != null) shader.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); + if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + + RenderSystem.setupShaderLights(shader); + shader.apply(); + + return shader; + } + + static void invalidateLevelData() { + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + BLOOM_BUFFERS.clear(); + BLOOM_BUFFER_BUILDERS.clear(); + BLOOM_BUFFER_SORT_STATES.clear(); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + } + + public static void invalidateSectionData(SectionPos sectionPos) { + BLOOM_RENDER_LOCK.writeLock().lock(); + + try { + BLOOM_BUFFER_BUILDERS.remove(sectionPos); + BLOOM_BUFFER_SORT_STATES.remove(sectionPos); + VertexBuffer buffer = BLOOM_BUFFERS.remove(sectionPos); + + if (buffer != null) { + if (!RenderSystem.isOnRenderThread()) { + RenderSystem.recordRenderCall(buffer::close); + } else { + buffer.close(); + } + } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 4acfbdf190e..c0bd2eb757b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -8,9 +8,11 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; +import com.gregtechceu.gtceu.core.mixins.client.bloom.safemode.LevelRendererAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; +import lombok.experimental.UtilityClass; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; @@ -22,6 +24,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RenderLevelStageEvent; @@ -33,6 +36,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; +import org.joml.Matrix4f; import org.joml.Matrix4fc; import java.util.*; @@ -41,14 +45,15 @@ import java.util.function.*; @OnlyIn(Dist.CLIENT) +@UtilityClass public class BloomUtil { public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM_RENDER_STAGE; - private static final Map<@Nullable IRenderSetup, BloomRenderList> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); - private static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); + static final Map<@Nullable IRenderSetup, BloomRenderList> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); + static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); - private static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); + static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); public static void init() {} @@ -168,35 +173,42 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup return ticket; } - /** - * Invalidate tickets associated with given level. - * - * @param level the level that was unloaded - */ - public static void invalidateLevelData(LevelAccessor level) { - Objects.requireNonNull(level, "level == null"); - BLOOM_RENDER_LOCK.readLock().lock(); - try { - for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { - if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { - ticket.invalidate(); - } - } + @ApiStatus.Internal + public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, + float partialTicks, LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { + if (!GTShaders.canUseBloomShader()) return; - for (var e : BLOOM_RENDERS.entrySet()) { - for (BloomRenderTicket ticket : e.getValue()) { - if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { - ticket.invalidate(); - } - } - } - } finally { - BLOOM_RENDER_LOCK.readLock().lock(); + Vec3 camPos = camera.getPosition(); + + profilerFiller.popPush("gtceu:bloom"); + BloomUtil.setupBloomShaderUniforms(); + + // if safe mode is enabled, don't draw block bloom the 'normal' way + if (!ConfigHolder.INSTANCE.client.bloom.safeMode) { + BloomUtil.setFilterToggleUniform(true); + ((LevelRendererAccessor) levelRenderer).invokeRenderChunkLayer(GTRenderTypes.bloom(), poseStack, + camPos.x, camPos.y, camPos.z, projectionMatrix); + BloomUtil.setFilterToggleUniform(false); + } + + // have to re-setup here. so sad. very aw. + GTRenderTypes.bloom().setupRenderState(); + + renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); + if (ConfigHolder.INSTANCE.client.bloom.safeMode) { + BloomUtil.setFilterToggleUniform(true); + BloomSafeMode.drawBlockBloom(camera, poseStack, frustum, projectionMatrix, levelRenderer, profilerFiller); + BloomUtil.setFilterToggleUniform(false); } + BloomUtil.processPostEffect(partialTicks, profilerFiller); + + GTRenderTypes.bloom().clearRenderState(); + + // profiler section is popped by popPush() in the calling function; don't pop it here } - public 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 @@ -233,7 +245,7 @@ public static void processPostEffect(float partialTicks, ProfilerFiller profiler profilerFiller.pop(); } - private static void preDraw() { + static void preDraw() { BLOOM_RENDER_LOCK.writeLock().lock(); try { for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { @@ -246,7 +258,7 @@ private static void preDraw() { } } - private static void postDraw() { + static void postDraw() { BLOOM_RENDER_LOCK.writeLock().lock(); try { BLOOM_RENDERS.values().removeIf(BloomRenderList::postDraw); @@ -297,6 +309,43 @@ private static void modifyBloomPostShaders(IntObjectConsumer con } } + /** + * Invalidate tickets associated with given level. + * + * @param level the level that was unloaded + */ + public static void invalidateLevelData(LevelAccessor level) { + Objects.requireNonNull(level, "level == null"); + BLOOM_RENDER_LOCK.readLock().lock(); + try { + for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { + ticket.invalidate(); + } + } + + for (var e : BLOOM_RENDERS.entrySet()) { + for (BloomRenderTicket ticket : e.getValue()) { + if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { + ticket.invalidate(); + } + } + } + } finally { + BLOOM_RENDER_LOCK.readLock().lock(); + } + + if (ConfigHolder.INSTANCE.client.bloom.safeMode) { + BloomSafeMode.invalidateLevelData(); + } + } + + public static void invalidateSectionData(SectionPos sectionPos) { + if (ConfigHolder.INSTANCE.client.bloom.safeMode) { + BloomSafeMode.invalidateSectionData(sectionPos); + } + } + // region vanilla-only code paths for automagic block bloom /// @implNote map values are {@link LinkedHashSet}s for iteration order stability diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index a432356d2c2..0a67dbd8a3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -836,6 +836,14 @@ public static class BloomOptions { @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) public boolean emissiveTexturesHaveBloom = true; + @Configurable + @Configurable.Comment({ "Whether or not to use a 'safe mode' for bloom rendering", + "NOTE: considerably slower than the normal process, but likely fixes compatibility issues with other mods.", + "Requires restarting the client to take effect.", + "Default: false" }) + // @Configurable.RequiresRestart + public boolean safeMode = false; + @Configurable @Configurable.Comment({ "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java index 09c7de27231..2bd7497e6bb 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java @@ -28,16 +28,16 @@ public class ForgeModelBlockRendererMixin { @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;setup(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) - private static void gtceu$skipBloomyQuadsFromModel(VertexConsumer vertexConsumer, QuadLighter lighter, + private static void gtceu$setQuadLighterRenderType(VertexConsumer vertexConsumer, QuadLighter lighter, BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, PoseStack poseStack, boolean checkSides, RandomSource rand, long seed, int packedOverlay, ModelData modelData, RenderType renderType, CallbackInfoReturnable cir, @Local(name = "flatLighter") QuadLighter flatLighter) { - if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { - return; - } + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; + if (flatLighter != null) { // this is always in the flatLighter init block ((IGTQuadLighter) flatLighter).gtceu$setRenderType(renderType); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 976ad1afe71..39755b2fd8d 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -1,18 +1,14 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Camera; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraft.world.phys.Vec3; import com.llamalad7.mixinextras.expression.Definition; import com.llamalad7.mixinextras.expression.Expression; @@ -20,7 +16,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import org.joml.Matrix4f; 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; @@ -28,19 +23,15 @@ @Mixin(value = LevelRenderer.class) public abstract class LevelRendererMixin { - @Shadow - protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseStack, - double camX, double camY, double camZ, Matrix4f projectionMatrix); - @Inject(method = "resize", at = @At("TAIL")) - private void gtceu$resize(int width, int height, CallbackInfo ci) { + private void gtceu$resizeBloomChain(int width, int height, CallbackInfo ci) { if (GTShaders.BLOOM_CHAIN != null) { GTShaders.BLOOM_CHAIN.resize(width, height); } } - @Inject(method = "graphicsChanged", at = @At("TAIL")) - private void gtceu$graphicsChanged(CallbackInfo ci) { + @Inject(method = "deinitTransparency", at = @At("TAIL")) + private void gtceu$deinitBloomEffect(CallbackInfo ci) { GTShaders.deinitPostShaders(); } @@ -56,27 +47,9 @@ protected abstract void renderChunkLayer(RenderType renderType, PoseStack poseSt GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f projectionMatrix, CallbackInfo ci, - @Local Frustum frustum, @Local Vec3 camPos, + @Local Frustum frustum, @Local ProfilerFiller profilerFiller) { - if (!GTShaders.canUseBloomShader()) return; - - profilerFiller.popPush("gtceu:bloom"); - - BloomUtil.setupBloomShaderUniforms(); - - - BloomUtil.setFilterToggleUniform(true); - this.renderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); - BloomUtil.setFilterToggleUniform(false); - - // have to re-setup here. so sad. very aw. - GTRenderTypes.bloom().setupRenderState(); - - BloomUtil.renderSpecialBloom(camera, poseStack, frustum, partialTick, profilerFiller); - BloomUtil.processPostEffect(partialTick, profilerFiller); - - GTRenderTypes.bloom().clearRenderState(); - - // profiler section is popped by popPush() in the calling function; don't pop it here + BloomUtil.renderBloom(camera, poseStack, frustum, projectionMatrix, partialTick, + (LevelRenderer) (Object) this, profilerFiller); } } 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 d102b2a17de..8c13dc2f23b 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 @@ -40,12 +40,7 @@ public class ModelBlockRendererMixin { RandomSource random, long seed, int packedOverlay, ModelData modelData, RenderType renderType, Operation original) { - if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom && GTShaders.canUseBloomShader()) { - try (var $ = gtceu$currentRenderType_tl.get().with(renderType, pos)) { - original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, - modelData, renderType); - } - } else { + try (var $ = gtceu$currentRenderType_tl.get().with(renderType, pos)) { original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, modelData, renderType); } @@ -57,11 +52,12 @@ public class ModelBlockRendererMixin { private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { - return true; - } + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return true; + if (!GTShaders.canUseBloomShader()) return true; CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); + if (!currentData.isSet()) return true; + BloomUtil.captureBloomQuad(quad, currentData.renderType(), currentData.pos(), poseEntry.pose(), packedLights, packedOverlay, brightness, red, green, blue); return true; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java index 20d9ac8df0c..1c44b576e3a 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java @@ -36,9 +36,8 @@ public class QuadLighterMixin implements IGTQuadLighter { float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { - return true; - } + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return true; + if (!GTShaders.canUseBloomShader()) return true; BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), packedLights, packedOverlay, brightness, red, green, blue); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java index 3f65c2b3ad5..cc6df755a78 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java @@ -2,6 +2,8 @@ import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; @@ -20,7 +22,7 @@ import java.util.Set; @Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") -abstract class RebuildTaskMixin { +public abstract class RebuildTaskMixin { @Shadow(aliases = { "this$1", "f_290687_", "f" }) @Final @@ -33,10 +35,11 @@ abstract class RebuildTaskMixin { CallbackInfoReturnable cir, @Local(ordinal = 0) BlockPos sectionOrigin, @Local Set usedRenderTypes) { + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; + long sectionPos = SectionPos.asLong(sectionOrigin); - if (!BloomUtil.chunkSectionHasBloomQuads(sectionPos)) { - return; - } + if (!BloomUtil.chunkSectionHasBloomQuads(sectionPos)) return; BloomUtil.drawBlockBloomForChunk(sectionPos, renderType -> { BufferBuilder buffer = chunkBufferBuilders.builder(renderType); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java index 4a35b593527..969f474cae1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java @@ -2,6 +2,8 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.renderer.RenderType; import com.google.common.collect.ImmutableList; @@ -17,6 +19,9 @@ public class RenderTypeMixin { target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false)) private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return original; + if (!GTShaders.canUseBloomShader()) return original; + return ImmutableList.builder() .addAll(original).add(GTRenderTypes.bloom()) .build(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/VertexBufferAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/VertexBufferAccessor.java deleted file mode 100644 index c9bf6b925a3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/VertexBufferAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; - -import com.mojang.blaze3d.vertex.VertexBuffer; -import com.mojang.blaze3d.vertex.VertexFormat; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(VertexBuffer.class) -public interface VertexBufferAccessor { - - @Accessor - VertexFormat.Mode getMode(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java new file mode 100644 index 00000000000..8d90b9d77d9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java @@ -0,0 +1,16 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderType; +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(LevelRenderer.class) +public interface LevelRendererAccessor { + + @Invoker + void invokeRenderChunkLayer(RenderType renderType, PoseStack poseStack, double camX, double camY, double camZ, + Matrix4f projectionMatrix); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java new file mode 100644 index 00000000000..841062fffc7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java @@ -0,0 +1,30 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; + +import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.core.SectionPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LevelRenderer.class) +public class LevelRendererMixin { + + @Inject(method = "compileChunks", + at = @At(value = "INVOKE", + ordinal = 0, + target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) + private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, + @Local SectionPos sectionPos) { + if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; + + BloomSafeMode.CURRENT_RENDERING_SECTION.set(sectionPos); + BloomSafeMode.bakeBloomChunkBuffers(sectionPos, camera.getPosition()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java new file mode 100644 index 00000000000..04d18a4185c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java @@ -0,0 +1,32 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; + +import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.model.BakedQuad; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.ModelBlockRendererMixin} + * + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.ModelBlockRendererMixin + */ +@Mixin(ModelBlockRenderer.class) +public class ModelBlockRendererMixin { + + @WrapOperation(method = "putQuadData", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) + private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BloomSafeMode.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { + original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java new file mode 100644 index 00000000000..278877a5b86 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java @@ -0,0 +1,34 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; + +import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; + +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraftforge.client.model.lighting.QuadLighter; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.blaze3d.vertex.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.QuadLighterMixin} + * + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.QuadLighterMixin + */ +@Mixin(value = QuadLighter.class, remap = false) +public class QuadLighterMixin { + + @WrapOperation(method = "process", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", + remap = true)) + private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + BloomSafeMode.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { + original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); + }); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java new file mode 100644 index 00000000000..7a4af3fa244 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java @@ -0,0 +1,39 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; + +import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; + +import com.gregtechceu.gtceu.config.ConfigHolder; +import net.minecraft.client.renderer.ChunkBufferBuilderPack; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.core.BlockPos; + +import net.minecraft.core.SectionPos; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.RebuildTaskMixin} + * + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.RebuildTaskMixin + */ +@Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") +public class RebuildTaskMixin { + + @Shadow(aliases = { "this$1", "f_290687_", "f" }) + @Final + ChunkRenderDispatcher.RenderChunk this$1; + + @Inject(method = "compile", at = @At(value = "HEAD")) + private void gtceu$startBloomBufferForChunk(float x, float y, float z, + ChunkBufferBuilderPack chunkBufferBuilderPack, + CallbackInfoReturnable cir) { + if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; + + BlockPos pos = this.this$1.getOrigin(); + BloomSafeMode.CURRENT_RENDERING_SECTION.set(SectionPos.of(pos)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/BlockRendererMixin.java similarity index 93% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/BlockRendererMixin.java index 4db637c87ee..c6c32b5b2f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/BlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; +package com.gregtechceu.gtceu.core.mixins.embeddium.bloom; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; @@ -37,9 +37,8 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); - if (!ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom || !GTShaders.canUseBloomShader()) { - return; - } + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); if (chunkContext != null && TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { @@ -59,6 +58,9 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(originalBuilder, sprite); + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; + // 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(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultMaterialsMixin.java similarity index 64% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultMaterialsMixin.java index b9e587bc591..4f594b718f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultMaterialsMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultMaterialsMixin.java @@ -1,6 +1,8 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; +package com.gregtechceu.gtceu.core.mixins.embeddium.bloom; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; @@ -15,11 +17,13 @@ @Mixin(value = DefaultMaterials.class, remap = false) public class DefaultMaterialsMixin { - @Inject(method = "forRenderLayer", - at = @At(value = "NEW", target = "java/lang/IllegalArgumentException"), - cancellable = true) - private static void gtceu$checkForBloomLayer(RenderType renderType, + @Inject(method = "forRenderLayer", at = @At(value = "HEAD"), cancellable = true) + private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { + // TODO add a way to conditionally load mixins based on configs + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; + if (renderType == GTRenderTypes.bloom()) { cir.setReturnValue(GTEmbeddiumCompat.BLOOM_MATERIAL); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultTerrainRenderPassesMixin.java similarity index 74% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultTerrainRenderPassesMixin.java index f489cf54794..a566da1cccd 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/DefaultTerrainRenderPassesMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultTerrainRenderPassesMixin.java @@ -1,6 +1,8 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium; +package com.gregtechceu.gtceu.core.mixins.embeddium.bloom; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; @@ -22,24 +24,31 @@ public class DefaultTerrainRenderPassesMixin { // spotless:off + @Definition(id = "ALL", field = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;ALL:[Lme/jellysquid/mods/sodium/client/render/chunk/terrain/TerrainRenderPass;") - // @Definition(id = "TerrainRenderPass", type = TerrainRenderPass.class) @Expression("ALL = @(?)") // technically quite brittle. I don't think it matters much here, though. @ModifyExpressionValue(method = "", at = @At("MIXINEXTRAS:EXPRESSION")) - private static TerrainRenderPass[] gtceu$forceAddBloomToTerrainRenderPasses(TerrainRenderPass[] original) { + private static TerrainRenderPass[] gtceu$forceAddBloomToTerrainRenderPasses$1(TerrainRenderPass[] original) { + // TODO add a way to conditionally load mixins based on configs + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return original; + if (!GTShaders.canUseBloomShader()) return original; + return ArrayUtils.add(original, GTEmbeddiumCompat.BLOOM_RENDER_PASS); } @Definition(id = "RENDER_PASS_MAPPINGS", field = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;RENDER_PASS_MAPPINGS:Ljava/util/Map;") - // @Definition(id = "Map", type = Map.class) - // @Definition(id = "of", method = "Ljava/util/Map;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;") @Expression("RENDER_PASS_MAPPINGS = @(?)") // technically quite brittle. I don't think it matters much here, though. @ModifyExpressionValue(method = "", at = @At("MIXINEXTRAS:EXPRESSION")) - private static Map> gtceu$forceAddBloomToTerrainRenderPasses(Map> original) { + private static Map> gtceu$forceAddBloomToTerrainRenderPasses$2(Map> original) { + // TODO add a way to conditionally load mixins based on configs + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return original; + if (!GTShaders.canUseBloomShader()) return original; + return ImmutableMap.>builder() .putAll(original) .put(GTRenderTypes.bloom(), List.of(GTEmbeddiumCompat.BLOOM_RENDER_PASS)) .build(); } + // spotless:on } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/safemode/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/safemode/BlockRendererMixin.java new file mode 100644 index 00000000000..c4f4600eb21 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/safemode/BlockRendererMixin.java @@ -0,0 +1,84 @@ +package com.gregtechceu.gtceu.core.mixins.embeddium.bloom.safemode; + +import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import com.mojang.blaze3d.vertex.BufferBuilder; +import net.caffeinemc.mods.sodium.api.util.ColorARGB; +import net.caffeinemc.mods.sodium.api.util.NormI8; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.SectionPos; +import net.minecraft.world.phys.Vec3; + +import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; +import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; +import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; +import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderContext; +import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.embeddium.bloom.BlockRendererMixin} + * + * @see com.gregtechceu.gtceu.core.mixins.embeddium.bloom.BlockRendererMixin + */ +@Mixin(value = BlockRenderer.class, remap = false) +public class BlockRendererMixin { + + @Inject(method = "writeGeometry", at = @At(value = "HEAD")) + private void gtceu$captureBloomQuads$initLocals(BlockRenderContext ctx, ChunkModelBuilder builder, + Vec3 offset, Material material, BakedQuadView quad, + int[] colors, QuadLightData light, + CallbackInfo ci, + @Share("bufferBuilder") LocalRef bufferBuilder) { + // TODO add a way to conditionally load mixins based on configs + // so this doesn't need to be injected at all if the config isn't enabled + if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; + // Check if quad is full brightness OR we have bloom enabled for the quad + if (!GTShaders.canUseBloomShader() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { + return; + } + + SectionPos sectionPos = SectionPos.of(ctx.pos()); + bufferBuilder.set(BloomSafeMode.getOrStartBloomBuffer(sectionPos)); + } + + @Inject(method = "writeGeometry", + at = @At(value = "FIELD", + target = "Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;light:I", + opcode = Opcodes.PUTFIELD, + shift = At.Shift.AFTER)) + private void gtceu$captureBloomQuads2(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, + Material material, BakedQuadView quad, int[] colors, QuadLightData light, + CallbackInfo ci, + @Local(name = "srcIndex") int srcIndex, + @Local(name = "out") ChunkVertexEncoder.Vertex v, + @Share("bufferBuilder") LocalRef bufferBuilder) { + // TODO add a way to conditionally load mixins based on configs + if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; + // Check if quad is full brightness OR we have bloom enabled for the quad + if (!GTShaders.canUseBloomShader() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { + return; + } + + int normal = quad.getForgeNormal(srcIndex); + if (normal == 0) normal = quad.getComputedFaceNormal(); + + bufferBuilder.get().vertex(v.x, v.y, v.z) + .color(ColorARGB.toABGR(v.color)) + .uv(v.u, v.v) + .uv2(v.light) + .normal(NormI8.unpackX(normal), NormI8.unpackY(normal), NormI8.unpackZ(normal)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java index 44dbabc94d6..052e4d6e704 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java @@ -1,7 +1,9 @@ package com.gregtechceu.gtceu.core.mixins.iris; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.integration.iris.IrisHooks; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.iris.GTIrisHooks; import net.irisshaders.iris.pipeline.WorldRenderingPhase; import net.minecraft.client.renderer.RenderType; @@ -31,17 +33,20 @@ public class WorldRenderingPhaseMixin { } static { - IrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("BLOOM", $VALUES.length); - $VALUES = ArrayUtils.add($VALUES, IrisHooks.BLOOM_RENDERING_PHASE); + if (!ConfigHolder.INSTANCE.client.bloom.safeMode && GTShaders.canUseBloomShader()) { + GTIrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("GTCEU:BLOOM", $VALUES.length); + $VALUES = ArrayUtils.add($VALUES, GTIrisHooks.BLOOM_RENDERING_PHASE); + } } - @Inject(method = "fromTerrainRenderType", - at = @At(value = "NEW", target = "java/lang/IllegalStateException"), - cancellable = true) - private static void gtceu$checkForBloomLayer(RenderType renderType, + @Inject(method = "fromTerrainRenderType", at = @At(value = "HEAD"), cancellable = true) + private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { + if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; + if (renderType == GTRenderTypes.bloom()) { - cir.setReturnValue(IrisHooks.BLOOM_RENDERING_PHASE); + cir.setReturnValue(GTIrisHooks.getBloomRenderingPhase()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java b/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java index cedb14be680..6c7cefd4db1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java +++ b/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java @@ -15,9 +15,14 @@ public class CapturedQuadData implements AutoCloseable { @Getter private BlockPos pos; + @Getter + private boolean isSet = false; + public CapturedQuadData with(RenderType renderType, BlockPos pos) { this.renderType = renderType; this.pos = pos; + + this.isSet = true; return this; } @@ -25,5 +30,7 @@ public CapturedQuadData with(RenderType renderType, BlockPos pos) { public void close() { this.renderType = null; this.pos = null; + + this.isSet = false; } } 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 b434f7ece7f..417d4637e61 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,10 +1,19 @@ package com.gregtechceu.gtceu.integration.embeddium; +import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.config.ConfigHolder; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; +import net.minecraft.client.Minecraft; +import net.minecraft.core.SectionPos; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { @@ -15,5 +24,24 @@ public class GTEmbeddiumCompat { public static final Material BLOOM_MATERIAL = new Material(BLOOM_RENDER_PASS, AlphaCutoffParameter.ONE_TENTH, false); - public static void init() {} + public static void init() { + MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); + } + + @SubscribeEvent + public static void registerSafeModeChunkMeshAppender(ChunkMeshEvent event) { + if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTShaders.canUseBloomShader()) return; + + event.addMeshAppender(context -> { + SectionPos sectionOrigin = context.sectionOrigin(); + if (!BloomSafeMode.BLOOM_BUFFER_BUILDERS.containsKey(sectionOrigin)) { + return; + } + + Vec3 camPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); + BloomSafeMode.CURRENT_RENDERING_SECTION.set(sectionOrigin); + BloomSafeMode.bakeBloomChunkBuffers(sectionOrigin, camPos); + }); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/iris/IrisHooks.java b/src/main/java/com/gregtechceu/gtceu/integration/iris/GTIrisHooks.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/integration/iris/IrisHooks.java rename to src/main/java/com/gregtechceu/gtceu/integration/iris/GTIrisHooks.java index 7e78c606962..5d2ae4f8891 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/iris/IrisHooks.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/iris/GTIrisHooks.java @@ -9,7 +9,7 @@ import java.util.Objects; @UtilityClass -public class IrisHooks { +public class GTIrisHooks { /// Do not access directly, use {@link #getBloomRenderingPhase()} @ApiStatus.Internal diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 949453286ec..99753a07320 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -37,11 +37,16 @@ "client.bloom.QuadLighterMixin", "client.bloom.RebuildTaskMixin", "client.bloom.RenderTypeMixin", - "client.bloom.VertexBufferAccessor", + "client.bloom.safemode.LevelRendererAccessor", + "client.bloom.safemode.LevelRendererMixin", + "client.bloom.safemode.ModelBlockRendererMixin", + "client.bloom.safemode.QuadLighterMixin", + "client.bloom.safemode.RebuildTaskMixin", "dev.client.KeyboardHandlerMixin", - "embeddium.BlockRendererMixin", - "embeddium.DefaultMaterialsMixin", - "embeddium.DefaultTerrainRenderPassesMixin", + "embeddium.bloom.BlockRendererMixin", + "embeddium.bloom.DefaultMaterialsMixin", + "embeddium.bloom.DefaultTerrainRenderPassesMixin", + "embeddium.bloom.safemode.BlockRendererMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", From 6fd56e4d2326ab6989a75e06742cb8a5eac16e36 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 19:52:10 +0300 Subject: [PATCH 191/269] Fix crash with trying to use config before it's loaded --- src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java | 5 +++++ .../gtceu/core/mixins/client/bloom/RenderTypeMixin.java | 2 +- .../gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 0a67dbd8a3f..52ec7f56d49 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -25,6 +25,11 @@ public static void init() { } } + public static ConfigHolder getInstance() { + init(); + return INSTANCE; + } + @Configurable public RecipeConfigs recipes = new RecipeConfigs(); @Configurable diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java index 969f474cae1..ec6efa9253f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java @@ -19,7 +19,7 @@ public class RenderTypeMixin { target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false)) private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return original; + if (ConfigHolder.getInstance().client.bloom.safeMode) return original; if (!GTShaders.canUseBloomShader()) return original; return ImmutableList.builder() diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java index 052e4d6e704..7c364464708 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java @@ -33,7 +33,7 @@ public class WorldRenderingPhaseMixin { } static { - if (!ConfigHolder.INSTANCE.client.bloom.safeMode && GTShaders.canUseBloomShader()) { + if (!ConfigHolder.getInstance().client.bloom.safeMode && GTShaders.canUseBloomShader()) { GTIrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("GTCEU:BLOOM", $VALUES.length); $VALUES = ArrayUtils.add($VALUES, GTIrisHooks.BLOOM_RENDERING_PHASE); } From d4099145cb2083eae17afab6e0422a81ca382858 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:07:58 +0300 Subject: [PATCH 192/269] Conditionally load bloom mixins based on `client.bloom.safeMode` config --- .../java/com/gregtechceu/gtceu/GTCEu.java | 4 +- .../gtceu/client/shader/GTShaders.java | 8 +- .../gtceu/core/mixins/GTMixinPlugin.java | 80 +++++++++++++++++-- .../ForgeModelBlockRendererMixin.java | 2 +- .../{ => normal}/ModelBlockRendererMixin.java | 2 +- .../bloom/{ => normal}/QuadLighterMixin.java | 2 +- .../bloom/{ => normal}/RebuildTaskMixin.java | 2 +- .../bloom/{ => normal}/RenderTypeMixin.java | 2 +- .../normal/embeddium}/BlockRendererMixin.java | 2 +- .../embeddium}/DefaultMaterialsMixin.java | 2 +- .../DefaultTerrainRenderPassesMixin.java | 2 +- .../oculus}/WorldRenderingPhaseMixin.java | 2 +- .../safemode/ModelBlockRendererMixin.java | 4 +- .../bloom/safemode/QuadLighterMixin.java | 4 +- .../bloom/safemode/RebuildTaskMixin.java | 4 +- .../embeddium}/BlockRendererMixin.java | 6 +- src/main/resources/gtceu.mixins.json | 20 ++--- 17 files changed, 108 insertions(+), 40 deletions(-) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{ => normal}/ForgeModelBlockRendererMixin.java (97%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{ => normal}/ModelBlockRendererMixin.java (98%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{ => normal}/QuadLighterMixin.java (97%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{ => normal}/RebuildTaskMixin.java (97%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{ => normal}/RenderTypeMixin.java (95%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{embeddium/bloom => client/bloom/normal/embeddium}/BlockRendererMixin.java (98%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{embeddium/bloom => client/bloom/normal/embeddium}/DefaultMaterialsMixin.java (94%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{embeddium/bloom => client/bloom/normal/embeddium}/DefaultTerrainRenderPassesMixin.java (97%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{iris => client/bloom/normal/oculus}/WorldRenderingPhaseMixin.java (96%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/{embeddium/bloom/safemode => client/bloom/safemode/embeddium}/BlockRendererMixin.java (95%) diff --git a/src/main/java/com/gregtechceu/gtceu/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index d793625ce77..b834dccf3b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -108,7 +108,9 @@ public static MinecraftServer getMinecraftServer() { * @return if the mod whose id is {@code modId} is loaded or not */ public static boolean isModLoaded(String modId) { - return ModList.get().isLoaded(modId); + ModList modList = ModList.get(); + if (modList != null) return modList.isLoaded(modId); + else return FMLLoader.getLoadingModList().getModFileById(modId) != null; } /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index bc88c9c2b1b..45af9fc84e3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.client.shader; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; import com.gregtechceu.gtceu.core.mixins.client.bloom.GameRendererAccessor; import net.irisshaders.iris.api.v0.IrisApi; @@ -110,11 +110,11 @@ public static boolean canUseBloomShader() { return BLOOM_CHAIN != null && BLOOM_TARGET != null && canLoadBloomShader(); } - private static boolean canLoadBloomShader() { + public static boolean canLoadBloomShader() { return ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && bloomShaderAvailable; } - private static boolean bloomShaderAvailable; + private static boolean bloomShaderAvailable = updateBloomShaderAvailability(); @ApiStatus.Internal public static void updateShaderAvailability(TickEvent.ClientTickEvent event) { @@ -128,7 +128,7 @@ public static void updateShaderAvailability(TickEvent.ClientTickEvent event) { } private static boolean updateBloomShaderAvailability() { - return !GTCEu.isModLoaded(GTValues.MODID_OPTIFINE) && + return !GTMixinPlugin.OPTIFINE_PRESENT && !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 0e3899e997f..175e6090cc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -1,9 +1,12 @@ package com.gregtechceu.gtceu.core.mixins; -import net.minecraftforge.fml.ModList; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.fml.loading.LoadingModList; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -15,6 +18,8 @@ public class GTMixinPlugin implements IMixinConfigPlugin { + public static final Logger LOGGER = LogManager.getLogger("GregTechCEu"); + @Override public void onLoad(String mixinPackage) {} @@ -29,13 +34,20 @@ public String getRefMapperConfig() { private static final String DEV_PACKAGE = "dev."; private static final String DATAGEN_PACKAGE = "datagen."; + private static final String CLIENT_PACKAGE = "client."; + private static final String BLOOM_PACKAGE = "bloom.", + BLOOM_NORMAL_PACKAGE = "normal.", + BLOOM_SAFEMODE_PACKAGE = "safemode."; + static { MOD_COMPAT_MIXINS.put("roughlyenoughitems", "rei."); addModCompatMixin("emi"); addModCompatMixin("jei"); addModCompatMixin("top"); addModCompatMixin("embeddium"); - // MOD_COMPAT_MIXINS.put("sodium", MIXIN_PACKAGE + "embeddium"); + // MOD_COMPAT_MIXINS.put("sodium", "embeddium."); + addModCompatMixin("oculus"); + // MOD_COMPAT_MIXINS.put("iris", "oculus."); addModCompatMixin("ftbchunks"); addModCompatMixin("xaerominimap"); addModCompatMixin("xaeroworldmap"); @@ -43,7 +55,7 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (!LoadingModList.get().getErrors().isEmpty()) { + if (!FMLLoader.getLoadingModList().getErrors().isEmpty()) { return false; } @@ -66,6 +78,26 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { } return true; } + if (mixinClassName.startsWith(CLIENT_PACKAGE)) { + mixinClassName = mixinClassName.substring(CLIENT_PACKAGE.length()); + + if (FMLLoader.getDist() != Dist.CLIENT) { + // make extra sure client mixins are only loaded on clients + return false; + } + + if (mixinClassName.startsWith(BLOOM_PACKAGE)) { + mixinClassName = mixinClassName.substring(BLOOM_PACKAGE.length()); + + String[] mutable = temp; + mutable[0] = mixinClassName; + + if (!filterBloomMixins(mutable)) return false; + + mixinClassName = mutable[0]; + } + } + for (var compatMod : MOD_COMPAT_MIXINS.entrySet()) { if (mixinClassName.startsWith(compatMod.getValue())) { return isModLoaded(compatMod.getKey()); @@ -74,6 +106,25 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { return true; } + /// ensure only the appropriate set of bloom-related mixins are loaded + private static boolean filterBloomMixins(String[] mixinClassName) { + boolean safeModeConfigEnabled = ConfigHolder.getInstance().client.bloom.safeMode; + + if (mixinClassName[0].startsWith(BLOOM_NORMAL_PACKAGE)) { + if (safeModeConfigEnabled) return false; + + // trim off the load type package so mod loaded checks also function + mixinClassName[0] = mixinClassName[0].substring(BLOOM_NORMAL_PACKAGE.length()); + } else if (mixinClassName[0].startsWith(BLOOM_SAFEMODE_PACKAGE)) { + if (!safeModeConfigEnabled) return false; + + // trim off the load type package so mod loaded checks also function + mixinClassName[0] = mixinClassName[0].substring(BLOOM_SAFEMODE_PACKAGE.length()); + } + + return true; + } + @Override public void acceptTargets(Set myTargets, Set otherTargets) {} @@ -93,9 +144,24 @@ private static void addModCompatMixin(String modId) { } private static boolean isModLoaded(String modId) { - if (ModList.get() == null) { - return LoadingModList.get().getModFileById(modId) != null; + if (modId.equals("optifine")) { + return OPTIFINE_PRESENT; + } else { + return FMLLoader.getLoadingModList().getModFileById(modId) != null; } - return ModList.get().isLoaded(modId); } + + public static final boolean OPTIFINE_PRESENT; + + static { + boolean hasOfClass = false; + try { + Class.forName("optifine.OptiFineTransformationService"); + hasOfClass = true; + } catch (Throwable ignored) {} + + OPTIFINE_PRESENT = hasOfClass; + } + + private static final String[] temp = new String[1]; } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java index 2bd7497e6bb..fb63f7c25ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; 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/normal/ModelBlockRendererMixin.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index 8c13dc2f23b..2d928f6e404 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/normal/ModelBlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 1c44b576e3a..46666255547 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java index cc6df755a78..15a5c2f571b 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.bloom.BloomUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index ec6efa9253f..8415caff031 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/BlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java index c6c32b5b2f6..0f8cb967d95 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/BlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultMaterialsMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java similarity index 94% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultMaterialsMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java index 4f594b718f6..ce37a4aaa4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultMaterialsMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultMaterialsMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultTerrainRenderPassesMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultTerrainRenderPassesMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java index a566da1cccd..d7efb6cadd9 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/DefaultTerrainRenderPassesMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/DefaultTerrainRenderPassesMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium.bloom; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index 7c364464708..d12d4f4ef35 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/iris/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.iris; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.oculus; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java index 04d18a4185c..889f716d846 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java @@ -11,9 +11,9 @@ import org.spongepowered.asm.mixin.injection.At; /** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.ModelBlockRendererMixin} + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.ModelBlockRendererMixin} * - * @see com.gregtechceu.gtceu.core.mixins.client.bloom.ModelBlockRendererMixin + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.ModelBlockRendererMixin */ @Mixin(ModelBlockRenderer.class) public class ModelBlockRendererMixin { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java index 278877a5b86..cecc27ffe8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java @@ -12,9 +12,9 @@ import org.spongepowered.asm.mixin.injection.At; /** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.QuadLighterMixin} + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.QuadLighterMixin} * - * @see com.gregtechceu.gtceu.core.mixins.client.bloom.QuadLighterMixin + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.QuadLighterMixin */ @Mixin(value = QuadLighter.class, remap = false) public class QuadLighterMixin { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java index 7a4af3fa244..5a9f8926663 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java @@ -16,9 +16,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; /** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.RebuildTaskMixin} + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.RebuildTaskMixin} * - * @see com.gregtechceu.gtceu.core.mixins.client.bloom.RebuildTaskMixin + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.RebuildTaskMixin */ @Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") public class RebuildTaskMixin { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/safemode/BlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/safemode/BlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java index c4f4600eb21..ea755ddd276 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/embeddium/bloom/safemode/BlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/embeddium/BlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.embeddium.bloom.safemode; +package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode.embeddium; import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; import com.gregtechceu.gtceu.client.shader.GTShaders; @@ -29,9 +29,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; /** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.embeddium.bloom.BlockRendererMixin} + * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium.BlockRendererMixin} * - * @see com.gregtechceu.gtceu.core.mixins.embeddium.bloom.BlockRendererMixin + * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium.BlockRendererMixin */ @Mixin(value = BlockRenderer.class, remap = false) public class BlockRendererMixin { diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 99753a07320..ff06f4e035b 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -28,29 +28,29 @@ "client.TextureAtlasMixin", "client.VariantDeserializerMixin", "client.VertexConsumerMixin", - "client.bloom.ForgeModelBlockRendererMixin", "client.bloom.GameRendererAccessor", "client.bloom.LevelRendererMixin", - "client.bloom.ModelBlockRendererMixin", "client.bloom.PostChainAccessor", "client.bloom.PostChainMixin", - "client.bloom.QuadLighterMixin", - "client.bloom.RebuildTaskMixin", - "client.bloom.RenderTypeMixin", + "client.bloom.normal.ForgeModelBlockRendererMixin", + "client.bloom.normal.ModelBlockRendererMixin", + "client.bloom.normal.QuadLighterMixin", + "client.bloom.normal.RebuildTaskMixin", + "client.bloom.normal.RenderTypeMixin", + "client.bloom.normal.embeddium.BlockRendererMixin", + "client.bloom.normal.embeddium.DefaultMaterialsMixin", + "client.bloom.normal.embeddium.DefaultTerrainRenderPassesMixin", + "client.bloom.normal.oculus.WorldRenderingPhaseMixin", "client.bloom.safemode.LevelRendererAccessor", "client.bloom.safemode.LevelRendererMixin", "client.bloom.safemode.ModelBlockRendererMixin", "client.bloom.safemode.QuadLighterMixin", "client.bloom.safemode.RebuildTaskMixin", + "client.bloom.safemode.embeddium.BlockRendererMixin", "dev.client.KeyboardHandlerMixin", - "embeddium.bloom.BlockRendererMixin", - "embeddium.bloom.DefaultMaterialsMixin", - "embeddium.bloom.DefaultTerrainRenderPassesMixin", - "embeddium.bloom.safemode.BlockRendererMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", - "iris.WorldRenderingPhaseMixin", "ldlib.ModularWrapperWidgetMixin", "rei.FluidEntryRendererMixin", "xaerominimap.HighlighterRegistryMixin", From efd78a378d2524121544510823b1999cda0126c9 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:29:58 +0300 Subject: [PATCH 193/269] Remove all the safeMode checks in mixins ...except the one in DefaultTerrainRenderPassesMixin, that one gets to go separately. --- .../gtceu/client/bloom/BloomSafeMode.java | 13 ++----- .../normal/ForgeModelBlockRendererMixin.java | 5 --- .../bloom/normal/ModelBlockRendererMixin.java | 2 - .../client/bloom/normal/QuadLighterMixin.java | 2 - .../client/bloom/normal/RebuildTaskMixin.java | 12 +++--- .../client/bloom/normal/RenderTypeMixin.java | 4 +- .../normal/embeddium/BlockRendererMixin.java | 6 +-- .../embeddium/DefaultMaterialsMixin.java | 3 -- .../oculus/WorldRenderingPhaseMixin.java | 4 +- .../bloom/safemode/LevelRendererMixin.java | 3 -- .../safemode/ModelBlockRendererMixin.java | 6 ++- .../bloom/safemode/QuadLighterMixin.java | 6 ++- .../bloom/safemode/RebuildTaskMixin.java | 39 ------------------- .../embeddium/BlockRendererMixin.java | 32 +++++++-------- src/main/resources/gtceu.mixins.json | 1 - 15 files changed, 33 insertions(+), 105 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java index 337e68af089..a92453082b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java @@ -89,13 +89,8 @@ public static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum fr levelRenderer.getTicks(), camera, frustum); } - public static void copyToBloomBuffer(VertexConsumer originalVertexConsumer, BakedQuad quad, int[] combinedLights, - Consumer draw) { - draw.accept(originalVertexConsumer); - - if (!ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.canUseBloomShader()) { - return; - } + public static void copyToBloomBuffer(BakedQuad quad, int[] combinedLights, Consumer draw) { + if (!GTShaders.canUseBloomShader()) return; SectionPos sectionOrigin = CURRENT_RENDERING_SECTION.get(); if (sectionOrigin != null && TextureMetadataHelper.hasBloom(quad, combinedLights)) { @@ -147,9 +142,7 @@ public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { } public static void bakeBloomChunkBuffers(SectionPos sectionPos, Vec3 camPos) { - if (!ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.canUseBloomShader()) { - return; - } + if (!GTShaders.canUseBloomShader()) return; BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(sectionPos); if (builder == null || !builder.building()) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java index fb63f7c25ee..5c575a01cca 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.IGTQuadLighter; import net.minecraft.client.renderer.RenderType; @@ -35,9 +33,6 @@ public class ForgeModelBlockRendererMixin { ModelData modelData, RenderType renderType, CallbackInfoReturnable cir, @Local(name = "flatLighter") QuadLighter flatLighter) { - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; - if (!GTShaders.canUseBloomShader()) return; - if (flatLighter != null) { // this is always in the flatLighter init block ((IGTQuadLighter) flatLighter).gtceu$setRenderType(renderType); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index 2d928f6e404..67d8f09bad5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.util.CapturedQuadData; import net.minecraft.client.renderer.RenderType; @@ -52,7 +51,6 @@ public class ModelBlockRendererMixin { private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return true; if (!GTShaders.canUseBloomShader()) return true; CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 46666255547..548fb252544 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.IGTQuadLighter; import net.minecraft.client.renderer.RenderType; @@ -36,7 +35,6 @@ public class QuadLighterMixin implements IGTQuadLighter { float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return true; if (!GTShaders.canUseBloomShader()) return true; BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java index 15a5c2f571b..ede9873bda5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java @@ -1,9 +1,8 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.bloom.BloomUtil; - import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; + import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; @@ -31,11 +30,10 @@ public abstract class RebuildTaskMixin { @SuppressWarnings("NameDoesntMatchTargetClass") @Inject(method = "compile", at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", remap = false)) - private void gtceu$tryAddBlockEntity(float x, float y, float z, ChunkBufferBuilderPack chunkBufferBuilders, - CallbackInfoReturnable cir, - @Local(ordinal = 0) BlockPos sectionOrigin, - @Local Set usedRenderTypes) { - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; + private void gtceu$drawCachedBlockBloom(float x, float y, float z, ChunkBufferBuilderPack chunkBufferBuilders, + CallbackInfoReturnable cir, + @Local(ordinal = 0) BlockPos sectionOrigin, + @Local Set usedRenderTypes) { if (!GTShaders.canUseBloomShader()) return; long sectionPos = SectionPos.asLong(sectionOrigin); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index 8415caff031..c1308c06a53 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -1,9 +1,8 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; - import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; + import net.minecraft.client.renderer.RenderType; import com.google.common.collect.ImmutableList; @@ -19,7 +18,6 @@ public class RenderTypeMixin { target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false)) private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { - if (ConfigHolder.getInstance().client.bloom.safeMode) return original; if (!GTShaders.canUseBloomShader()) return original; return ImmutableList.builder() 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 0f8cb967d95..a40258a23ae 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 @@ -37,7 +37,6 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; if (!GTShaders.canUseBloomShader()) return; ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); @@ -47,6 +46,8 @@ public class BlockRendererMixin { // call the same method again, this time with the bloom chunk model builder original.call(instance, ctx, bloomBuilder, offset, material, quad, vertexColors, lightData); + } else { + bloomBuilderRef.set(null); } } @@ -58,9 +59,6 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(originalBuilder, sprite); - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; - if (!GTShaders.canUseBloomShader()) return; - // 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(); 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 ce37a4aaa4c..c3f12b3c000 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; @@ -20,8 +19,6 @@ public class DefaultMaterialsMixin { @Inject(method = "forRenderLayer", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - // TODO add a way to conditionally load mixins based on configs - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; if (!GTShaders.canUseBloomShader()) return; if (renderType == GTRenderTypes.bloom()) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index d12d4f4ef35..dc1815e66ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.iris.GTIrisHooks; import net.irisshaders.iris.pipeline.WorldRenderingPhase; @@ -33,7 +32,7 @@ public class WorldRenderingPhaseMixin { } static { - if (!ConfigHolder.getInstance().client.bloom.safeMode && GTShaders.canUseBloomShader()) { + if (GTShaders.canUseBloomShader()) { GTIrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("GTCEU:BLOOM", $VALUES.length); $VALUES = ArrayUtils.add($VALUES, GTIrisHooks.BLOOM_RENDERING_PHASE); } @@ -42,7 +41,6 @@ public class WorldRenderingPhaseMixin { @Inject(method = "fromTerrainRenderType", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return; if (!GTShaders.canUseBloomShader()) return; if (renderType == GTRenderTypes.bloom()) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java index 841062fffc7..e1d42b19dc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java @@ -21,9 +21,6 @@ public class LevelRendererMixin { target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, @Local SectionPos sectionPos) { - if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; - if (!GTShaders.canUseBloomShader()) return; - BloomSafeMode.CURRENT_RENDERING_SECTION.set(sectionPos); BloomSafeMode.bakeBloomChunkBuffers(sectionPos, camera.getPosition()); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java index 889f716d846..01faafec4a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java @@ -25,8 +25,10 @@ public class ModelBlockRendererMixin { float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { - BloomSafeMode.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { - original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); + original.call(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); + BloomSafeMode.copyToBloomBuffer(quad, combinedLights, vertexConsumer -> { + original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, combinedLights, + combinedOverlay, mulColor); }); } } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java index cecc27ffe8e..de2aa0184a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java @@ -27,8 +27,10 @@ public class QuadLighterMixin { float[] colorMuls, float red, float green, float blue, int[] combinedLights, int combinedOverlay, boolean mulColor, Operation original) { - BloomSafeMode.copyToBloomBuffer(consumer, quad, combinedLights, vertexConsumer -> { - original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, colorMuls, colorMuls, mulColor); + original.call(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); + BloomSafeMode.copyToBloomBuffer(quad, combinedLights, vertexConsumer -> { + original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, combinedLights, + combinedOverlay, mulColor); }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java deleted file mode 100644 index 5a9f8926663..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/RebuildTaskMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; - -import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; - -import com.gregtechceu.gtceu.config.ConfigHolder; -import net.minecraft.client.renderer.ChunkBufferBuilderPack; -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; -import net.minecraft.core.BlockPos; - -import net.minecraft.core.SectionPos; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -/** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.RebuildTaskMixin} - * - * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.RebuildTaskMixin - */ -@Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") -public class RebuildTaskMixin { - - @Shadow(aliases = { "this$1", "f_290687_", "f" }) - @Final - ChunkRenderDispatcher.RenderChunk this$1; - - @Inject(method = "compile", at = @At(value = "HEAD")) - private void gtceu$startBloomBufferForChunk(float x, float y, float z, - ChunkBufferBuilderPack chunkBufferBuilderPack, - CallbackInfoReturnable cir) { - if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; - - BlockPos pos = this.this$1.getOrigin(); - BloomSafeMode.CURRENT_RENDERING_SECTION.set(SectionPos.of(pos)); - } -} 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 ea755ddd276..1f4dc09d633 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 @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; @@ -41,17 +40,15 @@ public class BlockRendererMixin { Vec3 offset, Material material, BakedQuadView quad, int[] colors, QuadLightData light, CallbackInfo ci, - @Share("bufferBuilder") LocalRef bufferBuilder) { - // TODO add a way to conditionally load mixins based on configs - // so this doesn't need to be injected at all if the config isn't enabled - if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; + @Share("bufferBuilder") LocalRef bufferBuilderRef) { // Check if quad is full brightness OR we have bloom enabled for the quad if (!GTShaders.canUseBloomShader() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { + bufferBuilderRef.set(null); return; } SectionPos sectionPos = SectionPos.of(ctx.pos()); - bufferBuilder.set(BloomSafeMode.getOrStartBloomBuffer(sectionPos)); + bufferBuilderRef.set(BloomSafeMode.getOrStartBloomBuffer(sectionPos)); } @Inject(method = "writeGeometry", @@ -59,23 +56,20 @@ public class BlockRendererMixin { target = "Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;light:I", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER)) - private void gtceu$captureBloomQuads2(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, - Material material, BakedQuadView quad, int[] colors, QuadLightData light, - CallbackInfo ci, - @Local(name = "srcIndex") int srcIndex, - @Local(name = "out") ChunkVertexEncoder.Vertex v, - @Share("bufferBuilder") LocalRef bufferBuilder) { - // TODO add a way to conditionally load mixins based on configs - if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; - // Check if quad is full brightness OR we have bloom enabled for the quad - if (!GTShaders.canUseBloomShader() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { - return; - } + private void gtceu$captureBloomQuads(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, + Material material, BakedQuadView quad, int[] colors, QuadLightData light, + CallbackInfo ci, + @Local(name = "srcIndex") int srcIndex, + @Local(name = "out") ChunkVertexEncoder.Vertex v, + @Share("bufferBuilder") LocalRef bufferBuilderRef) { + BufferBuilder bufferBuilder = bufferBuilderRef.get(); + // bufferBuilder is null if bloom isn't available or the quad's texture doesn't have bloom + if (bufferBuilder == null) return; int normal = quad.getForgeNormal(srcIndex); if (normal == 0) normal = quad.getComputedFaceNormal(); - bufferBuilder.get().vertex(v.x, v.y, v.z) + bufferBuilder.vertex(v.x, v.y, v.z) .color(ColorARGB.toABGR(v.color)) .uv(v.u, v.v) .uv2(v.light) diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index ff06f4e035b..14656a475ee 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -45,7 +45,6 @@ "client.bloom.safemode.LevelRendererMixin", "client.bloom.safemode.ModelBlockRendererMixin", "client.bloom.safemode.QuadLighterMixin", - "client.bloom.safemode.RebuildTaskMixin", "client.bloom.safemode.embeddium.BlockRendererMixin", "dev.client.KeyboardHandlerMixin", "ftbchunks.FTBChunksClientMixin", From e6f9be25d1adc9f69bf147ef915f0a1ddb453a4c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:30:50 +0300 Subject: [PATCH 194/269] I _think_ this should work the same? (DefaultTerrainRenderPassesMixin) --- .../DefaultTerrainRenderPassesMixin.java | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) 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 d7efb6cadd9..49caca88283 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 @@ -2,20 +2,18 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; import com.google.common.collect.ImmutableMap; -import com.llamalad7.mixinextras.expression.Definition; -import com.llamalad7.mixinextras.expression.Expression; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import org.apache.commons.lang3.ArrayUtils; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; import java.util.List; import java.util.Map; @@ -23,32 +21,24 @@ @Mixin(value = DefaultTerrainRenderPasses.class, remap = false) public class DefaultTerrainRenderPassesMixin { - // spotless:off - - @Definition(id = "ALL", field = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;ALL:[Lme/jellysquid/mods/sodium/client/render/chunk/terrain/TerrainRenderPass;") - @Expression("ALL = @(?)") // technically quite brittle. I don't think it matters much here, though. - @ModifyExpressionValue(method = "", at = @At("MIXINEXTRAS:EXPRESSION")) - private static TerrainRenderPass[] gtceu$forceAddBloomToTerrainRenderPasses$1(TerrainRenderPass[] original) { - // TODO add a way to conditionally load mixins based on configs - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return original; - if (!GTShaders.canUseBloomShader()) return original; - - return ArrayUtils.add(original, GTEmbeddiumCompat.BLOOM_RENDER_PASS); + @Shadow + @Final + @Mutable + public static TerrainRenderPass[] ALL; + + @Shadow + @Final + @Mutable + public static Map> RENDER_PASS_MAPPINGS; + + static { + if (GTShaders.canUseBloomShader()) { + ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.BLOOM_RENDER_PASS); + + RENDER_PASS_MAPPINGS = ImmutableMap.>builder() + .putAll(RENDER_PASS_MAPPINGS) + .put(GTRenderTypes.bloom(), List.of(GTEmbeddiumCompat.BLOOM_RENDER_PASS)) + .build(); + } } - - @Definition(id = "RENDER_PASS_MAPPINGS", field = "Lme/jellysquid/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses;RENDER_PASS_MAPPINGS:Ljava/util/Map;") - @Expression("RENDER_PASS_MAPPINGS = @(?)") // technically quite brittle. I don't think it matters much here, though. - @ModifyExpressionValue(method = "", at = @At("MIXINEXTRAS:EXPRESSION")) - private static Map> gtceu$forceAddBloomToTerrainRenderPasses$2(Map> original) { - // TODO add a way to conditionally load mixins based on configs - if (ConfigHolder.INSTANCE.client.bloom.safeMode) return original; - if (!GTShaders.canUseBloomShader()) return original; - - return ImmutableMap.>builder() - .putAll(original) - .put(GTRenderTypes.bloom(), List.of(GTEmbeddiumCompat.BLOOM_RENDER_PASS)) - .build(); - } - - // spotless:on } From 52c6cc1024f7c54719aaabadc34165a6643dda8b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:31:35 +0300 Subject: [PATCH 195/269] In injections/hooks that happen before resource loading, check if bloom *can be loaded* instead of if bloom *is loaded* --- .../client/bloom/BloomEventListeners.java | 2 +- .../gtceu/client/shader/GTShaders.java | 19 ++++++++----------- .../client/bloom/normal/RenderTypeMixin.java | 2 +- .../embeddium/DefaultMaterialsMixin.java | 2 +- .../DefaultTerrainRenderPassesMixin.java | 2 +- .../oculus/WorldRenderingPhaseMixin.java | 4 ++-- 6 files changed, 14 insertions(+), 17 deletions(-) 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 06927f5e1aa..9d68c5c75b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -88,7 +88,7 @@ public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent e @SubscribeEvent public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { RenderType block, entity; - if (ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.canUseBloomShader()) { + if (ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.isBloomShaderAvailable()) { // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' block = RenderType.cutout(); entity = ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 45af9fc84e3..4f150a3b8d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -38,16 +38,10 @@ public class GTShaders { @ApiStatus.Internal public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { - // forcefully update availability on reload - bloomShaderAvailable = updateBloomShaderAvailability(); - if (!canLoadBloomShader()) { - return; - } event.registerShader(new ShaderInstance(event.getResourceProvider(), GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), shader -> rendertypeBloomShader = shader); - event.registerShader(new ShaderInstance(event.getResourceProvider(), GTCEu.id("rendertype_entity_bloom"), DefaultVertexFormat.NEW_ENTITY), shader -> rendertypeEntityBloomShader = shader); @@ -58,6 +52,11 @@ public static void onRegisterShaders(RegisterShadersEvent event) throws IOExcept private static void initPostShaders() { deinitPostShaders(); + // forcefully update availability on (re-)load + bloomShaderAvailable = updateBloomShaderAvailability(); + + if (!isBloomShaderAvailable()) return; + ResourceLocation id = null; switch (ConfigHolder.INSTANCE.client.bloom.bloomType) { @@ -107,13 +106,11 @@ public static void deinitPostShaders() { } public static boolean canUseBloomShader() { - return BLOOM_CHAIN != null && BLOOM_TARGET != null && canLoadBloomShader(); - } - - public static boolean canLoadBloomShader() { - return ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && bloomShaderAvailable; + return BLOOM_CHAIN != null && BLOOM_TARGET != null && + ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && isBloomShaderAvailable(); } + @Getter private static boolean bloomShaderAvailable = updateBloomShaderAvailability(); @ApiStatus.Internal diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index c1308c06a53..3dfba9b1ab4 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -18,7 +18,7 @@ public class RenderTypeMixin { target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false)) private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { - if (!GTShaders.canUseBloomShader()) return original; + if (!GTShaders.isBloomShaderAvailable()) return original; return ImmutableList.builder() .addAll(original).add(GTRenderTypes.bloom()) 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 c3f12b3c000..e5f5ee19442 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 @@ -19,7 +19,7 @@ public class DefaultMaterialsMixin { @Inject(method = "forRenderLayer", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderAvailable()) return; if (renderType == GTRenderTypes.bloom()) { cir.setReturnValue(GTEmbeddiumCompat.BLOOM_MATERIAL); 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 49caca88283..4295186b086 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 @@ -32,7 +32,7 @@ public class DefaultTerrainRenderPassesMixin { public static Map> RENDER_PASS_MAPPINGS; static { - if (GTShaders.canUseBloomShader()) { + if (GTShaders.isBloomShaderAvailable()) { ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.BLOOM_RENDER_PASS); RENDER_PASS_MAPPINGS = ImmutableMap.>builder() diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index dc1815e66ab..21f93b0a6d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -32,7 +32,7 @@ public class WorldRenderingPhaseMixin { } static { - if (GTShaders.canUseBloomShader()) { + if (GTShaders.isBloomShaderAvailable()) { GTIrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("GTCEU:BLOOM", $VALUES.length); $VALUES = ArrayUtils.add($VALUES, GTIrisHooks.BLOOM_RENDERING_PHASE); } @@ -41,7 +41,7 @@ public class WorldRenderingPhaseMixin { @Inject(method = "fromTerrainRenderType", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderAvailable()) return; if (renderType == GTRenderTypes.bloom()) { cir.setReturnValue(GTIrisHooks.getBloomRenderingPhase()); From 77dd818b5b6a718282d2d88e2438a4270ac637fc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:33:13 +0300 Subject: [PATCH 196/269] Rename `GTShaders.canUseBloomShader` to `.isBloomShaderInUse` --- .../gtceu/client/bloom/BloomEventListeners.java | 17 +++++------------ .../gtceu/client/bloom/BloomSafeMode.java | 6 +++--- .../gtceu/client/bloom/BloomUtil.java | 4 ++-- .../gtceu/client/renderer/GTRenderTypes.java | 4 ++-- .../gtceu/client/shader/GTShaders.java | 2 +- .../bloom/normal/ModelBlockRendererMixin.java | 2 +- .../client/bloom/normal/QuadLighterMixin.java | 2 +- .../client/bloom/normal/RebuildTaskMixin.java | 2 +- .../normal/embeddium/BlockRendererMixin.java | 3 +-- .../safemode/embeddium/BlockRendererMixin.java | 2 +- .../embeddium/GTEmbeddiumCompat.java | 2 +- 11 files changed, 19 insertions(+), 27 deletions(-) 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 9d68c5c75b5..5e6894885c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -31,12 +31,8 @@ public class BloomEventListeners { @SubscribeEvent public static void onRenderTick(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START || Minecraft.getInstance().level == null) { - return; - } - if (!GTShaders.canUseBloomShader()) { - return; - } + if (event.phase != TickEvent.Phase.START || Minecraft.getInstance().level == null) return; + if (!GTShaders.isBloomShaderInUse()) return; GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); @@ -54,14 +50,11 @@ public static void onLevelUnload(LevelEvent.Unload event) { @SubscribeEvent public static void onChunkUnload(ChunkEvent.Unload event) { - if (!GTShaders.canUseBloomShader()) { - return; - } + if (!GTShaders.isBloomShaderInUse()) return; + ChunkAccess chunk = event.getChunk(); LevelAccessor level = chunk.getWorldForge(); - if (level == null) { - return; - } + if (level == null) return; ChunkPos chunkPos = chunk.getPos(); int minSection = level.getMinSection(), maxSection = level.getMaxSection(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java index a92453082b8..8f6e302890a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; -import com.gregtechceu.gtceu.config.ConfigHolder; + import com.mojang.blaze3d.pipeline.RenderCall; import com.mojang.blaze3d.shaders.Uniform; import com.mojang.blaze3d.systems.RenderSystem; @@ -90,7 +90,7 @@ public static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum fr } public static void copyToBloomBuffer(BakedQuad quad, int[] combinedLights, Consumer draw) { - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderInUse()) return; SectionPos sectionOrigin = CURRENT_RENDERING_SECTION.get(); if (sectionOrigin != null && TextureMetadataHelper.hasBloom(quad, combinedLights)) { @@ -142,7 +142,7 @@ public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { } public static void bakeBloomChunkBuffers(SectionPos sectionPos, Vec3 camPos) { - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderInUse()) return; BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(sectionPos); if (builder == null || !builder.building()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index c0bd2eb757b..621a887c72f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -161,7 +161,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier<@Nullable Level> worldContext) { - if (!GTShaders.canUseBloomShader()) return BloomRenderTicket.INVALID; + if (!GTShaders.isBloomShaderInUse()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.writeLock().lock(); @@ -176,7 +176,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @ApiStatus.Internal public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, float partialTicks, LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderInUse()) return; Vec3 camPos = camera.getPosition(); 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 9c898333058..b4ea02702fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -22,12 +22,12 @@ public class GTRenderTypes extends RenderType { public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard( "bloom_target", () -> { - if (GTShaders.canUseBloomShader()) { + if (GTShaders.isBloomShaderInUse()) { GTShaders.BLOOM_TARGET.bindWrite(false); } }, () -> { - if (GTShaders.canUseBloomShader()) { + if (GTShaders.isBloomShaderInUse()) { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }); diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java index 4f150a3b8d0..d342830a000 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java @@ -105,7 +105,7 @@ public static void deinitPostShaders() { } } - public static boolean canUseBloomShader() { + public static boolean isBloomShaderInUse() { return BLOOM_CHAIN != null && BLOOM_TARGET != null && ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && isBloomShaderAvailable(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index 67d8f09bad5..ac82ffad483 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java @@ -51,7 +51,7 @@ public class ModelBlockRendererMixin { private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!GTShaders.canUseBloomShader()) return true; + if (!GTShaders.isBloomShaderInUse()) return true; CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); if (!currentData.isSet()) return true; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 548fb252544..94c646a4973 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -35,7 +35,7 @@ public class QuadLighterMixin implements IGTQuadLighter { float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!GTShaders.canUseBloomShader()) return true; + if (!GTShaders.isBloomShaderInUse()) return true; BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), packedLights, packedOverlay, brightness, red, green, blue); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java index ede9873bda5..0e0a7c9123f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java @@ -34,7 +34,7 @@ public abstract class RebuildTaskMixin { CallbackInfoReturnable cir, @Local(ordinal = 0) BlockPos sectionOrigin, @Local Set usedRenderTypes) { - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderInUse()) return; long sectionPos = SectionPos.asLong(sectionOrigin); if (!BloomUtil.chunkSectionHasBloomQuads(sectionPos)) return; 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 a40258a23ae..2332a008d20 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 @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -37,7 +36,7 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderInUse()) return; ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); if (chunkContext != null && TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { 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 1f4dc09d633..5495b15bf62 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 @@ -42,7 +42,7 @@ public class BlockRendererMixin { CallbackInfo ci, @Share("bufferBuilder") LocalRef bufferBuilderRef) { // Check if quad is full brightness OR we have bloom enabled for the quad - if (!GTShaders.canUseBloomShader() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { + if (!GTShaders.isBloomShaderInUse() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { bufferBuilderRef.set(null); return; } 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 417d4637e61..939f9db1ab9 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -31,7 +31,7 @@ public static void init() { @SubscribeEvent public static void registerSafeModeChunkMeshAppender(ChunkMeshEvent event) { if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; - if (!GTShaders.canUseBloomShader()) return; + if (!GTShaders.isBloomShaderInUse()) return; event.addMeshAppender(context -> { SectionPos sectionOrigin = context.sectionOrigin(); From af6cd2a671909f09082931f07119a4aa2bd0bf40 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 20:36:03 +0300 Subject: [PATCH 197/269] Rename `GTShaders` to `BloomShaderManager` & move it to the bloom subpackage because it only does bloom anyway --- .../gtceu/client/bloom/BloomEventListeners.java | 13 ++++++------- .../gtceu/client/bloom/BloomSafeMode.java | 5 ++--- .../BloomShaderManager.java} | 10 +++++----- .../gregtechceu/gtceu/client/bloom/BloomUtil.java | 9 ++++----- .../gtceu/client/renderer/GTRenderTypes.java | 12 ++++++------ .../mixins/client/bloom/LevelRendererMixin.java | 8 ++++---- .../bloom/normal/ModelBlockRendererMixin.java | 4 ++-- .../client/bloom/normal/QuadLighterMixin.java | 4 ++-- .../client/bloom/normal/RebuildTaskMixin.java | 4 ++-- .../mixins/client/bloom/normal/RenderTypeMixin.java | 4 ++-- .../bloom/normal/embeddium/BlockRendererMixin.java | 4 ++-- .../normal/embeddium/DefaultMaterialsMixin.java | 4 ++-- .../embeddium/DefaultTerrainRenderPassesMixin.java | 4 ++-- .../normal/oculus/WorldRenderingPhaseMixin.java | 6 +++--- .../client/bloom/safemode/LevelRendererMixin.java | 3 +-- .../safemode/embeddium/BlockRendererMixin.java | 4 ++-- .../integration/embeddium/GTEmbeddiumCompat.java | 4 ++-- 17 files changed, 49 insertions(+), 53 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/{shader/GTShaders.java => bloom/BloomShaderManager.java} (94%) 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 5e6894885c6..16d25a1726e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.client.Minecraft; @@ -32,15 +31,15 @@ public class BloomEventListeners { @SubscribeEvent public static void onRenderTick(TickEvent.RenderTickEvent event) { if (event.phase != TickEvent.Phase.START || Minecraft.getInstance().level == null) return; - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; - GTShaders.BLOOM_TARGET.clear(Minecraft.ON_OSX); + BloomShaderManager.BLOOM_TARGET.clear(Minecraft.ON_OSX); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } @SubscribeEvent public static void onClientTick(TickEvent.ClientTickEvent event) { - GTShaders.updateShaderAvailability(event); + BloomShaderManager.updateShaderAvailability(event); } @SubscribeEvent @@ -50,7 +49,7 @@ public static void onLevelUnload(LevelEvent.Unload event) { @SubscribeEvent public static void onChunkUnload(ChunkEvent.Unload event) { - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; ChunkAccess chunk = event.getChunk(); LevelAccessor level = chunk.getWorldForge(); @@ -70,7 +69,7 @@ public static class ModBus { @SubscribeEvent public void registerShaders(RegisterShadersEvent event) throws IOException { - GTShaders.onRegisterShaders(event); + BloomShaderManager.onRegisterShaders(event); } @SubscribeEvent @@ -81,7 +80,7 @@ public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent e @SubscribeEvent public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { RenderType block, entity; - if (ConfigHolder.INSTANCE.client.bloom.safeMode || !GTShaders.isBloomShaderAvailable()) { + if (ConfigHolder.INSTANCE.client.bloom.safeMode || !BloomShaderManager.isBloomShaderAvailable()) { // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' block = RenderType.cutout(); entity = ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java index 8f6e302890a..e03310203f0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.client.bloom; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.mojang.blaze3d.pipeline.RenderCall; @@ -90,7 +89,7 @@ public static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum fr } public static void copyToBloomBuffer(BakedQuad quad, int[] combinedLights, Consumer draw) { - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; SectionPos sectionOrigin = CURRENT_RENDERING_SECTION.get(); if (sectionOrigin != null && TextureMetadataHelper.hasBloom(quad, combinedLights)) { @@ -142,7 +141,7 @@ public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { } public static void bakeBloomChunkBuffers(SectionPos sectionPos, Vec3 camPos) { - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(sectionPos); if (builder == null || !builder.building()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java similarity index 94% rename from src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index d342830a000..e862915da93 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/shader/GTShaders.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -1,7 +1,6 @@ -package com.gregtechceu.gtceu.client.shader; +package com.gregtechceu.gtceu.client.bloom; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; import com.gregtechceu.gtceu.core.mixins.client.bloom.GameRendererAccessor; @@ -26,10 +25,10 @@ import java.io.IOException; @OnlyIn(Dist.CLIENT) -public class GTShaders { +public class BloomShaderManager { - public static PostChain BLOOM_CHAIN = null; - public static RenderTarget BLOOM_TARGET = null; + public static @Nullable PostChain BLOOM_CHAIN = null; + public static @Nullable RenderTarget BLOOM_TARGET = null; @Getter private static @Nullable ShaderInstance rendertypeBloomShader; @@ -98,6 +97,7 @@ private static void initPostShaders() { public static void deinitPostShaders() { if (BLOOM_CHAIN != null) { BLOOM_CHAIN.close(); + // noinspection DataFlowIssue // they should always be null or not together BLOOM_TARGET.destroyBuffers(); BLOOM_CHAIN = null; diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 621a887c72f..11d1f8f488c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; @@ -161,7 +160,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier<@Nullable Level> worldContext) { - if (!GTShaders.isBloomShaderInUse()) return BloomRenderTicket.INVALID; + if (!BloomShaderManager.isBloomShaderInUse()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.writeLock().lock(); @@ -176,7 +175,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @ApiStatus.Internal public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, float partialTicks, LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; Vec3 camPos = camera.getPosition(); @@ -238,7 +237,7 @@ public static void processPostEffect(float partialTicks, ProfilerFiller profiler // render state is set up & cleared in calling function - GTShaders.BLOOM_CHAIN.process(partialTicks); + BloomShaderManager.BLOOM_CHAIN.process(partialTicks); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); VertexBuffer.unbind(); @@ -302,7 +301,7 @@ public static void setFilterToggleUniform(final boolean fragmentFilterEnabled) { private static void modifyBloomPostShaders(IntObjectConsumer consumer) { // Forcefully insert config values to shader - List passes = ((PostChainAccessor) GTShaders.BLOOM_CHAIN).getPasses(); + 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()); 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 b4ea02702fc..92d2f0c809c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.renderer; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import net.minecraft.Util; import net.minecraft.client.Minecraft; @@ -22,19 +22,19 @@ public class GTRenderTypes extends RenderType { public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard( "bloom_target", () -> { - if (GTShaders.isBloomShaderInUse()) { - GTShaders.BLOOM_TARGET.bindWrite(false); + if (BloomShaderManager.isBloomShaderInUse()) { + BloomShaderManager.BLOOM_TARGET.bindWrite(false); } }, () -> { - if (GTShaders.isBloomShaderInUse()) { + if (BloomShaderManager.isBloomShaderInUse()) { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( - GTShaders::getRendertypeBloomShader); + BloomShaderManager::getRendertypeBloomShader); protected static final RenderStateShard.ShaderStateShard RENDERTYPE_ENTITY_BLOOM_SHADER = new RenderStateShard.ShaderStateShard( - GTShaders::getRendertypeEntityBloomShader); + BloomShaderManager::getRendertypeEntityBloomShader); private static final RenderType LIGHT_RING = RenderType.create("light_ring", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, RenderType.SMALL_BUFFER_SIZE, false, false, diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 39755b2fd8d..e77782e7866 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import net.minecraft.client.Camera; import net.minecraft.client.renderer.GameRenderer; @@ -25,14 +25,14 @@ public abstract class LevelRendererMixin { @Inject(method = "resize", at = @At("TAIL")) private void gtceu$resizeBloomChain(int width, int height, CallbackInfo ci) { - if (GTShaders.BLOOM_CHAIN != null) { - GTShaders.BLOOM_CHAIN.resize(width, height); + if (BloomShaderManager.BLOOM_CHAIN != null) { + BloomShaderManager.BLOOM_CHAIN.resize(width, height); } } @Inject(method = "deinitTransparency", at = @At("TAIL")) private void gtceu$deinitBloomEffect(CallbackInfo ci) { - GTShaders.deinitPostShaders(); + BloomShaderManager.deinitPostShaders(); } @Definition(id = "renderBuffers", diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index ac82ffad483..65990970e71 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.core.util.CapturedQuadData; import net.minecraft.client.renderer.RenderType; @@ -51,7 +51,7 @@ public class ModelBlockRendererMixin { private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!GTShaders.isBloomShaderInUse()) return true; + if (!BloomShaderManager.isBloomShaderInUse()) return true; CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); if (!currentData.isSet()) return true; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 94c646a4973..72b08ed2a01 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.core.IGTQuadLighter; import net.minecraft.client.renderer.RenderType; @@ -35,7 +35,7 @@ public class QuadLighterMixin implements IGTQuadLighter { float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!GTShaders.isBloomShaderInUse()) return true; + if (!BloomShaderManager.isBloomShaderInUse()) return true; BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), packedLights, packedOverlay, brightness, red, green, blue); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java index 0e0a7c9123f..0b9ed49c066 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; @@ -34,7 +34,7 @@ public abstract class RebuildTaskMixin { CallbackInfoReturnable cir, @Local(ordinal = 0) BlockPos sectionOrigin, @Local Set usedRenderTypes) { - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; long sectionPos = SectionPos.asLong(sectionOrigin); if (!BloomUtil.chunkSectionHasBloomQuads(sectionPos)) return; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index 3dfba9b1ab4..c6b011cfa53 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import net.minecraft.client.renderer.RenderType; @@ -18,7 +18,7 @@ public class RenderTypeMixin { target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false)) private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { - if (!GTShaders.isBloomShaderAvailable()) return original; + if (!BloomShaderManager.isBloomShaderAvailable()) return original; return ImmutableList.builder() .addAll(original).add(GTRenderTypes.bloom()) 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 2332a008d20..1c119bc72b9 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,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; @@ -36,7 +36,7 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); if (chunkContext != null && TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { 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 e5f5ee19442..1faa5a4dc1f 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; @@ -19,7 +19,7 @@ public class DefaultMaterialsMixin { @Inject(method = "forRenderLayer", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - if (!GTShaders.isBloomShaderAvailable()) return; + if (!BloomShaderManager.isBloomShaderAvailable()) return; if (renderType == GTRenderTypes.bloom()) { cir.setReturnValue(GTEmbeddiumCompat.BLOOM_MATERIAL); 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 4295186b086..d7d4cd56044 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; @@ -32,7 +32,7 @@ public class DefaultTerrainRenderPassesMixin { public static Map> RENDER_PASS_MAPPINGS; static { - if (GTShaders.isBloomShaderAvailable()) { + if (BloomShaderManager.isBloomShaderAvailable()) { ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.BLOOM_RENDER_PASS); RENDER_PASS_MAPPINGS = ImmutableMap.>builder() diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index 21f93b0a6d5..2f8159ba209 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.oculus; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.integration.iris.GTIrisHooks; import net.irisshaders.iris.pipeline.WorldRenderingPhase; @@ -32,7 +32,7 @@ public class WorldRenderingPhaseMixin { } static { - if (GTShaders.isBloomShaderAvailable()) { + if (BloomShaderManager.isBloomShaderAvailable()) { GTIrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("GTCEU:BLOOM", $VALUES.length); $VALUES = ArrayUtils.add($VALUES, GTIrisHooks.BLOOM_RENDERING_PHASE); } @@ -41,7 +41,7 @@ public class WorldRenderingPhaseMixin { @Inject(method = "fromTerrainRenderType", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - if (!GTShaders.isBloomShaderAvailable()) return; + if (!BloomShaderManager.isBloomShaderAvailable()) return; if (renderType == GTRenderTypes.bloom()) { cir.setReturnValue(GTIrisHooks.getBloomRenderingPhase()); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java index e1d42b19dc6..b9c2670410d 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java @@ -1,8 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; -import com.gregtechceu.gtceu.client.shader.GTShaders; -import com.gregtechceu.gtceu.config.ConfigHolder; + import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.Camera; import net.minecraft.client.renderer.LevelRenderer; 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 5495b15bf62..57fba93eb6a 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode.embeddium; import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.llamalad7.mixinextras.sugar.Local; @@ -42,7 +42,7 @@ public class BlockRendererMixin { CallbackInfo ci, @Share("bufferBuilder") LocalRef bufferBuilderRef) { // Check if quad is full brightness OR we have bloom enabled for the quad - if (!GTShaders.isBloomShaderInUse() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { + if (!BloomShaderManager.isBloomShaderInUse() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { bufferBuilderRef.set(null); return; } 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 939f9db1ab9..e80da1fbd80 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.shader.GTShaders; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.config.ConfigHolder; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; @@ -31,7 +31,7 @@ public static void init() { @SubscribeEvent public static void registerSafeModeChunkMeshAppender(ChunkMeshEvent event) { if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; - if (!GTShaders.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomShaderInUse()) return; event.addMeshAppender(context -> { SectionPos sectionOrigin = context.sectionOrigin(); From af4d5f2a43f1c319ccfac2f66583849b4e7f4ee1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 30 Apr 2026 23:12:05 +0300 Subject: [PATCH 198/269] Implement early load config for actually disabling unused mixins such as the bloom safe mode ones --- .../client/bloom/BloomEventListeners.java | 6 +- .../client/bloom/BloomShaderManager.java | 9 +- .../gtceu/client/bloom/BloomUtil.java | 10 +- .../gtceu/config/ConfigHolder.java | 8 - .../gtceu/core/config/GTEarlyConfig.java | 347 ++++++++++++++++++ .../gregtechceu/gtceu/core/config/Option.java | 109 ++++++ .../gtceu/core/config/package-info.java | 4 + .../gtceu/core/mixins/GTMixinPlugin.java | 176 ++++----- .../embeddium/GTEmbeddiumCompat.java | 6 +- 9 files changed, 542 insertions(+), 133 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/config/Option.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/config/package-info.java 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 16d25a1726e..5cb24acd0c1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -4,6 +4,9 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; +import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.SectionPos; @@ -80,7 +83,8 @@ public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent e @SubscribeEvent public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { RenderType block, entity; - if (ConfigHolder.INSTANCE.client.bloom.safeMode || !BloomShaderManager.isBloomShaderAvailable()) { + if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME) || + !BloomShaderManager.isBloomShaderAvailable()) { // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' block = RenderType.cutout(); entity = ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index e862915da93..7158e59902e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; import com.gregtechceu.gtceu.core.mixins.client.bloom.GameRendererAccessor; import net.irisshaders.iris.api.v0.IrisApi; @@ -21,14 +21,15 @@ import lombok.Getter; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import java.io.IOException; @OnlyIn(Dist.CLIENT) public class BloomShaderManager { - public static @Nullable PostChain BLOOM_CHAIN = null; - public static @Nullable RenderTarget BLOOM_TARGET = null; + public static @UnknownNullability PostChain BLOOM_CHAIN = null; + public static @UnknownNullability RenderTarget BLOOM_TARGET = null; @Getter private static @Nullable ShaderInstance rendertypeBloomShader; @@ -125,7 +126,7 @@ public static void updateShaderAvailability(TickEvent.ClientTickEvent event) { } private static boolean updateBloomShaderAvailability() { - return !GTMixinPlugin.OPTIFINE_PRESENT && + return !GTEarlyConfig.OPTIFINE_PRESENT && !(GTCEu.Mods.isIrisOculusLoaded() && IrisCallWrapper.isShaderActive()); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 11d1f8f488c..c630a0fe839 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -5,6 +5,8 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; +import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.safemode.LevelRendererAccessor; @@ -183,7 +185,7 @@ public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frust BloomUtil.setupBloomShaderUniforms(); // if safe mode is enabled, don't draw block bloom the 'normal' way - if (!ConfigHolder.INSTANCE.client.bloom.safeMode) { + if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { BloomUtil.setFilterToggleUniform(true); ((LevelRendererAccessor) levelRenderer).invokeRenderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); @@ -194,7 +196,7 @@ public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frust GTRenderTypes.bloom().setupRenderState(); renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); - if (ConfigHolder.INSTANCE.client.bloom.safeMode) { + if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { BloomUtil.setFilterToggleUniform(true); BloomSafeMode.drawBlockBloom(camera, poseStack, frustum, projectionMatrix, levelRenderer, profilerFiller); BloomUtil.setFilterToggleUniform(false); @@ -334,13 +336,13 @@ public static void invalidateLevelData(LevelAccessor level) { BLOOM_RENDER_LOCK.readLock().lock(); } - if (ConfigHolder.INSTANCE.client.bloom.safeMode) { + if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { BloomSafeMode.invalidateLevelData(); } } public static void invalidateSectionData(SectionPos sectionPos) { - if (ConfigHolder.INSTANCE.client.bloom.safeMode) { + if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { BloomSafeMode.invalidateSectionData(sectionPos); } } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 52ec7f56d49..05067ba310e 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -841,14 +841,6 @@ public static class BloomOptions { @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) public boolean emissiveTexturesHaveBloom = true; - @Configurable - @Configurable.Comment({ "Whether or not to use a 'safe mode' for bloom rendering", - "NOTE: considerably slower than the normal process, but likely fixes compatibility issues with other mods.", - "Requires restarting the client to take effect.", - "Default: false" }) - // @Configurable.RequiresRestart - public boolean safeMode = false; - @Configurable @Configurable.Comment({ "The brightness after bloom should not exceed this value. It can be used to limit the brightness of highlights (e.g., daytime)", diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java new file mode 100644 index 00000000000..b731bdfc0e2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java @@ -0,0 +1,347 @@ +package com.gregtechceu.gtceu.core.config; + +import net.minecraftforge.fml.loading.FMLLoader; + +import com.google.common.collect.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; + +import java.io.*; +import java.util.*; + +/** + * An early (e.g. mixin) config handler based on the one from ModernFix + */ +public class GTEarlyConfig { + + public static final String SAFE_MODE_CONFIG_NAME = "client.bloom.safe_mode"; + + private static final Logger LOGGER = LogManager.getLogger("GTEarlyConfig"); + + private final Map options = new HashMap<>(); + private final File configFile; + + private GTEarlyConfig(File file) { + this.configFile = file; + + // Defines the default rules which can be configured by the user or other mods. + // You must manually add a rule for any new mixins not covered by an existing package rule. + Option option = addMixinRule(SAFE_MODE_CONFIG_NAME, false); + option.addComment( + "Whether to use a 'safe mode' for bloom rendering", + "NOTE: considerably slower than the normal process, but likely fixes compatibility issues with other mods.", + "Requires restarting the client to take effect." + ); + + addDelegateRule("client.bloom.safemode", SAFE_MODE_CONFIG_NAME, false); + addDelegateRule("client.bloom.normal", SAFE_MODE_CONFIG_NAME, true); + + + // hidden rules for dev-only mixins + addHiddenRule("dev", !FMLLoader.isProduction()); + addHiddenRule("dev.datagen", FMLLoader.getLaunchHandler().isData()); + + // hidden rules for mod dependencies + enableIfModPresent("emi", "emi"); + enableIfModPresent("jei", "jei"); + enableIfModPresent("rei", "roughlyenoughitems"); + + final String[] EMBEDDIUM_MOD_IDS = { "embeddium", "sodium" }; + final String[] OCULUS_MOD_IDS = { "oculus", "iris" }; + enableIfModPresent("client.embeddium", EMBEDDIUM_MOD_IDS); + enableIfModPresent("client.bloom.normal.embeddium", EMBEDDIUM_MOD_IDS); + enableIfModPresent("client.bloom.normal.oculus", OCULUS_MOD_IDS); + enableIfModPresent("client.bloom.safemode.embeddium", EMBEDDIUM_MOD_IDS); + + enableIfModPresent("top", "top"); + + enableIfModPresent("ftbchunks", "ftbchunks"); + enableIfModPresent("xaerominimap", "xaerominimap"); + enableIfModPresent("xaeroworldmap", "xaeroworldmap"); + + + // bind non-empty parents + for (Map.Entry entry : this.options.entrySet()) { + if (entry.getValue().getParent() != null) continue; + + int idx = entry.getKey().lastIndexOf('.'); + if (idx <= 0) continue; + + String potentialParentKey = entry.getKey().substring(0, idx); + Option potentialParent = this.options.get(potentialParentKey); + if (potentialParent != null) { + entry.getValue().setParent(potentialParent); + } + } + } + + private void disableIfModPresent(String configName, String... ids) { + Option option = this.options.get(configName); + if (option == null) { + option = addMixinRule(configName, true); + } + + for (String id : ids) { + if (isModLoaded(id)) { + option.addModOverride(false, id); + } + } + } + + // opposite of disableIfModPresent + private void enableIfModPresent(String configName, String... ids) { + Option option = this.options.get(configName); + if (option == null) { + option = addMixinRule(configName, true); + } + option.setHidden(true); + + for (String id : ids) { + if (isModLoaded(id)) { + option.clearModsDefiningValue(); + break; + } + option.addModOverride(false, id); + } + } + + /** + * Defines a Mixin rule which can be configured by users and other mods. + * + * @param configName The name of the mixin package which will be controlled by this rule + * @param enabled True if the rule will be enabled by default, otherwise false + * + * @throws IllegalStateException If a rule with that name already exists + */ + private Option addMixinRule(String configName, boolean enabled) { + Option option = new Option(configName, enabled, false); + if (this.options.putIfAbsent(configName, option) != null) { + throw new IllegalStateException("Mixin rule already defined: " + configName); + } + return option; + } + + /** + * Defines a Mixin rule which can be configured by users and other mods. + * + * @param configName The name of the mixin package which will be controlled by this rule + * @param enabled True if the rule will be enabled by default, otherwise false + * + * @throws IllegalStateException If a rule with that name already exists + */ + private Option addHiddenRule(String configName, boolean enabled) { + Option option = addMixinRule(configName, enabled); + option.setHidden(true); + return option; + } + + /** + * Defines a Mixin rule which directly relegates to another (existing) mixin rule. + * + * @param configName The name of the mixin package which will be controlled by this rule + * @param delegateName The name of the (existing) rule which this rule delegates to + * @param invert Whether to invert {@code delegateName}'s enabled state + * + * @throws IllegalStateException If a rule with that name already exists + * @throws IllegalArgumentException If a rule named {@code delegateName} doesn't already exist + */ + private Option addDelegateRule(String configName, String delegateName, boolean invert) { + Option delegateOption = this.options.get(delegateName); + if (delegateOption == null) { + throw new IllegalArgumentException("Delegate rule not defined: " + delegateName); + } + + Option option = addHiddenRule(configName, delegateOption.isEnabled() != invert); + option.setParent(delegateOption); + option.setParentValueInverted(invert); + + return option; + } + + private void readProperties(Properties props) { + for (Map.Entry entry : props.entrySet()) { + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + + Option option = this.options.get(key); + if (option == null) { + LOGGER.warn("No configuration key exists with name '{}', ignoring", key); + continue; + } + if (option.isHidden()) { + continue; + } + + boolean enabled; + if (value.equalsIgnoreCase("true")) { + enabled = true; + } else if (value.equalsIgnoreCase("false")) { + enabled = false; + } else { + LOGGER.warn("Invalid value '{}' encountered for configuration key '{}', ignoring", value, key); + continue; + } + + if (!option.isModDefined()) { + option.setEnabled(enabled, true); + } else { + LOGGER.warn("Option '{}' already disabled by a mod. Ignoring user configuration", key); + } + } + } + + /** + * Returns the effective option for the specified class name. This traverses the package path of the given mixin + * and checks each root for configuration rules. If a configuration rule disables a package, all mixins located in + * that package and its children will be disabled. The effective option is that of the highest-priority rule, either + * an enable rule at the end of the chain or a disable rule at the earliest point in the chain. + * + * @return Null if no options matched the given mixin name, otherwise the effective option for this Mixin + */ + public @Nullable Option getEffectiveOptionForMixin(String mixinClassName) { + int lastSplit = 0; + int nextSplit; + + Option rule = null; + + while ((nextSplit = mixinClassName.indexOf('.', lastSplit)) != -1) { + String key = mixinClassName.substring(0, nextSplit); + + Option candidate = this.options.get(key); + + if (candidate != null) { + rule = candidate; + + if (!rule.isEnabled()) { + return rule; + } + } + + lastSplit = nextSplit + 1; + } + + return rule; + } + + /** + * Loads the configuration file from the specified location. If it does not exist, a new configuration file will be + * created. The file on disk will then be updated to include any new options. + */ + public static GTEarlyConfig load(File file) { + GTEarlyConfig config = new GTEarlyConfig(file); + Properties props = new Properties(); + if (file.exists()) { + try (FileInputStream fin = new FileInputStream(file)) { + props.load(fin); + } catch (IOException e) { + throw new RuntimeException("Could not load config file", e); + } + config.readProperties(props); + } + + try { + config.save(); + } catch (IOException e) { + LOGGER.warn("Could not write configuration file", e); + } + + return config; + } + + public void save() throws IOException { + File dir = configFile.getParentFile(); + + if (!dir.exists()) { + if (!dir.mkdirs()) { + throw new IOException("Could not create parent directories"); + } + } else if (!dir.isDirectory()) { + throw new IOException("The parent file is not a directory"); + } + + try (Writer writer = new FileWriter(configFile)) { + writer.write("# This is the early configuration file for GregTech CEu Modern.\n"); + writer.write("# The following options can be enabled or disabled if there is a compatibility issue.\n"); + writer.write("# Add a line with your option name and =true or =false at the bottom of the file to enable\n"); + writer.write("# or disable a rule. For example:\n"); + writer.write("# client.bloom.safe_mode=true\n"); + writer.write("# Do not include the #. You may reset to defaults by deleting this file.\n"); + writer.write("#\n"); + writer.write("# Available options:\n"); + var entries = this.options.entrySet().stream() + .filter(entry -> !entry.getValue().isHidden()) + .sorted() + .toList(); + + for (var entry : entries) { + String line = entry.getKey(); + Option option = entry.getValue(); + + String extraContext; + if (!option.isUserDefined()) { + extraContext = "=" + option.isEnabled() + " # " + (option.isModDefined() ? "(overridden for mod compat)" : "(default)"); + } else { + extraContext = "=" + option.isDefaultEnabled() + " # (default)"; + } + + writer.write("#\n"); + if (option.getComment() != null) { + for (String commentLine : option.getComment()) { + writer.write("# " + commentLine + "\n"); + } + } + writer.write("# " + line + extraContext + "\n"); + } + + writer.write("#\n"); + writer.write("#\n"); + writer.write("# User overrides go here.\n"); + + for (var entry : entries) { + Option option = entry.getValue(); + if (option.isUserDefined()) { + writer.write(entry.getKey() + "=" + option.isEnabled() + "\n"); + } + } + } + } + + public int getOptionCount() { + return this.options.size(); + } + + public int getOptionOverrideCount() { + return (int) this.options.values() + .stream() + .filter(option -> !option.isHidden()) + .filter(Option::isOverridden) + .count(); + } + + public Map getOptionMap() { + return Collections.unmodifiableMap(this.options); + } + + public static boolean isModLoaded(String modId) { + if (modId.equals("optifine")) { + return OPTIFINE_PRESENT; + } else { + return FMLLoader.getLoadingModList().getModFileById(modId) != null; + } + } + + public static final boolean OPTIFINE_PRESENT; + + static { + boolean hasOfClass = false; + try { + Class.forName("optifine.OptiFineTransformationService"); + hasOfClass = true; + } catch (Throwable ignored) { + } + + OPTIFINE_PRESENT = hasOfClass; + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/Option.java b/src/main/java/com/gregtechceu/gtceu/core/config/Option.java new file mode 100644 index 00000000000..f928771a490 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/config/Option.java @@ -0,0 +1,109 @@ +package com.gregtechceu.gtceu.core.config; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class Option { + + @Getter + private final String name; + @Getter + private final boolean defaultEnabled; + @Getter + private @Nullable List comment = null; + + private @Nullable Set modDefined = null; + private boolean enabled; + @Getter + private boolean userDefined; + @Getter + @Setter + private @Nullable Option parent = null; + @Getter + @Setter + private boolean hidden; + @Setter + private boolean parentValueInverted; + + public Option(String name, boolean enabled, boolean userDefined) { + this.name = name; + this.defaultEnabled = enabled; + + this.enabled = enabled; + this.userDefined = userDefined; + } + + public void setEnabled(boolean enabled, boolean userDefined) { + if (this.enabled == enabled) return; + + this.enabled = enabled; + this.userDefined = userDefined; + } + + public void addModOverride(boolean enabled, String modId) { + if (this.enabled == enabled) return; + + this.enabled = enabled; + + if (this.modDefined == null) { + this.modDefined = new LinkedHashSet<>(); + } + + this.modDefined.add(modId); + } + + public void addComment(String... comment) { + if (this.comment == null) { + this.comment = new ArrayList<>(); + } + Collections.addAll(this.comment, comment); + } + + public int getDepth() { + if (this.parent == null) return 0; + else return this.parent.getDepth() + 1; + } + + public boolean isEnabled() { + if (this.hidden && this.parent != null) { + return this.parent.isEnabled() != parentValueInverted; + } + return this.enabled; + } + + /** + * Checks if this option will effectively be disabled (regardless of its own status) + * by the parent rule being disabled. + */ + public boolean isEffectivelyDisabledByParent() { + return this.parent != null && (!this.parent.enabled || this.parent.isEffectivelyDisabledByParent()) != parentValueInverted; + } + + public boolean isOverridden() { + return this.isUserDefined() || this.isModDefined() || (this.hidden && this.parent != null); + } + + public boolean isModDefined() { + return this.modDefined != null; + } + + public String getSelfName() { + if (this.parent == null) return this.name; + else return this.name.substring(this.parent.getName().length() + 1); + } + + public void clearModsDefiningValue() { + this.modDefined = null; + } + + public void clearUserDefined() { + this.userDefined = false; + } + + public Collection getDefiningMods() { + return this.modDefined != null ? Collections.unmodifiableCollection(this.modDefined) : Collections.emptyList(); + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/package-info.java b/src/main/java/com/gregtechceu/gtceu/core/config/package-info.java new file mode 100644 index 00000000000..a6db9225c91 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/config/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.core.config; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 175e6090cc8..0827d38d189 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -1,128 +1,102 @@ package com.gregtechceu.gtceu.core.mixins; -import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; +import com.gregtechceu.gtceu.core.config.Option; -import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.loading.FMLLoader; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.UnknownNullability; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.io.File; +import java.util.*; + +import static com.gregtechceu.gtceu.core.config.GTEarlyConfig.OPTIFINE_PRESENT; public class GTMixinPlugin implements IMixinConfigPlugin { public static final Logger LOGGER = LogManager.getLogger("GregTechCEu"); - @Override - public void onLoad(String mixinPackage) {} + public static final String MIXIN_PACKAGE_ROOT = "com.gregtechceu.gtceu.core.mixins."; - @Override - public String getRefMapperConfig() { - return null; - } + public static @UnknownNullability GTEarlyConfig CONFIG = null; - private static final String MIXIN_PACKAGE = "com.gregtechceu.gtceu.core.mixins."; - private static final Map MOD_COMPAT_MIXINS = new HashMap<>(); - - private static final String DEV_PACKAGE = "dev."; - private static final String DATAGEN_PACKAGE = "datagen."; - - private static final String CLIENT_PACKAGE = "client."; - private static final String BLOOM_PACKAGE = "bloom.", - BLOOM_NORMAL_PACKAGE = "normal.", - BLOOM_SAFEMODE_PACKAGE = "safemode."; - - static { - MOD_COMPAT_MIXINS.put("roughlyenoughitems", "rei."); - addModCompatMixin("emi"); - addModCompatMixin("jei"); - addModCompatMixin("top"); - addModCompatMixin("embeddium"); - // MOD_COMPAT_MIXINS.put("sodium", "embeddium."); - addModCompatMixin("oculus"); - // MOD_COMPAT_MIXINS.put("iris", "oculus."); - addModCompatMixin("ftbchunks"); - addModCompatMixin("xaerominimap"); - addModCompatMixin("xaeroworldmap"); - } - - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (!FMLLoader.getLoadingModList().getErrors().isEmpty()) { - return false; + public GTMixinPlugin() { + if (CONFIG != null) { + return; } - if (!mixinClassName.startsWith(MIXIN_PACKAGE)) { - // skip checking mixins that aren't in our package - // this should never happen, but better safe than sorry - return true; + try { + CONFIG = GTEarlyConfig.load(new File("./config/gtceu-early-config.properties")); + } catch (Exception e) { + throw new RuntimeException("Could not load mixin configuration file for GTCEu", e); } - mixinClassName = mixinClassName.substring(MIXIN_PACKAGE.length()); - if (mixinClassName.startsWith(DEV_PACKAGE)) { - if (FMLLoader.isProduction()) { - // don't load dev-only mixins in prod - return false; + CONFIG.getOptionMap().values().forEach(option -> { + if (option.isOverridden()) { + String source = "[unknown]"; + + if (option.isUserDefined()) { + source = "user configuration"; + } else if (!FMLLoader.getLoadingModList().getErrors().isEmpty()) { + source = "load error"; + } else if (option.isModDefined()) { + source = "mods [" + String.join(", ", option.getDefiningMods()) + "]"; + } + LOGGER.warn("Option '{}' overridden (by {}) to '{}'", option.getName(), source, option.isEnabled()); } - mixinClassName = mixinClassName.substring(DEV_PACKAGE.length()); - if (mixinClassName.startsWith(DATAGEN_PACKAGE)) { - // only load datagen mixins in datagen - return FMLLoader.getLaunchHandler().isData(); - } - return true; - } - if (mixinClassName.startsWith(CLIENT_PACKAGE)) { - mixinClassName = mixinClassName.substring(CLIENT_PACKAGE.length()); + }); - if (FMLLoader.getDist() != Dist.CLIENT) { - // make extra sure client mixins are only loaded on clients - return false; - } + if (OPTIFINE_PRESENT) { + LOGGER.fatal("OptiFine detected. Use of GTCEu with OptiFine is not supported due to its breakage of Forge features."); + } + } - if (mixinClassName.startsWith(BLOOM_PACKAGE)) { - mixinClassName = mixinClassName.substring(BLOOM_PACKAGE.length()); + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (!mixinClassName.startsWith(MIXIN_PACKAGE_ROOT)) { + LOGGER.error("Expected mixin '{}' to start with package root '{}', treating as foreign and disabling!", + mixinClassName, MIXIN_PACKAGE_ROOT); - String[] mutable = temp; - mutable[0] = mixinClassName; + return false; + } - if (!filterBloomMixins(mutable)) return false; + String mixin = mixinClassName.substring(MIXIN_PACKAGE_ROOT.length()); - mixinClassName = mutable[0]; - } + if (!isOptionEnabled(mixin)) { + return false; } - for (var compatMod : MOD_COMPAT_MIXINS.entrySet()) { - if (mixinClassName.startsWith(compatMod.getValue())) { - return isModLoaded(compatMod.getKey()); - } - } return true; } - /// ensure only the appropriate set of bloom-related mixins are loaded - private static boolean filterBloomMixins(String[] mixinClassName) { - boolean safeModeConfigEnabled = ConfigHolder.getInstance().client.bloom.safeMode; - - if (mixinClassName[0].startsWith(BLOOM_NORMAL_PACKAGE)) { - if (safeModeConfigEnabled) return false; + public static boolean isOptionEnabled(String mixin) { + Option option = CONFIG.getEffectiveOptionForMixin(mixin); - // trim off the load type package so mod loaded checks also function - mixinClassName[0] = mixinClassName[0].substring(BLOOM_NORMAL_PACKAGE.length()); - } else if (mixinClassName[0].startsWith(BLOOM_SAFEMODE_PACKAGE)) { - if (!safeModeConfigEnabled) return false; + if (option == null) { + String msg = "No rules matched mixin '{}', treating as foreign and disabling!"; + if (!FMLLoader.isProduction()) { + LOGGER.error(msg, mixin); + } else { + LOGGER.debug(msg, mixin); + } - // trim off the load type package so mod loaded checks also function - mixinClassName[0] = mixinClassName[0].substring(BLOOM_SAFEMODE_PACKAGE.length()); + return false; } - return true; + return option.isEnabled(); + } + + @Override + public void onLoad(String mixinPackage) {} + + @Override + public String getRefMapperConfig() { + return null; } @Override @@ -138,30 +112,4 @@ public void preApply(String targetClassName, ClassNode targetClass, String mixin @Override public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} - - private static void addModCompatMixin(String modId) { - MOD_COMPAT_MIXINS.put(modId, modId + "."); - } - - private static boolean isModLoaded(String modId) { - if (modId.equals("optifine")) { - return OPTIFINE_PRESENT; - } else { - return FMLLoader.getLoadingModList().getModFileById(modId) != null; - } - } - - public static final boolean OPTIFINE_PRESENT; - - static { - boolean hasOfClass = false; - try { - Class.forName("optifine.OptiFineTransformationService"); - hasOfClass = true; - } catch (Throwable ignored) {} - - OPTIFINE_PRESENT = hasOfClass; - } - - private static final String[] temp = new String[1]; } 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 e80da1fbd80..0d5f64f21cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -4,7 +4,9 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; -import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; +import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; + import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; @@ -30,7 +32,7 @@ public static void init() { @SubscribeEvent public static void registerSafeModeChunkMeshAppender(ChunkMeshEvent event) { - if (!ConfigHolder.INSTANCE.client.bloom.safeMode) return; + if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) return; if (!BloomShaderManager.isBloomShaderInUse()) return; event.addMeshAppender(context -> { From ecc84ab9e8b3cdbb9da5f12a4efec691726c199b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 11:49:45 +0300 Subject: [PATCH 199/269] Forgot to unshelve this bit :3 --- .../com/gregtechceu/gtceu/common/data/GTBlocks.java | 3 +++ .../lamps/black_borderless_emissive.png.mcmeta | 0 ..._off_borderless.png => black_borderless_off.png} | Bin .../block/lamps/blue_borderless_emissive.png.mcmeta | 0 ...e_off_borderless.png => blue_borderless_off.png} | Bin .../lamps/brown_borderless_emissive.png.mcmeta | 0 ..._off_borderless.png => brown_borderless_off.png} | Bin .../block/lamps/cyan_borderless_emissive.png.mcmeta | 0 ...n_off_borderless.png => cyan_borderless_off.png} | Bin .../block/lamps/gray_borderless_emissive.png.mcmeta | 0 ...y_off_borderless.png => gray_borderless_off.png} | Bin .../lamps/green_borderless_emissive.png.mcmeta | 0 ..._off_borderless.png => green_borderless_off.png} | Bin .../lamps/light_blue_borderless_emissive.png.mcmeta | 0 ...borderless.png => light_blue_borderless_off.png} | Bin .../lamps/light_gray_borderless_emissive.png.mcmeta | 0 ...borderless.png => light_gray_borderless_off.png} | Bin .../block/lamps/lime_borderless_emissive.png.mcmeta | 0 ...e_off_borderless.png => lime_borderless_off.png} | Bin .../lamps/magenta_borderless_emissive.png.mcmeta | 0 ...ff_borderless.png => magenta_borderless_off.png} | Bin .../lamps/orange_borderless_emissive.png.mcmeta | 0 ...off_borderless.png => orange_borderless_off.png} | Bin .../block/lamps/pink_borderless_emissive.png.mcmeta | 0 ...k_off_borderless.png => pink_borderless_off.png} | Bin .../lamps/purple_borderless_emissive.png.mcmeta | 0 ...off_borderless.png => purple_borderless_off.png} | Bin .../block/lamps/red_borderless_emissive.png.mcmeta | 0 ...ed_off_borderless.png => red_borderless_off.png} | Bin .../lamps/white_borderless_emissive.png.mcmeta | 0 ..._off_borderless.png => white_borderless_off.png} | Bin .../lamps/yellow_borderless_emissive.png.mcmeta | 0 ...off_borderless.png => yellow_borderless_off.png} | Bin 33 files changed, 3 insertions(+) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{black_off_borderless.png => black_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{blue_off_borderless.png => blue_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{brown_off_borderless.png => brown_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{cyan_off_borderless.png => cyan_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{gray_off_borderless.png => gray_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{green_off_borderless.png => green_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_blue_off_borderless.png => light_blue_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_gray_off_borderless.png => light_gray_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{lime_off_borderless.png => lime_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{magenta_off_borderless.png => magenta_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{orange_off_borderless.png => orange_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{pink_off_borderless.png => pink_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{purple_off_borderless.png => purple_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{red_off_borderless.png => red_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{white_off_borderless.png => white_borderless_off.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{yellow_off_borderless.png => yellow_borderless_off.png} (100%) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index b2a8f0e4f87..9e1956a1489 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -15,6 +15,7 @@ import com.gregtechceu.gtceu.api.item.*; import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistancePipeBlock; +import com.gregtechceu.gtceu.client.model.item.CustomItemRendererModel; import com.gregtechceu.gtceu.common.block.*; import com.gregtechceu.gtceu.common.block.explosive.IndustrialTNTBlock; import com.gregtechceu.gtceu.common.block.explosive.PowderbarrelBlock; @@ -1300,6 +1301,7 @@ public static void generateStoneBlocks() { .addLayer(() -> RenderType::cutout) .blockstate(GTModels.lampModel(dyeColor, true)) .item(LampBlockItem::new) + .model((ctx, prov) -> prov.blockItem(ctx::get, "_on")) .build() .register()); } @@ -1312,6 +1314,7 @@ public static void generateStoneBlocks() { .properties(p -> p.strength(0.3f, 8.0f).sound(SoundType.GLASS)) .blockstate(GTModels.lampModel(dyeColor, false)) .item(LampBlockItem::new) + .model((ctx, prov) -> prov.blockItem(ctx::get, "_on")) .build() .register()); } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/black_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/blue_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/brown_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/cyan_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/gray_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/green_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_gray_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/lime_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/magenta_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/orange_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/pink_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/purple_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/red_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/white_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_off.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_emissive.png.mcmeta deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_off.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/yellow_off_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_off.png From 776b53471918ed33a8d859e572a41332226a3c79 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 11:54:36 +0300 Subject: [PATCH 200/269] Datagen --- .../resources/assets/gtceu/blockstates/cyan_lamp.json | 4 ++-- .../assets/gtceu/blockstates/gray_borderless_lamp.json | 4 ++-- .../assets/gtceu/blockstates/light_gray_lamp.json | 4 ++-- .../assets/gtceu/blockstates/pink_borderless_lamp.json | 4 ++-- .../resources/assets/gtceu/blockstates/pink_lamp.json | 4 ++-- .../assets/gtceu/blockstates/white_borderless_lamp.json | 4 ++-- .../resources/assets/gtceu/blockstates/white_lamp.json | 4 ++-- .../resources/assets/gtceu/blockstates/yellow_lamp.json | 4 ++-- .../assets/gtceu/models/block/black_borderless_lamp.json | 0 .../gtceu/models/block/black_borderless_lamp_off.json | 2 +- .../resources/assets/gtceu/models/block/black_lamp.json | 0 .../assets/gtceu/models/block/blue_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/blue_lamp.json | 0 .../assets/gtceu/models/block/brown_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/brown_lamp.json | 0 .../assets/gtceu/models/block/cyan_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/cyan_lamp.json | 0 .../assets/gtceu/models/block/gray_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/gray_lamp.json | 0 .../assets/gtceu/models/block/green_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/green_lamp.json | 0 .../gtceu/models/block/light_blue_borderless_lamp.json | 0 .../assets/gtceu/models/block/light_blue_lamp.json | 0 .../gtceu/models/block/light_gray_borderless_lamp.json | 0 .../assets/gtceu/models/block/light_gray_lamp.json | 0 .../assets/gtceu/models/block/light_gray_lamp_bloom.json | 2 +- .../assets/gtceu/models/block/lime_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/lime_lamp.json | 0 .../gtceu/models/block/magenta_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/magenta_lamp.json | 0 .../assets/gtceu/models/block/orange_borderless_lamp.json | 0 .../gtceu/models/block/orange_borderless_lamp_off.json | 2 +- .../resources/assets/gtceu/models/block/orange_lamp.json | 0 .../assets/gtceu/models/block/pink_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/pink_lamp.json | 0 .../assets/gtceu/models/block/purple_borderless_lamp.json | 0 .../gtceu/models/block/purple_borderless_lamp_bloom.json | 4 ++-- .../resources/assets/gtceu/models/block/purple_lamp.json | 0 .../assets/gtceu/models/block/red_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/red_lamp.json | 0 .../assets/gtceu/models/block/white_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/white_lamp.json | 0 .../assets/gtceu/models/block/yellow_borderless_lamp.json | 0 .../resources/assets/gtceu/models/block/yellow_lamp.json | 0 .../resources/assets/gtceu/models/item/brown_lamp.json | 2 +- .../assets/gtceu/models/item/cyan_borderless_lamp.json | 2 +- .../resources/assets/gtceu/models/item/green_lamp.json | 2 +- .../resources/assets/gtceu/models/item/lime_lamp.json | 2 +- .../resources/assets/gtceu/models/item/red_lamp.json | 2 +- .../java/com/gregtechceu/gtceu/common/data/GTBlocks.java | 8 +++++--- 50 files changed, 31 insertions(+), 29 deletions(-) delete mode 100644 src/generated/resources/assets/gtceu/models/block/black_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/black_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/blue_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/brown_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/cyan_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/gray_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/green_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/green_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/light_blue_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/light_gray_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/lime_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/magenta_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/orange_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/pink_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/purple_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/red_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/red_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/white_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/white_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp.json delete mode 100644 src/generated/resources/assets/gtceu/models/block/yellow_lamp.json diff --git a/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json b/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json index f99b1adf611..fc2113dab49 100644 --- a/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/cyan_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/cyan_lamp" + "model": "gtceu:block/cyan_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/cyan_lamp" + "model": "gtceu:block/cyan_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/cyan_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json index 90e7a09ad9b..ea09a42e8ea 100644 --- a/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/gray_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/gray_borderless_lamp" + "model": "gtceu:block/gray_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/gray_borderless_lamp" + "model": "gtceu:block/gray_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/gray_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json index 1273f8861b2..7b84870486a 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/light_gray_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/light_gray_lamp" + "model": "gtceu:block/light_gray_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/light_gray_lamp" + "model": "gtceu:block/light_gray_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/light_gray_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json index 4a417644bef..7fe0a82fa09 100644 --- a/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/pink_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/pink_borderless_lamp" + "model": "gtceu:block/pink_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/pink_borderless_lamp" + "model": "gtceu:block/pink_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/pink_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json b/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json index 139d3938687..a810f47ca34 100644 --- a/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/pink_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/pink_lamp" + "model": "gtceu:block/pink_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/pink_lamp" + "model": "gtceu:block/pink_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/pink_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json index 4445a730db2..f0b9254457d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/white_borderless_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/white_borderless_lamp" + "model": "gtceu:block/white_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/white_borderless_lamp" + "model": "gtceu:block/white_borderless_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/white_borderless_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/white_lamp.json b/src/generated/resources/assets/gtceu/blockstates/white_lamp.json index 285658d5da1..762183f229b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/white_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/white_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/white_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/white_lamp" + "model": "gtceu:block/white_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/white_lamp" + "model": "gtceu:block/white_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/white_lamp_off" diff --git a/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json b/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json index 2baa9b42b3f..b0a4e50e0ef 100644 --- a/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json @@ -4,10 +4,10 @@ "model": "gtceu:block/yellow_lamp_off" }, "bloom=false,inverted=false,powered=true": { - "model": "gtceu:block/yellow_lamp" + "model": "gtceu:block/yellow_lamp_on" }, "bloom=false,inverted=true,powered=false": { - "model": "gtceu:block/yellow_lamp" + "model": "gtceu:block/yellow_lamp_on" }, "bloom=false,inverted=true,powered=true": { "model": "gtceu:block/yellow_lamp_off" diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json index c5e5fbca676..fbf18fc840e 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/black_off_borderless" + "inactive": "gtceu:block/lamps/black_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_lamp.json b/src/generated/resources/assets/gtceu/models/block/black_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/blue_lamp.json b/src/generated/resources/assets/gtceu/models/block/blue_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/brown_lamp.json b/src/generated/resources/assets/gtceu/models/block/brown_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_lamp.json b/src/generated/resources/assets/gtceu/models/block/cyan_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/gray_lamp.json b/src/generated/resources/assets/gtceu/models/block/gray_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/green_lamp.json b/src/generated/resources/assets/gtceu/models/block/green_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp.json b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json index 82851dde5f8..fbd8eab992f 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json @@ -1,5 +1,5 @@ { - "parent": "gtceu:block/lamp", + "parent": "gtceu:block/lamp_bloom", "textures": { "active": "gtceu:block/lamps/light_gray", "active_overlay": "gtceu:block/lamps/light_gray_emissive" diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/lime_lamp.json b/src/generated/resources/assets/gtceu/models/block/lime_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_lamp.json b/src/generated/resources/assets/gtceu/models/block/magenta_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json index f9df9f88ee8..81dcf02aa53 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json @@ -1,6 +1,6 @@ { "parent": "gtceu:block/lamp_borderless_off", "textures": { - "inactive": "gtceu:block/lamps/orange_off_borderless" + "inactive": "gtceu:block/lamps/orange_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_lamp.json b/src/generated/resources/assets/gtceu/models/block/orange_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/pink_lamp.json b/src/generated/resources/assets/gtceu/models/block/pink_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json index d29ca9d4594..99666122896 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless", + "parent": "gtceu:block/lamp_borderless_bloom", "textures": { - "active": "gtceu:block/lamps/purple_borderless_emissive" + "active": "gtceu:block/lamps/purple_borderless" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_lamp.json b/src/generated/resources/assets/gtceu/models/block/purple_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/red_lamp.json b/src/generated/resources/assets/gtceu/models/block/red_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/white_lamp.json b/src/generated/resources/assets/gtceu/models/block/white_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_lamp.json b/src/generated/resources/assets/gtceu/models/block/yellow_lamp.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/generated/resources/assets/gtceu/models/item/brown_lamp.json b/src/generated/resources/assets/gtceu/models/item/brown_lamp.json index 2a031d3fe68..ad3b6275060 100644 --- a/src/generated/resources/assets/gtceu/models/item/brown_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/brown_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/brown_lamp" + "parent": "gtceu:block/brown_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json index 2ebe5ae1902..d5c0a34f9bc 100644 --- a/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/cyan_borderless_lamp" + "parent": "gtceu:block/cyan_borderless_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/green_lamp.json b/src/generated/resources/assets/gtceu/models/item/green_lamp.json index 34ee0923956..52f0520f0c5 100644 --- a/src/generated/resources/assets/gtceu/models/item/green_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/green_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/green_lamp" + "parent": "gtceu:block/green_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/lime_lamp.json b/src/generated/resources/assets/gtceu/models/item/lime_lamp.json index a154c799b5e..6075dceafbd 100644 --- a/src/generated/resources/assets/gtceu/models/item/lime_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/lime_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/lime_lamp" + "parent": "gtceu:block/lime_lamp_on" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/red_lamp.json b/src/generated/resources/assets/gtceu/models/item/red_lamp.json index 1c324092d6b..b1a7a1ee344 100644 --- a/src/generated/resources/assets/gtceu/models/item/red_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/red_lamp.json @@ -1,3 +1,3 @@ { - "parent": "gtceu:block/red_lamp" + "parent": "gtceu:block/red_lamp_on" } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index 9e1956a1489..0fb295c79ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -15,7 +15,7 @@ import com.gregtechceu.gtceu.api.item.*; import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; import com.gregtechceu.gtceu.api.pipenet.longdistance.LongDistancePipeBlock; -import com.gregtechceu.gtceu.client.model.item.CustomItemRendererModel; +import com.gregtechceu.gtceu.client.model.item.CustomItemRendererWrapperModel; import com.gregtechceu.gtceu.common.block.*; import com.gregtechceu.gtceu.common.block.explosive.IndustrialTNTBlock; import com.gregtechceu.gtceu.common.block.explosive.PowderbarrelBlock; @@ -1301,7 +1301,8 @@ public static void generateStoneBlocks() { .addLayer(() -> RenderType::cutout) .blockstate(GTModels.lampModel(dyeColor, true)) .item(LampBlockItem::new) - .model((ctx, prov) -> prov.blockItem(ctx::get, "_on")) + .model((ctx, prov) -> prov.blockItem(ctx::get, "_on") + .customLoader(CustomItemRendererWrapperModel.Builder::begin).end()) .build() .register()); } @@ -1314,7 +1315,8 @@ public static void generateStoneBlocks() { .properties(p -> p.strength(0.3f, 8.0f).sound(SoundType.GLASS)) .blockstate(GTModels.lampModel(dyeColor, false)) .item(LampBlockItem::new) - .model((ctx, prov) -> prov.blockItem(ctx::get, "_on")) + .model((ctx, prov) -> prov.blockItem(ctx::get, "_on") + .customLoader(CustomItemRendererWrapperModel.Builder::begin).end()) .build() .register()); } From ce6121a419545d673d3cbef6443f08bacfa72b51 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:15:13 +0300 Subject: [PATCH 201/269] Rename all the lamp texture files to be more descriptive --- .../gtceu/textures/block/lamps/black.png.mcmeta | 6 ------ .../lamps/{black_emissive.png => black_bloom.png} | Bin .../textures/block/lamps/black_bloom.png.mcmeta | 9 +++++++++ ...black_ctm_emissive.png => black_bloom_ctm.png} | Bin ...sive.png.mcmeta => black_bloom_ctm.png.mcmeta} | 0 ..._borderless.png => black_borderless_bloom.png} | Bin ...g.mcmeta => black_borderless_bloom.png.mcmeta} | 0 .../textures/block/lamps/black_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/black_emissive.png.mcmeta | 9 --------- .../textures/block/lamps/black_off.png.mcmeta | 6 +++--- .../block/lamps/{black.png => black_on.png} | Bin .../textures/block/lamps/black_on.png.mcmeta | 6 ++++++ .../lamps/{black_ctm.png => black_on_ctm.png} | Bin .../gtceu/textures/block/lamps/blue.png.mcmeta | 5 ----- .../lamps/{blue_emissive.png => blue_bloom.png} | Bin .../textures/block/lamps/blue_bloom.png.mcmeta | 8 ++++++++ .../{blue_ctm_emissive.png => blue_bloom_ctm.png} | Bin ...ssive.png.mcmeta => blue_bloom_ctm.png.mcmeta} | 0 ...ng.mcmeta => blue_borderless_bloom.png.mcmeta} | 0 .../textures/block/lamps/blue_borderless_on.png | Bin 0 -> 189 bytes .../textures/block/lamps/blue_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/blue_off.png.mcmeta | 6 +++--- .../block/lamps/{blue.png => blue_on.png} | Bin .../gtceu/textures/block/lamps/blue_on.png.mcmeta | 5 +++++ .../block/lamps/{blue_ctm.png => blue_on_ctm.png} | Bin .../gtceu/textures/block/lamps/brown.png.mcmeta | 5 ----- .../lamps/{brown_emissive.png => brown_bloom.png} | Bin .../textures/block/lamps/brown_bloom.png.mcmeta | 8 ++++++++ ...brown_ctm_emissive.png => brown_bloom_ctm.png} | Bin ...sive.png.mcmeta => brown_bloom_ctm.png.mcmeta} | 0 ...g.mcmeta => brown_borderless_bloom.png.mcmeta} | 0 .../textures/block/lamps/brown_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/brown_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/brown_off.png.mcmeta | 6 +++--- .../block/lamps/{brown.png => brown_on.png} | Bin .../textures/block/lamps/brown_on.png.mcmeta | 5 +++++ .../lamps/{brown_ctm.png => brown_on_ctm.png} | Bin .../gtceu/textures/block/lamps/cyan.png.mcmeta | 5 ----- .../lamps/{cyan_emissive.png => cyan_bloom.png} | Bin .../textures/block/lamps/cyan_bloom.png.mcmeta | 8 ++++++++ .../{cyan_ctm_emissive.png => cyan_bloom_ctm.png} | Bin ...ssive.png.mcmeta => cyan_bloom_ctm.png.mcmeta} | 0 ...ng.mcmeta => cyan_borderless_bloom.png.mcmeta} | 0 .../textures/block/lamps/cyan_borderless_on.png | Bin 0 -> 189 bytes .../textures/block/lamps/cyan_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/cyan_off.png.mcmeta | 6 +++--- .../block/lamps/{cyan.png => cyan_on.png} | Bin .../gtceu/textures/block/lamps/cyan_on.png.mcmeta | 5 +++++ .../block/lamps/{cyan_ctm.png => cyan_on_ctm.png} | Bin .../gtceu/textures/block/lamps/gray.png.mcmeta | 5 ----- .../lamps/{gray_emissive.png => gray_bloom.png} | Bin .../textures/block/lamps/gray_bloom.png.mcmeta | 8 ++++++++ .../{gray_ctm_emissive.png => gray_bloom_ctm.png} | Bin ...ssive.png.mcmeta => gray_bloom_ctm.png.mcmeta} | 0 ...y_borderless.png => gray_borderless_bloom.png} | Bin ...ng.mcmeta => gray_borderless_bloom.png.mcmeta} | 0 .../textures/block/lamps/gray_borderless_on.png | Bin 0 -> 189 bytes .../textures/block/lamps/gray_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/gray_off.png.mcmeta | 6 +++--- .../block/lamps/{gray.png => gray_on.png} | Bin .../gtceu/textures/block/lamps/gray_on.png.mcmeta | 5 +++++ .../block/lamps/{gray_ctm.png => gray_on_ctm.png} | Bin .../gtceu/textures/block/lamps/green.png.mcmeta | 5 ----- .../lamps/{green_emissive.png => green_bloom.png} | Bin .../textures/block/lamps/green_bloom.png.mcmeta | 8 ++++++++ ...green_ctm_emissive.png => green_bloom_ctm.png} | Bin ...sive.png.mcmeta => green_bloom_ctm.png.mcmeta} | 0 ..._borderless.png => green_borderless_bloom.png} | Bin ...g.mcmeta => green_borderless_bloom.png.mcmeta} | 0 .../textures/block/lamps/green_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/green_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/green_off.png.mcmeta | 6 +++--- .../block/lamps/{green.png => green_on.png} | Bin .../textures/block/lamps/green_on.png.mcmeta | 5 +++++ .../lamps/{green_ctm.png => green_on_ctm.png} | Bin .../textures/block/lamps/light_blue.png.mcmeta | 5 ----- ...ght_blue_emissive.png => light_blue_bloom.png} | Bin .../block/lamps/light_blue_bloom.png.mcmeta | 8 ++++++++ ..._ctm_emissive.png => light_blue_bloom_ctm.png} | Bin ...png.mcmeta => light_blue_bloom_ctm.png.mcmeta} | 0 ...erless.png => light_blue_borderless_bloom.png} | Bin ...eta => light_blue_borderless_bloom.png.mcmeta} | 0 .../block/lamps/light_blue_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/light_blue_emissive.png.mcmeta | 8 -------- .../block/lamps/light_blue_off.png.mcmeta | 6 +++--- .../lamps/{light_blue.png => light_blue_on.png} | Bin .../textures/block/lamps/light_blue_on.png.mcmeta | 5 +++++ .../{light_blue_ctm.png => light_blue_on_ctm.png} | Bin .../textures/block/lamps/light_gray.png.mcmeta | 5 ----- ...ght_gray_emissive.png => light_gray_bloom.png} | Bin .../block/lamps/light_gray_bloom.png.mcmeta | 8 ++++++++ ..._ctm_emissive.png => light_gray_bloom_ctm.png} | Bin ...png.mcmeta => light_gray_bloom_ctm.png.mcmeta} | 0 ...erless.png => light_gray_borderless_bloom.png} | Bin ...eta => light_gray_borderless_bloom.png.mcmeta} | 0 .../block/lamps/light_gray_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/light_gray_emissive.png.mcmeta | 8 -------- .../block/lamps/light_gray_off.png.mcmeta | 6 +++--- .../lamps/{light_gray.png => light_gray_on.png} | Bin .../textures/block/lamps/light_gray_on.png.mcmeta | 5 +++++ .../{light_gray_ctm.png => light_gray_on_ctm.png} | Bin .../gtceu/textures/block/lamps/lime.png.mcmeta | 5 ----- .../lamps/{lime_emissive.png => lime_bloom.png} | Bin .../textures/block/lamps/lime_bloom.png.mcmeta | 8 ++++++++ .../{lime_ctm_emissive.png => lime_bloom_ctm.png} | Bin .../block/lamps/lime_bloom_ctm.png.mcmeta | 5 +++++ ...e_borderless.png => lime_borderless_bloom.png} | Bin .../block/lamps/lime_borderless_bloom.png.mcmeta | 5 +++++ .../textures/block/lamps/lime_borderless_on.png | Bin 0 -> 189 bytes .../textures/block/lamps/lime_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/lime_off.png.mcmeta | 6 +++--- .../block/lamps/{lime.png => lime_on.png} | Bin .../gtceu/textures/block/lamps/lime_on.png.mcmeta | 5 +++++ .../block/lamps/{lime_ctm.png => lime_on_ctm.png} | Bin .../gtceu/textures/block/lamps/magenta.png.mcmeta | 5 ----- .../{magenta_emissive.png => magenta_bloom.png} | Bin .../textures/block/lamps/magenta_bloom.png.mcmeta | 8 ++++++++ ...nta_ctm_emissive.png => magenta_bloom_ctm.png} | Bin .../block/lamps/magenta_bloom_ctm.png.mcmeta | 5 +++++ ...orderless.png => magenta_borderless_bloom.png} | Bin .../lamps/magenta_borderless_bloom.png.mcmeta | 5 +++++ .../block/lamps/magenta_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/magenta_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/magenta_off.png.mcmeta | 6 +++--- .../block/lamps/{magenta.png => magenta_on.png} | Bin .../textures/block/lamps/magenta_on.png.mcmeta | 5 +++++ .../lamps/{magenta_ctm.png => magenta_on_ctm.png} | Bin .../gtceu/textures/block/lamps/orange.png.mcmeta | 5 ----- .../{orange_emissive.png => orange_bloom.png} | Bin .../textures/block/lamps/orange_bloom.png.mcmeta | 8 ++++++++ ...ange_ctm_emissive.png => orange_bloom_ctm.png} | Bin .../block/lamps/orange_bloom_ctm.png.mcmeta | 5 +++++ .../block/lamps/orange_borderless_bloom.png | Bin 0 -> 189 bytes .../lamps/orange_borderless_bloom.png.mcmeta | 5 +++++ ...ge_borderless.png => orange_borderless_on.png} | Bin .../block/lamps/orange_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/orange_off.png.mcmeta | 6 +++--- .../block/lamps/{orange.png => orange_on.png} | Bin .../textures/block/lamps/orange_on.png.mcmeta | 5 +++++ .../lamps/{orange_ctm.png => orange_on_ctm.png} | Bin .../gtceu/textures/block/lamps/pink.png.mcmeta | 5 ----- .../lamps/{pink_emissive.png => pink_bloom.png} | Bin .../textures/block/lamps/pink_bloom.png.mcmeta | 8 ++++++++ .../{pink_ctm_emissive.png => pink_bloom_ctm.png} | Bin .../block/lamps/pink_bloom_ctm.png.mcmeta | 5 +++++ ...k_borderless.png => pink_borderless_bloom.png} | Bin .../block/lamps/pink_borderless_bloom.png.mcmeta | 5 +++++ .../textures/block/lamps/pink_borderless_on.png | Bin 0 -> 189 bytes .../textures/block/lamps/pink_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/pink_off.png.mcmeta | 6 +++--- .../block/lamps/{pink.png => pink_on.png} | Bin .../gtceu/textures/block/lamps/pink_on.png.mcmeta | 5 +++++ .../block/lamps/{pink_ctm.png => pink_on_ctm.png} | Bin .../gtceu/textures/block/lamps/purple.png.mcmeta | 5 ----- .../{purple_emissive.png => purple_bloom.png} | Bin .../textures/block/lamps/purple_bloom.png.mcmeta | 8 ++++++++ ...rple_ctm_emissive.png => purple_bloom_ctm.png} | Bin .../block/lamps/purple_bloom_ctm.png.mcmeta | 5 +++++ ...borderless.png => purple_borderless_bloom.png} | Bin .../lamps/purple_borderless_bloom.png.mcmeta | 5 +++++ .../textures/block/lamps/purple_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/purple_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/purple_off.png.mcmeta | 6 +++--- .../block/lamps/{purple.png => purple_on.png} | Bin .../textures/block/lamps/purple_on.png.mcmeta | 5 +++++ .../lamps/{purple_ctm.png => purple_on_ctm.png} | Bin .../gtceu/textures/block/lamps/red.png.mcmeta | 5 ----- .../lamps/{red_emissive.png => red_bloom.png} | Bin .../textures/block/lamps/red_bloom.png.mcmeta | 8 ++++++++ .../{red_ctm_emissive.png => red_bloom_ctm.png} | Bin .../textures/block/lamps/red_bloom_ctm.png.mcmeta | 5 +++++ ...ed_borderless.png => red_borderless_bloom.png} | Bin .../block/lamps/red_borderless_bloom.png.mcmeta | 5 +++++ .../textures/block/lamps/red_borderless_on.png | Bin 0 -> 189 bytes .../textures/block/lamps/red_emissive.png.mcmeta | 8 -------- .../gtceu/textures/block/lamps/red_off.png.mcmeta | 6 +++--- .../textures/block/lamps/{red.png => red_on.png} | Bin .../gtceu/textures/block/lamps/red_on.png.mcmeta | 5 +++++ .../block/lamps/{red_ctm.png => red_on_ctm.png} | Bin .../gtceu/textures/block/lamps/white.png.mcmeta | 5 ----- .../lamps/{white_emissive.png => white_bloom.png} | Bin .../textures/block/lamps/white_bloom.png.mcmeta | 8 ++++++++ ...white_ctm_emissive.png => white_bloom_ctm.png} | Bin .../block/lamps/white_bloom_ctm.png.mcmeta | 5 +++++ ..._borderless.png => white_borderless_bloom.png} | Bin .../block/lamps/white_borderless_bloom.png.mcmeta | 5 +++++ .../textures/block/lamps/white_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/white_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/white_off.png.mcmeta | 6 +++--- .../block/lamps/{white.png => white_on.png} | Bin .../textures/block/lamps/white_on.png.mcmeta | 5 +++++ .../lamps/{white_ctm.png => white_on_ctm.png} | Bin .../gtceu/textures/block/lamps/yellow.png.mcmeta | 5 ----- .../{yellow_emissive.png => yellow_bloom.png} | Bin .../textures/block/lamps/yellow_bloom.png.mcmeta | 8 ++++++++ ...llow_ctm_emissive.png => yellow_bloom_ctm.png} | Bin .../block/lamps/yellow_bloom_ctm.png.mcmeta | 5 +++++ ...borderless.png => yellow_borderless_bloom.png} | Bin .../lamps/yellow_borderless_bloom.png.mcmeta | 5 +++++ .../textures/block/lamps/yellow_borderless_on.png | Bin 0 -> 189 bytes .../block/lamps/yellow_emissive.png.mcmeta | 8 -------- .../textures/block/lamps/yellow_off.png.mcmeta | 6 +++--- .../block/lamps/{yellow.png => yellow_on.png} | Bin .../textures/block/lamps/yellow_on.png.mcmeta | 5 +++++ .../lamps/{yellow_ctm.png => yellow_on_ctm.png} | Bin 205 files changed, 338 insertions(+), 258 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{black_emissive.png => black_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{black_ctm_emissive.png => black_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{black_ctm_emissive.png.mcmeta => black_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{black_borderless.png => black_borderless_bloom.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{blue_ctm_emissive.png.mcmeta => black_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{black.png => black_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{black_ctm.png => black_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{blue_emissive.png => blue_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{blue_ctm_emissive.png => blue_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{brown_ctm_emissive.png.mcmeta => blue_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{cyan_ctm_emissive.png.mcmeta => blue_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{blue.png => blue_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{blue_ctm.png => blue_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{brown_emissive.png => brown_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{brown_ctm_emissive.png => brown_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{gray_ctm_emissive.png.mcmeta => brown_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{green_ctm_emissive.png.mcmeta => brown_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{brown.png => brown_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{brown_ctm.png => brown_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{cyan_emissive.png => cyan_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{cyan_ctm_emissive.png => cyan_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{light_blue_ctm_emissive.png.mcmeta => cyan_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{light_gray_ctm_emissive.png.mcmeta => cyan_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{cyan.png => cyan_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{cyan_ctm.png => cyan_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{gray_emissive.png => gray_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{gray_ctm_emissive.png => gray_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{lime_ctm_emissive.png.mcmeta => gray_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{gray_borderless.png => gray_borderless_bloom.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{magenta_ctm_emissive.png.mcmeta => gray_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{gray.png => gray_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{gray_ctm.png => gray_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{green_emissive.png => green_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{green_ctm_emissive.png => green_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{orange_ctm_emissive.png.mcmeta => green_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{green_borderless.png => green_borderless_bloom.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{pink_ctm_emissive.png.mcmeta => green_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{green.png => green_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{green_ctm.png => green_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_blue_emissive.png => light_blue_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_blue_ctm_emissive.png => light_blue_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{purple_ctm_emissive.png.mcmeta => light_blue_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{light_blue_borderless.png => light_blue_borderless_bloom.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{red_ctm_emissive.png.mcmeta => light_blue_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_blue.png => light_blue_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_blue_ctm.png => light_blue_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_gray_emissive.png => light_gray_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_gray_ctm_emissive.png => light_gray_bloom_ctm.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{white_ctm_emissive.png.mcmeta => light_gray_bloom_ctm.png.mcmeta} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{light_gray_borderless.png => light_gray_borderless_bloom.png} (100%) rename src/main/resources/assets/gtceu/textures/block/lamps/{yellow_ctm_emissive.png.mcmeta => light_gray_borderless_bloom.png.mcmeta} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_gray.png => light_gray_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{light_gray_ctm.png => light_gray_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{lime_emissive.png => lime_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{lime_ctm_emissive.png => lime_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_bloom_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{lime_borderless.png => lime_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{lime.png => lime_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{lime_ctm.png => lime_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{magenta_emissive.png => magenta_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{magenta_ctm_emissive.png => magenta_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{magenta_borderless.png => magenta_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{magenta.png => magenta_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{magenta_ctm.png => magenta_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{orange_emissive.png => orange_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{orange_ctm_emissive.png => orange_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_bloom.png create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{orange_borderless.png => orange_borderless_on.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{orange.png => orange_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{orange_ctm.png => orange_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{pink_emissive.png => pink_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{pink_ctm_emissive.png => pink_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{pink_borderless.png => pink_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{pink.png => pink_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{pink_ctm.png => pink_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{purple_emissive.png => purple_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{purple_ctm_emissive.png => purple_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{purple_borderless.png => purple_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{purple.png => purple_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{purple_ctm.png => purple_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{red_emissive.png => red_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{red_ctm_emissive.png => red_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_bloom_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{red_borderless.png => red_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{red.png => red_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{red_ctm.png => red_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{white_emissive.png => white_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{white_ctm_emissive.png => white_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_bloom_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{white_borderless.png => white_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{white.png => white_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{white_ctm.png => white_on_ctm.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{yellow_emissive.png => yellow_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{yellow_ctm_emissive.png => yellow_bloom_ctm.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{yellow_borderless.png => yellow_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_bloom.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_on.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{yellow.png => yellow_on.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{yellow_ctm.png => yellow_on_ctm.png} (100%) diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta deleted file mode 100644 index 8f14d9b9cb1..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/black_ctm" - } -} - diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/black_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_bloom.png.mcmeta new file mode 100644 index 00000000000..ff453012c57 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_bloom.png.mcmeta @@ -0,0 +1,9 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/black_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} + diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/black_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/black_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/black_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/black_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e244fd2adef6d4b32c5b18ada674975e7ba8888b GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFE>PwAqJGDD$tGthqt)7XJ~}C~C~`D!5EOF~_{H4fRG~EQ c|L2Dcr{}XJriL!d1{%cR>FVdQ&MBb@0OEZ(G5`Po literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta deleted file mode 100644 index 986fc3c4b9b..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_emissive.png.mcmeta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/black_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} - diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta index 077f1b444bc..28943d615fd 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/black_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/black_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/black.png rename to src/main/resources/assets/gtceu/textures/block/lamps/black_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta new file mode 100644 index 00000000000..e72a3217be3 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta @@ -0,0 +1,6 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/black_on_ctm" + } +} + diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/black_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/black_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/black_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta deleted file mode 100644 index b2d32fbdde0..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/blue_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom.png.mcmeta new file mode 100644 index 00000000000..313de4456f9 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/blue_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c80de65b7b832cfdccb7491164de1d81f4478e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF7ABoGO&& d{r~)s;q-jA#MIDb*+7FBJYD@<);T3K0RR|_I`;qo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta deleted file mode 100644 index 6c7c62e8adb..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/blue_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta index 6692caee337..e6c3f4b96e9 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/blue_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/blue_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/blue.png rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta new file mode 100644 index 00000000000..79a2198d59b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/blue_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/blue_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta deleted file mode 100644 index 10bc639e0fc..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/brown_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom.png.mcmeta new file mode 100644 index 00000000000..5db8b403bd9 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/brown_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..30bdb8600dd37720bb2d2f41a52e1b2a69149e94 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFzopr0N=4XZ~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta deleted file mode 100644 index 5716c714030..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/brown_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta index f222ed9e8ac..8115cf5c3cb 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/brown_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/brown_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/brown.png rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta new file mode 100644 index 00000000000..ee6259838ef --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/brown_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/brown_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta deleted file mode 100644 index c0f13e9c0bf..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/cyan_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom.png.mcmeta new file mode 100644 index 00000000000..65522bdc8fb --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/cyan_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..743480a2a9f20b4007a93a67f1c2cc2cecbe84a3 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8wACi1b#8MI8`Xk d`~UeN!|C~KiK(H>vVjIMc)I$ztaD0e0s!6SI&1&{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta deleted file mode 100644 index b1725e83fa5..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/cyan_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta index 0e6b73d84f3..edcb44542fe 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/cyan_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/cyan_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/cyan.png rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta new file mode 100644 index 00000000000..6483ae26412 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/cyan_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/cyan_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta deleted file mode 100644 index 4cc28d73d35..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/gray_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom.png.mcmeta new file mode 100644 index 00000000000..ce76a054ea7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/gray_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0c168be730d95aabe86a7a824c068a82b39fb9 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFE>PwAqJGDD$tGthqt)7XJ~}C~C~`D!5EOF~_{H4fRG~EQ c|L2Dcr{}XJriL!d1{%cR>FVdQ&MBb@0I)AP{Qv*} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta deleted file mode 100644 index c55ae8fc192..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/gray_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta index 1bf1376070e..3ec9391d805 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/gray_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/gray_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/gray.png rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta new file mode 100644 index 00000000000..d2f32855b00 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/gray_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/gray_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/gray_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta deleted file mode 100644 index 8c0cb78a3db..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/green_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/green_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_bloom.png.mcmeta new file mode 100644 index 00000000000..38fe7740e76 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/green_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/green_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/green_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/green_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..436ab101fa21cf9fc5d83a56b9b96e5137b75777 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1MG8>R*3-o?MB;Mj z*@L_X40sMZR572HR{708bAc+?7xg>NOEx)68Lig7^U+C>MUkU&F*S5qHqamjPgg&ebxsLQ09ZLWNdN!< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta deleted file mode 100644 index 61c740ca6c9..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/green_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta index 183ef8c6ac6..34ae9f7ae18 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/green_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/green_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/green.png rename to src/main/resources/assets/gtceu/textures/block/lamps/green_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta new file mode 100644 index 00000000000..65f635a9895 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/green_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/green_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/green_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/green_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta deleted file mode 100644 index 7be5820dc99..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/light_blue_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta new file mode 100644 index 00000000000..00958024c4a --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/light_blue_ctm_emissive" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..77244678a75fae833c0362ff5baaa628624673e0 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>77Jx2fl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta deleted file mode 100644 index 3c37363340e..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/light_blue_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta index 36da8684b59..4bcde263e5f 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/light_blue_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/light_blue_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_blue.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta new file mode 100644 index 00000000000..42b7bded3b7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/light_blue_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_blue_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta deleted file mode 100644 index d9f02a1f1eb..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/light_gray_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_gray_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta new file mode 100644 index 00000000000..3b30d57e8c1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/light_gray_ctm_emissive" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_gray_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom_ctm.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_bloom.png.mcmeta similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png.mcmeta rename to src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_bloom.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..5e60a9410fef27a113f797c1ec17ecae0a1e06e1 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFGR d-v7@J8BWhzopr0DH7Kg8%>k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta deleted file mode 100644 index 2eddeede772..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/lime_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta index 3ece38171e2..52dfcbae47c 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/lime_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/lime_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime.png b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/lime.png rename to src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta new file mode 100644 index 00000000000..0f6f0a5c102 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/lime_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/lime_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/lime_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta deleted file mode 100644 index 8296eb3a51b..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/magenta_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom.png.mcmeta new file mode 100644 index 00000000000..b4e1d4d53b6 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/magenta_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom_ctm.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_bloom_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_bloom.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_bloom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..6864250af2651621960ebec4a0b2da5c70b39a1f GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^oGZtp3d^avza;1OBOz`%DHgc*{YDJdXeX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta deleted file mode 100644 index bbcbde7bc8b..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/magenta_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta index c5d19b0dac8..5809d1c23a4 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/magenta_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/magenta_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/magenta.png rename to src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta new file mode 100644 index 00000000000..d8075083a4c --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/magenta_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/magenta_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta deleted file mode 100644 index 53fdb4a15cd..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/orange_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom.png.mcmeta new file mode 100644 index 00000000000..eb9d61c06c6 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/orange_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom_ctm.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_bloom_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_bloom.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_bloom.png new file mode 100644 index 0000000000000000000000000000000000000000..11bed397b8ea8077ff6c45fe6b46ddd58e0f912c GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1MG8>R*3-o?MB;Mj z*@L_X40sMZR572HR{708bAc+?7xg>NOEx)68Lig7^U+C>MUkU&F*S5qHqamjPgg&ebxsLQ0I+g7@&Et; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_bloom.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_bloom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta deleted file mode 100644 index 6bd561037cd..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/orange_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta index 2d87bf7df39..eabf6bb2656 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/orange_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/orange_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/orange.png rename to src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta new file mode 100644 index 00000000000..516a9b648c9 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/orange_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/orange_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/orange_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta deleted file mode 100644 index 37808e80592..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/pink_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom.png.mcmeta new file mode 100644 index 00000000000..29c10bfe24d --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/pink_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom_ctm.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_bloom_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_bloom.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_bloom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..92802ad8825519a91097d63eb761797d60008bfc GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFlBSEK+1Z9QEaLnJPT zo;}EWz<}qlLlyIBX_epnGZ(0GeNn&TykwKJl+kMKJ0G1CSrj>%HwcP33H)MiajH<7 d_y6-lhST%e5>rE$WdjXj@O1TaS?83{1OT0MJP7~* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta deleted file mode 100644 index 8ca9c17de14..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/pink_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta index 7894d02278d..ce444d36c89 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/pink_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/pink_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/pink.png rename to src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta new file mode 100644 index 00000000000..9ac68a15fc5 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/pink_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/pink_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/pink_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta deleted file mode 100644 index 121eed221ea..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/purple_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom.png.mcmeta new file mode 100644 index 00000000000..942e844eaa7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/purple_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom_ctm.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_bloom_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_bloom.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_bloom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..87fec534a79297de6623da3201ee4d220d81f30e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_U;w|SYL`GEurJR*x382Ao@Fyrz36)8YLTTd6q5Q)p7 zXAkloFyJ}tP{n*&TIDzY%mu1kU)1k7FWKZQWwcuR&POLj7DbNc4T54$0>7ABoGO&& d{r~)s;q-jA#MIDb*+7FBJYD@<);T3K0RZ7#I%WU> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta deleted file mode 100644 index 8c82cc421b1..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/purple_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta index e912715ff62..067da7a4996 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/purple_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/purple_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/purple.png rename to src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta new file mode 100644 index 00000000000..28d7bf0b948 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/purple_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/purple_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/purple_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta deleted file mode 100644 index b0bef295adf..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/red_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/red_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom.png.mcmeta new file mode 100644 index 00000000000..70de0198151 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/red_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/red_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/red_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom_ctm.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_bloom_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/red_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_bloom.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_bloom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..88aa73ca7a2ee8376e66ea3631c4a2d53af11f47 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1MG8>R*3-o?MB;Mj z*@L_X40sMZR572HR{708bAc+?7xg>NOEx)68Lig7^U+C>MUkU&F*S5qHqamjPgg&ebxsLQ05)wn;{X5v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta deleted file mode 100644 index 71f134efd0c..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/red_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta index d9f98de71da..be15cc2a979 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/red_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/red_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/red.png rename to src/main/resources/assets/gtceu/textures/block/lamps/red_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta new file mode 100644 index 00000000000..4680e682514 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/red_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/red_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/red_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/red_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta deleted file mode 100644 index d21e74fd68e..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/white_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/white_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom.png.mcmeta new file mode 100644 index 00000000000..8a579d67dd6 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/white_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/white_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/white_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom_ctm.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_bloom_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/white_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_bloom.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_bloom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..1efa7b0104965ba75f617611cf3e7c581292c805 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF^UZJ^TOw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta deleted file mode 100644 index 5b460863ca0..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/white_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta index 8defbca3800..2c90d5cde00 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/white_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/white_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/white.png rename to src/main/resources/assets/gtceu/textures/block/lamps/white_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta new file mode 100644 index 00000000000..f3975e3b071 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/white_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/white_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/white_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/white_on_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta deleted file mode 100644 index 92cd97707cd..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png.mcmeta +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/yellow_ctm" - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom.png.mcmeta new file mode 100644 index 00000000000..99638cdc659 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/yellow_bloom_ctm" + }, + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm_emissive.png rename to src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom_ctm.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom_ctm.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_bloom_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_bloom.png.mcmeta new file mode 100644 index 00000000000..4da3f5f1299 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_bloom.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_on.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_on.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2fd67dc41a4ef5c32da6593c0b394cfcca96da GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF{70JbC~C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta deleted file mode 100644 index 4e0110c9e7c..00000000000 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_emissive.png.mcmeta +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ldlib": { - "connection": "gtceu:block/lamps/yellow_ctm_emissive" - }, - "shimmer": { - "bloom": true - } -} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta index 160ab566143..d582a53eb12 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_off.png.mcmeta @@ -1,5 +1,5 @@ { - "ldlib": { - "connection": "gtceu:block/lamps/yellow_off_ctm" - } + "ldlib": { + "connection": "gtceu:block/lamps/yellow_off_ctm" + } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/yellow.png rename to src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta new file mode 100644 index 00000000000..782d3bf17a3 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/lamps/yellow_on_ctm" + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm.png b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on_ctm.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/yellow_ctm.png rename to src/main/resources/assets/gtceu/textures/block/lamps/yellow_on_ctm.png From 20a521b6a2e4af036de484705ca62209a2c7e97e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:18:17 +0300 Subject: [PATCH 202/269] Explicitly disable bloom on non-emissive active textures --- .../block/lamps/black_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/black_on.png.mcmeta | 4 +++- .../textures/block/lamps/black_on_ctm.png.mcmeta | 5 +++++ ...lue_borderless.png => blue_borderless_bloom.png} | Bin .../block/lamps/blue_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/blue_on.png.mcmeta | 3 +++ .../textures/block/lamps/blue_on_ctm.png.mcmeta | 5 +++++ ...wn_borderless.png => brown_borderless_bloom.png} | Bin .../block/lamps/brown_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/brown_on.png.mcmeta | 3 +++ .../textures/block/lamps/brown_on_ctm.png.mcmeta | 5 +++++ ...yan_borderless.png => cyan_borderless_bloom.png} | Bin .../block/lamps/cyan_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/cyan_on.png.mcmeta | 3 +++ .../textures/block/lamps/cyan_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/gray_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/gray_on.png.mcmeta | 3 +++ .../textures/block/lamps/gray_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/green_borderless_on.png.mcmeta | 5 +++++ .../textures/block/lamps/green_ctm_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/green_on.png.mcmeta | 3 +++ .../block/lamps/light_blue_borderless_on.png.mcmeta | 5 +++++ .../textures/block/lamps/light_blue_on.png.mcmeta | 3 +++ .../block/lamps/light_blue_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/light_gray_borderless_on.png.mcmeta | 5 +++++ .../textures/block/lamps/light_gray_on.png.mcmeta | 3 +++ .../block/lamps/light_gray_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/lime_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/lime_on.png.mcmeta | 3 +++ .../textures/block/lamps/lime_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/magenta_borderless_on.png.mcmeta | 5 +++++ .../textures/block/lamps/magenta_ctm.png.mcmeta | 5 +++++ .../textures/block/lamps/magenta_on.png.mcmeta | 3 +++ .../block/lamps/orange_borderless_on.png.mcmeta | 5 +++++ .../textures/block/lamps/orange_ctm_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/orange_on.png.mcmeta | 3 +++ .../block/lamps/pink_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/pink_on.png.mcmeta | 3 +++ .../textures/block/lamps/pink_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/purple_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/purple_on.png.mcmeta | 3 +++ .../textures/block/lamps/purple_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/red_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/red_on.png.mcmeta | 3 +++ .../textures/block/lamps/red_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/white_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/white_on.png.mcmeta | 3 +++ .../textures/block/lamps/white_on_ctm.png.mcmeta | 5 +++++ .../block/lamps/yellow_borderless_on.png.mcmeta | 5 +++++ .../gtceu/textures/block/lamps/yellow_on.png.mcmeta | 3 +++ .../textures/block/lamps/yellow_on_ctm.png.mcmeta | 5 +++++ 51 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/black_on_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{blue_borderless.png => blue_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/blue_on_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{brown_borderless.png => brown_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/brown_on_ctm.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/lamps/{cyan_borderless.png => cyan_borderless_bloom.png} (100%) create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/cyan_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/gray_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/lime_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/pink_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/purple_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/red_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/white_on_ctm.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_on.png.mcmeta create mode 100644 src/main/resources/assets/gtceu/textures/block/lamps/yellow_on_ctm.png.mcmeta diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta index e72a3217be3..5c13fcde49a 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_on.png.mcmeta @@ -1,6 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/black_on_ctm" + }, + "shimmer": { + "bloom": false } } - diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/black_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/black_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/black_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta index 79a2198d59b..116a33b1c75 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/blue_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/blue_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/blue_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta index ee6259838ef..16ca1f1305f 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/brown_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/brown_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/brown_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless.png b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_bloom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless.png rename to src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_bloom.png diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta index 6483ae26412..1e35d272972 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/cyan_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/cyan_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta index d2f32855b00..cbc26838129 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/gray_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/gray_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/gray_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta new file mode 100644 index 00000000000..95ef0aa75d1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +w{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_ctm_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta index 65f635a9895..6074941a516 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/green_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta index 42b7bded3b7..dafb5e4a108 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/light_blue_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta index 03713929f54..3761d1c9e64 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/light_gray_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta index 0f6f0a5c102..41bab1624eb 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/lime_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/lime_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/lime_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta index d8075083a4c..0278b6ccc48 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/magenta_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/magenta_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_ctm_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta index 516a9b648c9..17eea4ce1ed 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/orange_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/orange_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta index 9ac68a15fc5..cf9b95eb37d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/pink_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/pink_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/pink_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta index 28d7bf0b948..e2f7fcfda8a 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/purple_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/purple_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/purple_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta index 4680e682514..bb34744e74d 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/red_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/red_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/red_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/red_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta index f3975e3b071..9c7a3a147a8 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/white_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/white_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/white_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/white_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_on.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_borderless_on.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta index 782d3bf17a3..ebf371f8d42 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on.png.mcmeta @@ -1,5 +1,8 @@ { "ldlib": { "connection": "gtceu:block/lamps/yellow_on_ctm" + }, + "shimmer": { + "bloom": false } } diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on_ctm.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on_ctm.png.mcmeta new file mode 100644 index 00000000000..4662e246aa1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/lamps/yellow_on_ctm.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": false + } +} From e93774869a09953e4c04905ac566f8c3cd631cd6 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:19:21 +0300 Subject: [PATCH 203/269] Actually commit the item model loader thing :ICANT: --- .../models/item/black_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/black_lamp.json | 3 +- .../models/item/blue_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/blue_lamp.json | 3 +- .../models/item/brown_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/brown_lamp.json | 3 +- .../models/item/cyan_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/cyan_lamp.json | 3 +- .../models/item/gray_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/gray_lamp.json | 3 +- .../models/item/green_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/green_lamp.json | 3 +- .../item/light_blue_borderless_lamp.json | 3 +- .../gtceu/models/item/light_blue_lamp.json | 3 +- .../item/light_gray_borderless_lamp.json | 3 +- .../gtceu/models/item/light_gray_lamp.json | 3 +- .../models/item/lime_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/lime_lamp.json | 3 +- .../models/item/magenta_borderless_lamp.json | 3 +- .../gtceu/models/item/magenta_lamp.json | 3 +- .../models/item/orange_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/orange_lamp.json | 3 +- .../models/item/pink_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/pink_lamp.json | 3 +- .../models/item/purple_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/purple_lamp.json | 3 +- .../models/item/red_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/red_lamp.json | 3 +- .../models/item/white_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/white_lamp.json | 3 +- .../models/item/yellow_borderless_lamp.json | 3 +- .../assets/gtceu/models/item/yellow_lamp.json | 3 +- .../gregtechceu/gtceu/client/ClientProxy.java | 2 + .../item/CustomItemRendererWrapperModel.java | 118 ++++++++++++++++++ .../gtceu/common/item/LampBlockItem.java | 33 ----- 35 files changed, 184 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java diff --git a/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json index ed0af019e1a..6687667af09 100644 --- a/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/black_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/black_borderless_lamp_on" + "parent": "gtceu:block/black_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/black_lamp.json b/src/generated/resources/assets/gtceu/models/item/black_lamp.json index f8acb4b6c58..e62b6eb1a31 100644 --- a/src/generated/resources/assets/gtceu/models/item/black_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/black_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/black_lamp_on" + "parent": "gtceu:block/black_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json index 6e499dd5755..6be5450c479 100644 --- a/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/blue_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/blue_borderless_lamp_on" + "parent": "gtceu:block/blue_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/blue_lamp.json b/src/generated/resources/assets/gtceu/models/item/blue_lamp.json index 16b2ee53614..de1c8120ab8 100644 --- a/src/generated/resources/assets/gtceu/models/item/blue_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/blue_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/blue_lamp_on" + "parent": "gtceu:block/blue_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json index c2d4ad2049a..9589e825df6 100644 --- a/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/brown_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/brown_borderless_lamp_on" + "parent": "gtceu:block/brown_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/brown_lamp.json b/src/generated/resources/assets/gtceu/models/item/brown_lamp.json index ad3b6275060..39a84542a71 100644 --- a/src/generated/resources/assets/gtceu/models/item/brown_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/brown_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/brown_lamp_on" + "parent": "gtceu:block/brown_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json index d5c0a34f9bc..d2b34bc59bb 100644 --- a/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/cyan_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/cyan_borderless_lamp_on" + "parent": "gtceu:block/cyan_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json b/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json index 2f5b03f59d1..bc6c0567f96 100644 --- a/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/cyan_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/cyan_lamp_on" + "parent": "gtceu:block/cyan_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json index 07abe6d60cd..7da9421fe50 100644 --- a/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/gray_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/gray_borderless_lamp_on" + "parent": "gtceu:block/gray_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/gray_lamp.json b/src/generated/resources/assets/gtceu/models/item/gray_lamp.json index 6bcd8b968b0..5cf076a9278 100644 --- a/src/generated/resources/assets/gtceu/models/item/gray_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/gray_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/gray_lamp_on" + "parent": "gtceu:block/gray_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json index 8cf44bd24c4..c7ed6dd65d4 100644 --- a/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/green_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/green_borderless_lamp_on" + "parent": "gtceu:block/green_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/green_lamp.json b/src/generated/resources/assets/gtceu/models/item/green_lamp.json index 52f0520f0c5..fc4daaf5844 100644 --- a/src/generated/resources/assets/gtceu/models/item/green_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/green_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/green_lamp_on" + "parent": "gtceu:block/green_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json index c3f886d6a75..33f49789bb0 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_blue_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/light_blue_borderless_lamp_on" + "parent": "gtceu:block/light_blue_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json index 62046034a02..7449e1518bc 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_blue_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/light_blue_lamp_on" + "parent": "gtceu:block/light_blue_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json index 531884b2914..fa560db1c71 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_gray_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/light_gray_borderless_lamp_on" + "parent": "gtceu:block/light_gray_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json b/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json index 163222af84d..fe36c479756 100644 --- a/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/light_gray_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/light_gray_lamp_on" + "parent": "gtceu:block/light_gray_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json index 5030d4a6508..e43bd72af35 100644 --- a/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/lime_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/lime_borderless_lamp_on" + "parent": "gtceu:block/lime_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/lime_lamp.json b/src/generated/resources/assets/gtceu/models/item/lime_lamp.json index 6075dceafbd..093378d1532 100644 --- a/src/generated/resources/assets/gtceu/models/item/lime_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/lime_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/lime_lamp_on" + "parent": "gtceu:block/lime_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json index 09df14bd560..670775f1bff 100644 --- a/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/magenta_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/magenta_borderless_lamp_on" + "parent": "gtceu:block/magenta_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json b/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json index 1f6f3693bab..ee1ec757f48 100644 --- a/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/magenta_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/magenta_lamp_on" + "parent": "gtceu:block/magenta_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json index fbab08b7da6..1426608173e 100644 --- a/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/orange_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/orange_borderless_lamp_on" + "parent": "gtceu:block/orange_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/orange_lamp.json b/src/generated/resources/assets/gtceu/models/item/orange_lamp.json index 55faf24052a..41f72caa2fb 100644 --- a/src/generated/resources/assets/gtceu/models/item/orange_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/orange_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/orange_lamp_on" + "parent": "gtceu:block/orange_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json index 4c8ec0c54a6..9fd2fdd0db0 100644 --- a/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/pink_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/pink_borderless_lamp_on" + "parent": "gtceu:block/pink_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/pink_lamp.json b/src/generated/resources/assets/gtceu/models/item/pink_lamp.json index dc4d410039f..9fa2bff4a21 100644 --- a/src/generated/resources/assets/gtceu/models/item/pink_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/pink_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/pink_lamp_on" + "parent": "gtceu:block/pink_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json index b2cde70d299..40c5aeaa976 100644 --- a/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/purple_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/purple_borderless_lamp_on" + "parent": "gtceu:block/purple_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/purple_lamp.json b/src/generated/resources/assets/gtceu/models/item/purple_lamp.json index 83eaa30a9b4..a8b2562ec7e 100644 --- a/src/generated/resources/assets/gtceu/models/item/purple_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/purple_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/purple_lamp_on" + "parent": "gtceu:block/purple_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json index b59947db0e7..7bf485233f0 100644 --- a/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/red_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/red_borderless_lamp_on" + "parent": "gtceu:block/red_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/red_lamp.json b/src/generated/resources/assets/gtceu/models/item/red_lamp.json index b1a7a1ee344..7555f5f86a3 100644 --- a/src/generated/resources/assets/gtceu/models/item/red_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/red_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/red_lamp_on" + "parent": "gtceu:block/red_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json index f094edd1151..aaf55615fda 100644 --- a/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/white_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/white_borderless_lamp_on" + "parent": "gtceu:block/white_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/white_lamp.json b/src/generated/resources/assets/gtceu/models/item/white_lamp.json index bbc74c7fbad..b6319a67503 100644 --- a/src/generated/resources/assets/gtceu/models/item/white_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/white_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/white_lamp_on" + "parent": "gtceu:block/white_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json b/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json index fb25ba2c181..4bd3f95fbf8 100644 --- a/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/yellow_borderless_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/yellow_borderless_lamp_on" + "parent": "gtceu:block/yellow_borderless_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json b/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json index a24eeb91199..3062cae0d56 100644 --- a/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json +++ b/src/generated/resources/assets/gtceu/models/item/yellow_lamp.json @@ -1,3 +1,4 @@ { - "parent": "gtceu:block/yellow_lamp_on" + "parent": "gtceu:block/yellow_lamp_on", + "loader": "gtceu:custom_item_renderer_wrapper" } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 9a0574d59a7..295ff1fea16 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; +import com.gregtechceu.gtceu.client.model.item.CustomItemRendererWrapperModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; @@ -175,6 +176,7 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register(MachineModelLoader.ID.getPath(), MachineModelLoader.INSTANCE); event.register(PipeModelLoader.ID.getPath(), PipeModelLoader.INSTANCE); event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); + event.register(CustomItemRendererWrapperModel.TYPE_ID.getPath(), CustomItemRendererWrapperModel.Loader.INSTANCE); } @SubscribeEvent(priority = EventPriority.HIGHEST) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java new file mode 100644 index 00000000000..1a703b59dae --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java @@ -0,0 +1,118 @@ +package com.gregtechceu.gtceu.client.model.item; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelState; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.client.model.BakedModelWrapper; +import net.minecraftforge.client.model.generators.CustomLoaderBuilder; +import net.minecraftforge.client.model.generators.ModelBuilder; +import net.minecraftforge.client.model.geometry.*; +import net.minecraftforge.common.data.ExistingFileHelper; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +/** + * Custom model type that simply overrides {@link BakedModel#isCustomRenderer()} to always return true so + * {@link IClientItemExtensions#getCustomRenderer()} can work. Does nothing on blocks. + * + *

+ * Use it on an item model builder like this: + *

{@code
+ *      prov.getBuilder(ctx.getId())
+ *              .customLoader(CustomItemRendererModel.Builder::begin).end()
+ *              // ...
+ * }
+ */ +public class CustomItemRendererWrapperModel implements IUnbakedGeometry { + + public static final ResourceLocation TYPE_ID = GTCEu.id("custom_item_renderer_wrapper"); + + private final BlockModel parent; + + public CustomItemRendererWrapperModel(BlockModel parent) { + this.parent = parent; + } + + @Override + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, + Function spriteGetter, ModelState modelState, + ItemOverrides overrides, ResourceLocation modelLocation) { + BlockModel owner = parent; + if (context instanceof BlockGeometryBakingContext blockContext) owner = blockContext.owner; + + BakedModel originalModel = parent.bake(baker, owner, spriteGetter, modelState, modelLocation, context.isGui3d()); + return new Baked(originalModel); + } + + public static final class Baked extends BakedModelWrapper { + + public Baked(BakedModel originalModel) { + super(originalModel); + } + + @Override + public boolean isCustomRenderer() { + return true; + } + } + + public static final class Loader implements IGeometryLoader { + + public static final CustomItemRendererWrapperModel.Loader INSTANCE = new CustomItemRendererWrapperModel.Loader(); +// private static final ThreadLocal currentlyParsing = new ThreadLocal<>(); + + private Loader() {} + + @Override + public @Nullable CustomItemRendererWrapperModel read(JsonObject json, JsonDeserializationContext context) throws JsonParseException { +// if (Boolean.TRUE.equals(currentlyParsing.get())) { +// // if this is called from the inner context.deserialize(...) invocation, return null so the vanilla +// // model is parsed instead +// return null; +// } +// try { +// currentlyParsing.set(Boolean.TRUE); +// + // remove the loader field and parse it again as a normal vanilla model + json.remove("loader"); + + return new CustomItemRendererWrapperModel(context.deserialize(json, BlockModel.class)); +// } finally { +// currentlyParsing.remove(); +// } + } + } + + /** + * Use this to add the model type to an item model generator, like this: + *
{@code
+     *      prov.withExistingParent(ctx::get, ctx.id())
+     *              .customLoader(CustomItemRendererModel.Builder::begin).end()
+     *              // ...
+     * }
+ */ + public static final class Builder> extends CustomLoaderBuilder { + + public Builder(T parent, ExistingFileHelper existingFileHelper) { + super(TYPE_ID, parent, existingFileHelper); + } + + public static > Builder begin(T parent, ExistingFileHelper existingFileHelper) { + return new Builder<>(parent, existingFileHelper); + } + + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java index 22fdb6e30f7..fd9ba7ea4c1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/LampBlockItem.java @@ -1,25 +1,17 @@ package com.gregtechceu.gtceu.common.item; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.renderer.block.LampItemRenderer; -import com.gregtechceu.gtceu.client.util.ModelUtils; import com.gregtechceu.gtceu.common.block.LampBlock; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.NonNullList; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.extensions.common.IClientItemExtensions; -import net.minecraftforge.client.model.BakedModelWrapper; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; @@ -35,10 +27,6 @@ public class LampBlockItem extends BlockItem { public LampBlockItem(LampBlock block, Properties properties) { super(block, properties); - - if (GTCEu.isClientSide()) { - ClientCallWrapper.registerEventListener(this); - } } @Override @@ -80,25 +68,4 @@ public BlockEntityWithoutLevelRenderer getCustomRenderer() { } }); } - - private static class ClientCallWrapper { - - private static void registerEventListener(LampBlockItem item) { - ModelUtils.registerBakeEventListener(false, event -> { - ResourceLocation model = BuiltInRegistries.ITEM.getKey(item).withPrefix("item/"); - BakedModel original = event.getModels().get(model); - if (original == null) { - model = new ModelResourceLocation(model, "inventory"); - original = event.getModels().get(model); - } - event.getModels().put(model, new BakedModelWrapper<>(original) { - - @Override - public boolean isCustomRenderer() { - return true; - } - }); - }); - } - } } From 5055eccf0f518bda27d54a77500c2d39c280b7b4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:27:33 +0300 Subject: [PATCH 204/269] Redo the block models based on the renamed textures --- .../blockstates/black_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/black_lamp.json | 14 +--- .../blockstates/blue_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/blue_lamp.json | 14 +--- .../blockstates/brown_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/brown_lamp.json | 14 +--- .../blockstates/cyan_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/cyan_lamp.json | 14 +--- .../blockstates/gray_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/gray_lamp.json | 14 +--- .../blockstates/green_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/green_lamp.json | 14 +--- .../light_blue_borderless_lamp.json | 14 +--- .../gtceu/blockstates/light_blue_lamp.json | 14 +--- .../light_gray_borderless_lamp.json | 14 +--- .../gtceu/blockstates/light_gray_lamp.json | 14 +--- .../blockstates/lime_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/lime_lamp.json | 14 +--- .../blockstates/magenta_borderless_lamp.json | 14 +--- .../gtceu/blockstates/magenta_lamp.json | 14 +--- .../blockstates/orange_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/orange_lamp.json | 14 +--- .../blockstates/pink_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/pink_lamp.json | 14 +--- .../blockstates/purple_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/purple_lamp.json | 14 +--- .../blockstates/red_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/red_lamp.json | 14 +--- .../blockstates/white_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/white_lamp.json | 14 +--- .../blockstates/yellow_borderless_lamp.json | 14 +--- .../assets/gtceu/blockstates/yellow_lamp.json | 14 +--- .../block/black_borderless_lamp_bloom.json | 4 +- .../block/black_borderless_lamp_off.json | 4 +- .../block/black_borderless_lamp_on.json | 4 +- .../gtceu/models/block/black_lamp_bloom.json | 6 +- .../gtceu/models/block/black_lamp_off.json | 4 +- .../gtceu/models/block/black_lamp_on.json | 4 +- .../block/blue_borderless_lamp_bloom.json | 4 +- .../block/blue_borderless_lamp_off.json | 4 +- .../models/block/blue_borderless_lamp_on.json | 4 +- .../gtceu/models/block/blue_lamp_bloom.json | 6 +- .../gtceu/models/block/blue_lamp_off.json | 4 +- .../gtceu/models/block/blue_lamp_on.json | 4 +- .../block/brown_borderless_lamp_bloom.json | 4 +- .../block/brown_borderless_lamp_off.json | 4 +- .../block/brown_borderless_lamp_on.json | 4 +- .../gtceu/models/block/brown_lamp_bloom.json | 6 +- .../gtceu/models/block/brown_lamp_off.json | 4 +- .../gtceu/models/block/brown_lamp_on.json | 4 +- .../block/cyan_borderless_lamp_bloom.json | 4 +- .../block/cyan_borderless_lamp_off.json | 4 +- .../models/block/cyan_borderless_lamp_on.json | 4 +- .../gtceu/models/block/cyan_lamp_bloom.json | 6 +- .../gtceu/models/block/cyan_lamp_off.json | 4 +- .../gtceu/models/block/cyan_lamp_on.json | 4 +- .../block/gray_borderless_lamp_bloom.json | 4 +- .../block/gray_borderless_lamp_off.json | 4 +- .../models/block/gray_borderless_lamp_on.json | 4 +- .../gtceu/models/block/gray_lamp_bloom.json | 6 +- .../gtceu/models/block/gray_lamp_off.json | 4 +- .../gtceu/models/block/gray_lamp_on.json | 4 +- .../block/green_borderless_lamp_bloom.json | 4 +- .../block/green_borderless_lamp_off.json | 4 +- .../block/green_borderless_lamp_on.json | 4 +- .../gtceu/models/block/green_lamp_bloom.json | 6 +- .../gtceu/models/block/green_lamp_off.json | 4 +- .../gtceu/models/block/green_lamp_on.json | 4 +- .../light_blue_borderless_lamp_bloom.json | 4 +- .../block/light_blue_borderless_lamp_off.json | 4 +- .../block/light_blue_borderless_lamp_on.json | 4 +- .../models/block/light_blue_lamp_bloom.json | 6 +- .../models/block/light_blue_lamp_off.json | 4 +- .../models/block/light_blue_lamp_on.json | 4 +- .../light_gray_borderless_lamp_bloom.json | 4 +- .../block/light_gray_borderless_lamp_off.json | 4 +- .../block/light_gray_borderless_lamp_on.json | 4 +- .../models/block/light_gray_lamp_bloom.json | 6 +- .../models/block/light_gray_lamp_off.json | 4 +- .../models/block/light_gray_lamp_on.json | 4 +- .../block/lime_borderless_lamp_bloom.json | 4 +- .../block/lime_borderless_lamp_off.json | 4 +- .../models/block/lime_borderless_lamp_on.json | 4 +- .../gtceu/models/block/lime_lamp_bloom.json | 6 +- .../gtceu/models/block/lime_lamp_off.json | 4 +- .../gtceu/models/block/lime_lamp_on.json | 4 +- .../block/magenta_borderless_lamp_bloom.json | 4 +- .../block/magenta_borderless_lamp_off.json | 4 +- .../block/magenta_borderless_lamp_on.json | 4 +- .../models/block/magenta_lamp_bloom.json | 6 +- .../gtceu/models/block/magenta_lamp_off.json | 4 +- .../gtceu/models/block/magenta_lamp_on.json | 4 +- .../block/orange_borderless_lamp_bloom.json | 4 +- .../block/orange_borderless_lamp_off.json | 4 +- .../block/orange_borderless_lamp_on.json | 4 +- .../gtceu/models/block/orange_lamp_bloom.json | 6 +- .../gtceu/models/block/orange_lamp_off.json | 4 +- .../gtceu/models/block/orange_lamp_on.json | 4 +- .../block/pink_borderless_lamp_bloom.json | 4 +- .../block/pink_borderless_lamp_off.json | 4 +- .../models/block/pink_borderless_lamp_on.json | 4 +- .../gtceu/models/block/pink_lamp_bloom.json | 6 +- .../gtceu/models/block/pink_lamp_off.json | 4 +- .../gtceu/models/block/pink_lamp_on.json | 4 +- .../block/purple_borderless_lamp_bloom.json | 4 +- .../block/purple_borderless_lamp_off.json | 4 +- .../block/purple_borderless_lamp_on.json | 4 +- .../gtceu/models/block/purple_lamp_bloom.json | 6 +- .../gtceu/models/block/purple_lamp_off.json | 4 +- .../gtceu/models/block/purple_lamp_on.json | 4 +- .../block/red_borderless_lamp_bloom.json | 4 +- .../models/block/red_borderless_lamp_off.json | 4 +- .../models/block/red_borderless_lamp_on.json | 4 +- .../gtceu/models/block/red_lamp_bloom.json | 6 +- .../gtceu/models/block/red_lamp_off.json | 4 +- .../gtceu/models/block/red_lamp_on.json | 4 +- .../block/white_borderless_lamp_bloom.json | 4 +- .../block/white_borderless_lamp_off.json | 4 +- .../block/white_borderless_lamp_on.json | 4 +- .../gtceu/models/block/white_lamp_bloom.json | 6 +- .../gtceu/models/block/white_lamp_off.json | 4 +- .../gtceu/models/block/white_lamp_on.json | 4 +- .../block/yellow_borderless_lamp_bloom.json | 4 +- .../block/yellow_borderless_lamp_off.json | 4 +- .../block/yellow_borderless_lamp_on.json | 4 +- .../gtceu/models/block/yellow_lamp_bloom.json | 6 +- .../gtceu/models/block/yellow_lamp_off.json | 4 +- .../gtceu/models/block/yellow_lamp_on.json | 4 +- .../gtceu/common/data/models/GTModels.java | 78 +++++++++++-------- .../assets/gtceu/models/block/lamp_bloom.json | 7 -- .../models/block/lamp_borderless_bloom.json | 6 -- .../models/block/lamp_borderless_off.json | 6 -- .../models/block/lamp_borderless_on.json | 6 -- .../assets/gtceu/models/block/lamp_off.json | 6 -- .../assets/gtceu/models/block/lamp_on.json | 6 -- 135 files changed, 382 insertions(+), 597 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/models/block/lamp_bloom.json delete mode 100644 src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json delete mode 100644 src/main/resources/assets/gtceu/models/block/lamp_borderless_off.json delete mode 100644 src/main/resources/assets/gtceu/models/block/lamp_borderless_on.json delete mode 100644 src/main/resources/assets/gtceu/models/block/lamp_off.json delete mode 100644 src/main/resources/assets/gtceu/models/block/lamp_on.json diff --git a/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json index 253a77bb05e..97853c6f4d0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/black_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/black_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/black_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/black_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/black_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/black_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/black_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/black_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/black_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/black_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/black_lamp.json b/src/generated/resources/assets/gtceu/blockstates/black_lamp.json index 97737ee62ae..81156012927 100644 --- a/src/generated/resources/assets/gtceu/blockstates/black_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/black_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/black_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/black_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/black_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/black_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/black_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/black_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/black_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/black_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/black_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json index 7733a352429..bb291ad2047 100644 --- a/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/blue_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/blue_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/blue_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/blue_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/blue_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/blue_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/blue_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/blue_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/blue_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/blue_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json b/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json index cf1cbb4680b..9c19e8da3d8 100644 --- a/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/blue_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/blue_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/blue_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/blue_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/blue_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/blue_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/blue_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/blue_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/blue_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/blue_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json index 1f94c32a9c8..cbee9003ac0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/brown_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/brown_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/brown_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/brown_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/brown_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/brown_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/brown_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/brown_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/brown_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/brown_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json b/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json index 778a11e8ba2..56110da11a7 100644 --- a/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/brown_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/brown_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/brown_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/brown_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/brown_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/brown_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/brown_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/brown_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/brown_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/brown_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json index 059522192c9..8175c9abed0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/cyan_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/cyan_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/cyan_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/cyan_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/cyan_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/cyan_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/cyan_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/cyan_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/cyan_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/cyan_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json b/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json index fc2113dab49..f292981ff50 100644 --- a/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/cyan_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/cyan_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/cyan_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/cyan_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/cyan_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/cyan_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/cyan_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/cyan_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/cyan_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/cyan_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json index ea09a42e8ea..442a729bc4d 100644 --- a/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/gray_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/gray_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/gray_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/gray_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/gray_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/gray_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/gray_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/gray_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/gray_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/gray_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json b/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json index 02bc283ed22..843bb33ec48 100644 --- a/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/gray_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/gray_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/gray_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/gray_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/gray_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/gray_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/gray_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/gray_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/gray_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/gray_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json index 4a2aa859750..847a974e5c4 100644 --- a/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/green_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/green_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/green_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/green_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/green_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/green_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/green_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/green_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/green_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/green_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/green_lamp.json b/src/generated/resources/assets/gtceu/blockstates/green_lamp.json index 8dd25b4bf15..9dbaf15893f 100644 --- a/src/generated/resources/assets/gtceu/blockstates/green_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/green_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/green_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/green_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/green_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/green_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/green_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/green_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/green_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/green_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/green_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json index 478555ea9d3..43fab9b074b 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_blue_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/light_blue_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_blue_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/light_blue_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/light_blue_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_blue_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/light_blue_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/light_blue_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json index a9b2c1dfdc3..fc79dd9b307 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_blue_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/light_blue_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_blue_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_blue_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/light_blue_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/light_blue_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_blue_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_blue_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/light_blue_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/light_blue_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json index a165753e8ed..2192a344758 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_gray_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/light_gray_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_gray_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/light_gray_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/light_gray_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_gray_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/light_gray_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/light_gray_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json b/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json index 7b84870486a..5d1b6fefffa 100644 --- a/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/light_gray_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/light_gray_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/light_gray_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/light_gray_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/light_gray_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/light_gray_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/light_gray_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/light_gray_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/light_gray_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/light_gray_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json index 893ead5ebb3..2420bc3f72e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/lime_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/lime_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/lime_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/lime_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/lime_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/lime_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/lime_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/lime_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/lime_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/lime_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json b/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json index 7d6989cd5e3..e9b97975762 100644 --- a/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/lime_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/lime_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/lime_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/lime_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/lime_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/lime_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/lime_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/lime_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/lime_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/lime_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json index 71c9fe65e62..1f8587f047a 100644 --- a/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/magenta_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/magenta_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/magenta_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/magenta_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/magenta_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/magenta_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/magenta_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/magenta_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/magenta_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/magenta_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json b/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json index 3d696c9475e..2faa7c6a171 100644 --- a/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/magenta_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/magenta_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/magenta_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/magenta_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/magenta_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/magenta_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/magenta_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/magenta_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/magenta_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/magenta_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json index dc8a8a1774d..8ff33a7b548 100644 --- a/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/orange_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/orange_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/orange_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/orange_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/orange_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/orange_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/orange_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/orange_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/orange_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/orange_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json b/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json index 8d894e3c2e9..e0a78e8c7c6 100644 --- a/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/orange_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/orange_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/orange_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/orange_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/orange_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/orange_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/orange_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/orange_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/orange_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/orange_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json index 7fe0a82fa09..5d6c9e8308f 100644 --- a/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/pink_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/pink_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/pink_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/pink_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/pink_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/pink_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/pink_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/pink_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/pink_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/pink_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json b/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json index a810f47ca34..9e24ef2b9c0 100644 --- a/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/pink_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/pink_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/pink_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/pink_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/pink_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/pink_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/pink_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/pink_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/pink_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/pink_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json index 49beb311e18..9e692ebe06c 100644 --- a/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/purple_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/purple_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/purple_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/purple_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/purple_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/purple_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/purple_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/purple_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/purple_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/purple_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json b/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json index 1cc72c942c7..2a90b827c2f 100644 --- a/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/purple_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/purple_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/purple_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/purple_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/purple_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/purple_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/purple_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/purple_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/purple_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/purple_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json index 54eae2a378b..8787b668a2e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/red_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/red_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/red_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/red_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/red_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/red_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/red_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/red_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/red_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/red_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/red_lamp.json b/src/generated/resources/assets/gtceu/blockstates/red_lamp.json index 75b635491c2..7be57f1c43e 100644 --- a/src/generated/resources/assets/gtceu/blockstates/red_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/red_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/red_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/red_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/red_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/red_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/red_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/red_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/red_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/red_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/red_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json index f0b9254457d..5bbaea32235 100644 --- a/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/white_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/white_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/white_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/white_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/white_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/white_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/white_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/white_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/white_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/white_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/white_lamp.json b/src/generated/resources/assets/gtceu/blockstates/white_lamp.json index 762183f229b..235580f3c74 100644 --- a/src/generated/resources/assets/gtceu/blockstates/white_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/white_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/white_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/white_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/white_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/white_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/white_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/white_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/white_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/white_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/white_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json b/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json index 7ef79ba04fa..1b26ed2cc83 100644 --- a/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/yellow_borderless_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/yellow_borderless_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/yellow_borderless_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/yellow_borderless_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/yellow_borderless_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/yellow_borderless_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/yellow_borderless_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/yellow_borderless_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/yellow_borderless_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/yellow_borderless_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json b/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json index b0a4e50e0ef..52290ca38ed 100644 --- a/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json +++ b/src/generated/resources/assets/gtceu/blockstates/yellow_lamp.json @@ -1,27 +1,21 @@ { "variants": { - "bloom=false,inverted=false,powered=false": { - "model": "gtceu:block/yellow_lamp_off" - }, "bloom=false,inverted=false,powered=true": { "model": "gtceu:block/yellow_lamp_on" }, "bloom=false,inverted=true,powered=false": { "model": "gtceu:block/yellow_lamp_on" }, - "bloom=false,inverted=true,powered=true": { - "model": "gtceu:block/yellow_lamp_off" - }, - "bloom=true,inverted=false,powered=false": { - "model": "gtceu:block/yellow_lamp_off" - }, "bloom=true,inverted=false,powered=true": { "model": "gtceu:block/yellow_lamp_bloom" }, "bloom=true,inverted=true,powered=false": { "model": "gtceu:block/yellow_lamp_bloom" }, - "bloom=true,inverted=true,powered=true": { + "inverted=false,powered=false": { + "model": "gtceu:block/yellow_lamp_off" + }, + "inverted=true,powered=true": { "model": "gtceu:block/yellow_lamp_off" } } diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json index 806989d43ee..84bf95a6728 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/black_borderless" + "all": "gtceu:block/lamps/black_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json index fbf18fc840e..4a829a6ad52 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/black_borderless_off" + "all": "gtceu:block/lamps/black_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json index 4088ce5b9a5..c71c031329c 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/black_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/black_borderless" + "all": "gtceu:block/lamps/black_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json index b16b8a9c982..427daa8afdf 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/black_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/black", - "active_overlay": "gtceu:block/lamps/black_emissive" + "bot_all": "gtceu:block/lamps/black_on", + "top_all": "gtceu:block/lamps/black_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/black_lamp_off.json index 67e619c38b3..f2fecdb1e43 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/black_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/black_off" + "all": "gtceu:block/lamps/black_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/black_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/black_lamp_on.json index 4338bed5bae..9ee4e86cc5a 100644 --- a/src/generated/resources/assets/gtceu/models/block/black_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/black_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/black" + "all": "gtceu:block/lamps/black_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json index b2f0f987ed6..0011ef3c6f0 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/blue_borderless" + "all": "gtceu:block/lamps/blue_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json index 848265e0d35..7ca660957c8 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/blue_borderless_off" + "all": "gtceu:block/lamps/blue_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json index 589b7e72298..b9acea8c973 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/blue_borderless" + "all": "gtceu:block/lamps/blue_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json index 6b874a889e8..ef6ba5696bc 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/blue", - "active_overlay": "gtceu:block/lamps/blue_emissive" + "bot_all": "gtceu:block/lamps/blue_on", + "top_all": "gtceu:block/lamps/blue_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/blue_lamp_off.json index e7af08e18d8..032ce1fa952 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/blue_off" + "all": "gtceu:block/lamps/blue_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json index a036cbc0712..8c9a34b36fd 100644 --- a/src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/blue_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/blue" + "all": "gtceu:block/lamps/blue_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json index 6b544f99c25..e400f4678c0 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/brown_borderless" + "all": "gtceu:block/lamps/brown_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json index 1a64746e1b4..bba67282027 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/brown_borderless_off" + "all": "gtceu:block/lamps/brown_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json index 2127af2c7ab..a20d0afcddb 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/brown_borderless" + "all": "gtceu:block/lamps/brown_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json index 99d9e783663..0f27a4f6a3d 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/brown", - "active_overlay": "gtceu:block/lamps/brown_emissive" + "bot_all": "gtceu:block/lamps/brown_on", + "top_all": "gtceu:block/lamps/brown_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/brown_lamp_off.json index 2c55e947692..357bef0d258 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/brown_off" + "all": "gtceu:block/lamps/brown_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json index 3ba2b9fb583..0e6666b4e36 100644 --- a/src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/brown_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/brown" + "all": "gtceu:block/lamps/brown_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json index b2811583923..de82dc89e33 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/cyan_borderless" + "all": "gtceu:block/lamps/cyan_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json index 25d017cd16f..6fb11a17b7b 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/cyan_borderless_off" + "all": "gtceu:block/lamps/cyan_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json index 6da55252e0e..c0e8af19db9 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/cyan_borderless" + "all": "gtceu:block/lamps/cyan_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json index 86bcd1a8bac..37a42dedd9c 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/cyan", - "active_overlay": "gtceu:block/lamps/cyan_emissive" + "bot_all": "gtceu:block/lamps/cyan_on", + "top_all": "gtceu:block/lamps/cyan_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_off.json index e21e83f6b59..f58a6d864b0 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/cyan_off" + "all": "gtceu:block/lamps/cyan_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json index 842d3a7e150..a201888613e 100644 --- a/src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/cyan_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/cyan" + "all": "gtceu:block/lamps/cyan_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json index fcd5fbd5d0e..cdfa930d4ab 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/gray_borderless" + "all": "gtceu:block/lamps/gray_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json index e4ae459d0b0..19f1e00b343 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/gray_borderless_off" + "all": "gtceu:block/lamps/gray_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json index 4a315f7c06b..9b0e770ada4 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/gray_borderless" + "all": "gtceu:block/lamps/gray_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json index 5d93bf6c47d..1b8cc849039 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/gray", - "active_overlay": "gtceu:block/lamps/gray_emissive" + "bot_all": "gtceu:block/lamps/gray_on", + "top_all": "gtceu:block/lamps/gray_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/gray_lamp_off.json index 857a1e007af..8ea12673777 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/gray_off" + "all": "gtceu:block/lamps/gray_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json index 35830a31c7c..fb1d4ae4e38 100644 --- a/src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/gray_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/gray" + "all": "gtceu:block/lamps/gray_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json index d2aa2b73704..a3c12918450 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/green_borderless" + "all": "gtceu:block/lamps/green_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json index 3ab0b42d3ad..9789455ac66 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/green_borderless_off" + "all": "gtceu:block/lamps/green_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json index 1516ef02e69..69c162257f5 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/green_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/green_borderless" + "all": "gtceu:block/lamps/green_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json index d2e9ca3bd1c..3f6670c421d 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/green_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/green", - "active_overlay": "gtceu:block/lamps/green_emissive" + "bot_all": "gtceu:block/lamps/green_on", + "top_all": "gtceu:block/lamps/green_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/green_lamp_off.json index a781dd834e5..b44425c6bc5 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/green_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/green_off" + "all": "gtceu:block/lamps/green_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/green_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/green_lamp_on.json index e91d7abcdcb..cd73aef17dd 100644 --- a/src/generated/resources/assets/gtceu/models/block/green_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/green_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/green" + "all": "gtceu:block/lamps/green_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json index 0312ce6f180..c08ba739772 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/light_blue_borderless" + "all": "gtceu:block/lamps/light_blue_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json index d94ec49a102..9da3136a30d 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/light_blue_borderless_off" + "all": "gtceu:block/lamps/light_blue_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json index 288796028a4..ea38166c34b 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/light_blue_borderless" + "all": "gtceu:block/lamps/light_blue_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json index a8c2164a6c4..6469144f0b9 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/light_blue", - "active_overlay": "gtceu:block/lamps/light_blue_emissive" + "bot_all": "gtceu:block/lamps/light_blue_on", + "top_all": "gtceu:block/lamps/light_blue_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_off.json index 9ca034a540f..ea47a19ef88 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/light_blue_off" + "all": "gtceu:block/lamps/light_blue_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json index d04ee23320d..2052658c63a 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/light_blue_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/light_blue" + "all": "gtceu:block/lamps/light_blue_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json index 5066febf0b3..de53bed3353 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/light_gray_borderless" + "all": "gtceu:block/lamps/light_gray_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json index e4f0e8e573a..e57d3fabb65 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/light_gray_borderless_off" + "all": "gtceu:block/lamps/light_gray_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json index 749354c8ec9..89218f8e4a3 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/light_gray_borderless" + "all": "gtceu:block/lamps/light_gray_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json index fbd8eab992f..611b72c98c0 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/light_gray", - "active_overlay": "gtceu:block/lamps/light_gray_emissive" + "bot_all": "gtceu:block/lamps/light_gray_on", + "top_all": "gtceu:block/lamps/light_gray_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_off.json index 6808ffb2a93..ff0920de1be 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/light_gray_off" + "all": "gtceu:block/lamps/light_gray_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json index 6cd7d252d99..e4a69e78934 100644 --- a/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/light_gray_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/light_gray" + "all": "gtceu:block/lamps/light_gray_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json index 5da6a37bd34..3b1ed1ddc9e 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/lime_borderless" + "all": "gtceu:block/lamps/lime_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json index ef82cdd5ba7..c5091a54d19 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/lime_borderless_off" + "all": "gtceu:block/lamps/lime_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json index fa848909ca9..73ac58e411e 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/lime_borderless" + "all": "gtceu:block/lamps/lime_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json index 8fc9097d314..f79021145b0 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/lime", - "active_overlay": "gtceu:block/lamps/lime_emissive" + "bot_all": "gtceu:block/lamps/lime_on", + "top_all": "gtceu:block/lamps/lime_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/lime_lamp_off.json index 7ca5c8f6e44..36e09351341 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/lime_off" + "all": "gtceu:block/lamps/lime_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json index e1a2fe27639..18b5c9eccc6 100644 --- a/src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/lime_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/lime" + "all": "gtceu:block/lamps/lime_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json index 4ca7c826a0e..90195b3f19a 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/magenta_borderless" + "all": "gtceu:block/lamps/magenta_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json index 32437f573d3..e6710d1e964 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/magenta_borderless_off" + "all": "gtceu:block/lamps/magenta_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json index 075cd0952db..7c4aa82512d 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/magenta_borderless" + "all": "gtceu:block/lamps/magenta_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json index 104d503c092..8eb805cb832 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/magenta", - "active_overlay": "gtceu:block/lamps/magenta_emissive" + "bot_all": "gtceu:block/lamps/magenta_on", + "top_all": "gtceu:block/lamps/magenta_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_off.json index e677abbc662..64b0dc4e9cd 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/magenta_off" + "all": "gtceu:block/lamps/magenta_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json index dbd2f889c2e..20e2ed02625 100644 --- a/src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/magenta_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/magenta" + "all": "gtceu:block/lamps/magenta_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json index 067c4871c3f..81536dc6a70 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/orange_borderless" + "all": "gtceu:block/lamps/orange_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json index 81dcf02aa53..f781a2b8762 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/orange_borderless_off" + "all": "gtceu:block/lamps/orange_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json index a9533a1401f..ffec850d72c 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/orange_borderless" + "all": "gtceu:block/lamps/orange_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json index 94c480a414f..3045830d91b 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/orange", - "active_overlay": "gtceu:block/lamps/orange_emissive" + "bot_all": "gtceu:block/lamps/orange_on", + "top_all": "gtceu:block/lamps/orange_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/orange_lamp_off.json index 29c97af7074..de39687d8da 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/orange_off" + "all": "gtceu:block/lamps/orange_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json index 7d7b2d2a0b6..65cd2273595 100644 --- a/src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/orange_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/orange" + "all": "gtceu:block/lamps/orange_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json index 52767e59d91..5a298459c50 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/pink_borderless" + "all": "gtceu:block/lamps/pink_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json index 6208d2d9b2a..962c65646e6 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/pink_borderless_off" + "all": "gtceu:block/lamps/pink_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json index 7c871e10d88..8f4a7fcb799 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/pink_borderless" + "all": "gtceu:block/lamps/pink_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json index e84579e9615..144a0dcb047 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/pink", - "active_overlay": "gtceu:block/lamps/pink_emissive" + "bot_all": "gtceu:block/lamps/pink_on", + "top_all": "gtceu:block/lamps/pink_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/pink_lamp_off.json index 6716a235cab..707ec2c9982 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/pink_off" + "all": "gtceu:block/lamps/pink_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json index 854a85f2546..fa06f4f6e76 100644 --- a/src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/pink_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/pink" + "all": "gtceu:block/lamps/pink_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json index 99666122896..28b54f45dbe 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/purple_borderless" + "all": "gtceu:block/lamps/purple_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json index 166f5328f9e..a12c3968109 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/purple_borderless_off" + "all": "gtceu:block/lamps/purple_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json index e31e7d0a584..b313f200246 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/purple_borderless" + "all": "gtceu:block/lamps/purple_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json index 07a9193a2a9..83a55660012 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/purple", - "active_overlay": "gtceu:block/lamps/purple_emissive" + "bot_all": "gtceu:block/lamps/purple_on", + "top_all": "gtceu:block/lamps/purple_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/purple_lamp_off.json index 6bda97ffb1e..378bca56b81 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/purple_off" + "all": "gtceu:block/lamps/purple_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json index 6e556400065..216ad36e72e 100644 --- a/src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/purple_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/purple" + "all": "gtceu:block/lamps/purple_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json index e68e1bdfde1..cb7e9583f35 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/red_borderless" + "all": "gtceu:block/lamps/red_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json index 21b0ec08285..c17f27750c3 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/red_borderless_off" + "all": "gtceu:block/lamps/red_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json index 120c01ae392..38711361d15 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/red_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/red_borderless" + "all": "gtceu:block/lamps/red_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json index bdd85e6f25b..4996b59bd99 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/red_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/red", - "active_overlay": "gtceu:block/lamps/red_emissive" + "bot_all": "gtceu:block/lamps/red_on", + "top_all": "gtceu:block/lamps/red_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/red_lamp_off.json index 50ccba6a18b..5da56197c86 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/red_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/red_off" + "all": "gtceu:block/lamps/red_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/red_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/red_lamp_on.json index e29d346ccfe..660fc75af74 100644 --- a/src/generated/resources/assets/gtceu/models/block/red_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/red_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/red" + "all": "gtceu:block/lamps/red_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json index 9556f00bdb7..8065c4ba9e8 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/white_borderless" + "all": "gtceu:block/lamps/white_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json index f7d54a35b52..c43350e52d2 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/white_borderless_off" + "all": "gtceu:block/lamps/white_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json index 42735b05883..c106322df04 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/white_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/white_borderless" + "all": "gtceu:block/lamps/white_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json index b71b3faf8eb..3588487560f 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/white_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/white", - "active_overlay": "gtceu:block/lamps/white_emissive" + "bot_all": "gtceu:block/lamps/white_on", + "top_all": "gtceu:block/lamps/white_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/white_lamp_off.json index 0980e4043b6..50ee7565b29 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/white_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/white_off" + "all": "gtceu:block/lamps/white_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/white_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/white_lamp_on.json index 4522ed15ac7..423335f86a7 100644 --- a/src/generated/resources/assets/gtceu/models/block/white_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/white_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/white" + "all": "gtceu:block/lamps/white_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json index 96b705cba28..82152b81991 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_bloom.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_bloom", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/yellow_borderless" + "all": "gtceu:block/lamps/yellow_borderless_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json index ad77fe2b931..100c3289a58 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/yellow_borderless_off" + "all": "gtceu:block/lamps/yellow_borderless_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json index aeadee0da31..5ffac8d2686 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_borderless_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_borderless_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/yellow_borderless" + "all": "gtceu:block/lamps/yellow_borderless_on" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json index fb7e8ae71d2..238e070caf7 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_bloom.json @@ -1,7 +1,7 @@ { - "parent": "gtceu:block/lamp_bloom", + "parent": "gtceu:block/cube_2_layer/all", "textures": { - "active": "gtceu:block/lamps/yellow", - "active_overlay": "gtceu:block/lamps/yellow_emissive" + "bot_all": "gtceu:block/lamps/yellow_on", + "top_all": "gtceu:block/lamps/yellow_bloom" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_off.json b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_off.json index 4cc92527118..551aca30aca 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_off.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_off.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_off", + "parent": "minecraft:block/cube_all", "textures": { - "inactive": "gtceu:block/lamps/yellow_off" + "all": "gtceu:block/lamps/yellow_off" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json index 0f532dc8561..b8028838773 100644 --- a/src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json +++ b/src/generated/resources/assets/gtceu/models/block/yellow_lamp_on.json @@ -1,6 +1,6 @@ { - "parent": "gtceu:block/lamp_on", + "parent": "gtceu:block/cube/emissive/all", "textures": { - "active": "gtceu:block/lamps/yellow" + "all": "gtceu:block/lamps/yellow_on" } } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java index bff2a3624c7..12fe1cbfa01 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTModels.java @@ -82,43 +82,57 @@ public static void rubberTreeSaplingModel(DataGenContext contex provider.generated(context, provider.modLoc("block/" + provider.name(context))); } + public static final ResourceLocation CUBE_ALL_EMISSIVE = GTCEu.id("block/cube/emissive/all"); + public static NonNullBiConsumer, RegistrateBlockstateProvider> lampModel(DyeColor color, boolean border) { return (ctx, prov) -> { - final String textureBase = "block/lamps/" + color.getSerializedName(); - final String borderPart = (border ? "" : "_borderless"); - final String parentModelBase = "block/lamp" + borderPart; - - ModelFile parentBloom = prov.models().getExistingFile(prov.modLoc(parentModelBase + "_bloom")); - ModelFile parentOn = prov.models().getExistingFile(prov.modLoc(parentModelBase + "_on")); - ModelFile parentOff = prov.models().getExistingFile(prov.modLoc(parentModelBase + "_off")); + final String textureBase = "block/lamps/" + color.getSerializedName() + (border ? "" : "_borderless"); + + var onModel = prov.models().withExistingParent(ctx.getName() + "_on", CUBE_ALL_EMISSIVE) + .texture("all", prov.modLoc(textureBase + "_on")); + var offModel = prov.models().cubeAll(ctx.getName() + "_off", prov.modLoc(textureBase + "_off")); + + var bloomModel = prov.models().withExistingParent(ctx.getName() + "_bloom", + border ? GTCEu.id("block/cube_2_layer/all") : CUBE_ALL_EMISSIVE); + if (border) { + bloomModel.texture("bot_all", textureBase + "_on"); + bloomModel.texture("top_all", textureBase + "_bloom"); + } else { + bloomModel.texture("all", textureBase + "_bloom"); + } prov.getVariantBuilder(ctx.getEntry()) - .forAllStatesExcept(state -> { - if (LampBlock.isLightActive(state)) { - ModelBuilder model = prov.models() - .getBuilder(ctx.getName() + (state.getValue(LampBlock.BLOOM) ? "_bloom" : "_on")) - .parent(state.getValue(LampBlock.BLOOM) ? parentBloom : parentOn); - if (border) { - model.texture("active", textureBase); - if (state.getValue(LampBlock.BLOOM)) { - model.texture("active_overlay", textureBase + "_emissive"); - } - } else { - model.texture("active", textureBase + "_borderless"); - } - return ConfiguredModel.builder() - .modelFile(model) - .build(); - } else { - return ConfiguredModel.builder() - .modelFile(prov.models() - .getBuilder(ctx.getName() + "_off") - .parent(parentOff) - .texture("inactive", textureBase + borderPart + "_off")) - .build(); - } - }, LampBlock.LIGHT); + // spotless:off + .partialState() + .with(LampBlock.INVERTED, false).with(LampBlock.POWERED, false) + .modelForState().modelFile(offModel) + .addModel() + .partialState() + .with(LampBlock.INVERTED, true).with(LampBlock.POWERED, true) + .modelForState().modelFile(offModel) + .addModel() + .partialState() + .with(LampBlock.INVERTED, false).with(LampBlock.POWERED, true) + .with(LampBlock.BLOOM, false) + .modelForState().modelFile(onModel) + .addModel() + .partialState() + .with(LampBlock.INVERTED, true).with(LampBlock.POWERED, false) + .with(LampBlock.BLOOM, false) + .modelForState().modelFile(onModel) + .addModel() + .partialState() + .with(LampBlock.INVERTED, false).with(LampBlock.POWERED, true) + .with(LampBlock.BLOOM, true) + .modelForState().modelFile(bloomModel) + .addModel() + .partialState() + .with(LampBlock.INVERTED, true).with(LampBlock.POWERED, false) + .with(LampBlock.BLOOM, true) + .modelForState().modelFile(bloomModel) + .addModel(); + // spotless:on }; } diff --git a/src/main/resources/assets/gtceu/models/block/lamp_bloom.json b/src/main/resources/assets/gtceu/models/block/lamp_bloom.json deleted file mode 100644 index a86c495dab1..00000000000 --- a/src/main/resources/assets/gtceu/models/block/lamp_bloom.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "gtceu:block/cube_2_layer/all", - "textures": { - "bot_all": "#active", - "top_all": "#active_overlay" - } -} diff --git a/src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json b/src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json deleted file mode 100644 index 02221906a01..00000000000 --- a/src/main/resources/assets/gtceu/models/block/lamp_borderless_bloom.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "gtceu:block/cube/emissive/all", - "textures": { - "all": "#active" - } -} diff --git a/src/main/resources/assets/gtceu/models/block/lamp_borderless_off.json b/src/main/resources/assets/gtceu/models/block/lamp_borderless_off.json deleted file mode 100644 index d1a845c5f33..00000000000 --- a/src/main/resources/assets/gtceu/models/block/lamp_borderless_off.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "#inactive" - } -} diff --git a/src/main/resources/assets/gtceu/models/block/lamp_borderless_on.json b/src/main/resources/assets/gtceu/models/block/lamp_borderless_on.json deleted file mode 100644 index e24c1097eab..00000000000 --- a/src/main/resources/assets/gtceu/models/block/lamp_borderless_on.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "#active" - } -} diff --git a/src/main/resources/assets/gtceu/models/block/lamp_off.json b/src/main/resources/assets/gtceu/models/block/lamp_off.json deleted file mode 100644 index d1a845c5f33..00000000000 --- a/src/main/resources/assets/gtceu/models/block/lamp_off.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "#inactive" - } -} diff --git a/src/main/resources/assets/gtceu/models/block/lamp_on.json b/src/main/resources/assets/gtceu/models/block/lamp_on.json deleted file mode 100644 index e24c1097eab..00000000000 --- a/src/main/resources/assets/gtceu/models/block/lamp_on.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/cube_all", - "textures": { - "all": "#active" - } -} From 0fd706d9d0b129e36142cca175a910f7644beda1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:27:39 +0300 Subject: [PATCH 205/269] Fix typo --- .../gtceu/textures/block/lamps/green_borderless_on.png.mcmeta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta index 95ef0aa75d1..4662e246aa1 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/green_borderless_on.png.mcmeta @@ -1,4 +1,4 @@ -w{ +{ "shimmer": { "bloom": false } From 7135524a54752a6cfddcca6933110f31b78c6b45 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:30:36 +0300 Subject: [PATCH 206/269] spotless --- .../gregtechceu/gtceu/client/ClientProxy.java | 4 +- .../item/CustomItemRendererWrapperModel.java | 40 +++++-------------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 295ff1fea16..668e0c8388f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,8 +8,8 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; -import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; import com.gregtechceu.gtceu.client.model.item.CustomItemRendererWrapperModel; +import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; import com.gregtechceu.gtceu.client.model.pipe.PipeModel; import com.gregtechceu.gtceu.client.model.pipe.PipeModelLoader; @@ -176,7 +176,7 @@ public void onRegisterModelLoaders(ModelEvent.RegisterGeometryLoaders event) { event.register(MachineModelLoader.ID.getPath(), MachineModelLoader.INSTANCE); event.register(PipeModelLoader.ID.getPath(), PipeModelLoader.INSTANCE); event.register("facade", FacadeUnbakedModel.Loader.INSTANCE); - event.register(CustomItemRendererWrapperModel.TYPE_ID.getPath(), CustomItemRendererWrapperModel.Loader.INSTANCE); + event.register(CustomItemRendererWrapperModel.ID.getPath(), CustomItemRendererWrapperModel.Loader.INSTANCE); } @SubscribeEvent(priority = EventPriority.HIGHEST) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java index 1a703b59dae..c0b127f80d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/item/CustomItemRendererWrapperModel.java @@ -19,11 +19,10 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import org.jetbrains.annotations.Nullable; import java.util.function.Function; +// spotless:off /** * Custom model type that simply overrides {@link BakedModel#isCustomRenderer()} to always return true so * {@link IClientItemExtensions#getCustomRenderer()} can work. Does nothing on blocks. @@ -31,14 +30,15 @@ *

* Use it on an item model builder like this: *

{@code
- *      prov.getBuilder(ctx.getId())
- *              .customLoader(CustomItemRendererModel.Builder::begin).end()
- *              // ...
+ * prov.getBuilder(ctx.getId())
+ *         .customLoader(CustomItemRendererModel.Builder::begin).end()
+ *         // ...
  * }
*/ +// spotless:on public class CustomItemRendererWrapperModel implements IUnbakedGeometry { - public static final ResourceLocation TYPE_ID = GTCEu.id("custom_item_renderer_wrapper"); + public static final ResourceLocation ID = GTCEu.id("custom_item_renderer_wrapper"); private final BlockModel parent; @@ -53,7 +53,8 @@ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, BlockModel owner = parent; if (context instanceof BlockGeometryBakingContext blockContext) owner = blockContext.owner; - BakedModel originalModel = parent.bake(baker, owner, spriteGetter, modelState, modelLocation, context.isGui3d()); + BakedModel originalModel = parent.bake(baker, owner, spriteGetter, modelState, modelLocation, + context.isGui3d()); return new Baked(originalModel); } @@ -72,47 +73,26 @@ public boolean isCustomRenderer() { public static final class Loader implements IGeometryLoader { public static final CustomItemRendererWrapperModel.Loader INSTANCE = new CustomItemRendererWrapperModel.Loader(); -// private static final ThreadLocal currentlyParsing = new ThreadLocal<>(); private Loader() {} @Override - public @Nullable CustomItemRendererWrapperModel read(JsonObject json, JsonDeserializationContext context) throws JsonParseException { -// if (Boolean.TRUE.equals(currentlyParsing.get())) { -// // if this is called from the inner context.deserialize(...) invocation, return null so the vanilla -// // model is parsed instead -// return null; -// } -// try { -// currentlyParsing.set(Boolean.TRUE); -// + public CustomItemRendererWrapperModel read(JsonObject json, JsonDeserializationContext context) { // remove the loader field and parse it again as a normal vanilla model json.remove("loader"); return new CustomItemRendererWrapperModel(context.deserialize(json, BlockModel.class)); -// } finally { -// currentlyParsing.remove(); -// } } } - /** - * Use this to add the model type to an item model generator, like this: - *
{@code
-     *      prov.withExistingParent(ctx::get, ctx.id())
-     *              .customLoader(CustomItemRendererModel.Builder::begin).end()
-     *              // ...
-     * }
- */ public static final class Builder> extends CustomLoaderBuilder { public Builder(T parent, ExistingFileHelper existingFileHelper) { - super(TYPE_ID, parent, existingFileHelper); + super(ID, parent, existingFileHelper); } public static > Builder begin(T parent, ExistingFileHelper existingFileHelper) { return new Builder<>(parent, existingFileHelper); } - } } From c26a54599999b70cf9b43f29e832df2cc99fc183 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:49:28 +0300 Subject: [PATCH 207/269] Add renderdoc capture files to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1573309b594..c1c44d92c86 100644 --- a/.gitignore +++ b/.gitignore @@ -22,5 +22,6 @@ classes/ src/generated/resources/.cache/ *.patch +*.cap *.DS_Store From 6282395afc716d7aaa629a3d423e4ae5ed896e20 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 13:49:46 +0300 Subject: [PATCH 208/269] -XX:+AllowRedefinitionToAddDeleteMethods --- gradle/scripts/moddevgradle.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index fe437d67c33..f24fd0b5211 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -152,6 +152,9 @@ legacyForge { // Enable assertions for our classes in dev environment jvmArgument('-ea:com.gregtechceu.gtceu...') + // jvmArgument("-XX:+AllowEnhancedClassRedefinition") + jvmArgument("-XX:+AllowRedefinitionToAddDeleteMethods") + // Recommended logging level for the console // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels From 5ca60825b97150f3a305e8cb21483e2165aa7df4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 14:59:19 +0300 Subject: [PATCH 209/269] Add a way to explicitly disable bloom on textures even if they're emissive --- .../client/model/ctm/GTTextureMetadata.java | 5 +- .../client/util/TextureMetadataHelper.java | 15 ++- .../com/gregtechceu/gtceu/utils/TriState.java | 101 ++++++++++++++++++ 3 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/TriState.java 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 932bcdc2f20..a96fe6cc5cb 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,6 +1,7 @@ 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; @@ -18,7 +19,7 @@ import java.util.Optional; import java.util.function.Function; -public record GTTextureMetadata(@Nullable ResourceLocation connectionTexture, boolean bloom) { +public record GTTextureMetadata(@Nullable ResourceLocation connectionTexture, TriState bloom) { public static final String SECTION_NAME = GTCEu.MOD_ID; public static final MetadataSectionSerializer SERIALIZER = new Serializer(); @@ -45,7 +46,7 @@ public static class Serializer implements MetadataSectionSerializer CODEC = RecordCodecBuilder.create(instance -> instance.group( ResourceLocation.CODEC.optionalFieldOf("connection_texture", EMPTY_CONNECTION).forGetter(GTTextureMetadata::connectionTexture), - Codec.BOOL.optionalFieldOf("bloom", false).forGetter(GTTextureMetadata::bloom) + TriState.CODEC.optionalFieldOf("bloom", TriState.DEFAULT).forGetter(GTTextureMetadata::bloom) ).apply(instance, GTTextureMetadata::new)); // spotless:on diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java index b5e4d16e884..0007009d079 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -5,6 +5,8 @@ import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.TriState; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -70,9 +72,16 @@ public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { return true; } var metadata = getMetadata(quad.getSprite()); - if (metadata.isPresent() && metadata.get().bloom()) { - return true; - } else if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom) { + if (metadata.isPresent()) { + TriState bloomValue = metadata.get().bloom(); + if (bloomValue == TriState.TRUE) return true; + // Explicitly disable bloom if it's set to FALSE in the metadata + else if (bloomValue == TriState.FALSE) return false; + + // fall through to emissivity config check if default + } + + if (ConfigHolder.INSTANCE.client.bloom.emissiveTexturesHaveBloom) { return isEmissive(quad, ambientPackedLights); } diff --git a/src/main/java/com/gregtechceu/gtceu/utils/TriState.java b/src/main/java/com/gregtechceu/gtceu/utils/TriState.java new file mode 100644 index 00000000000..05c6a28d967 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/TriState.java @@ -0,0 +1,101 @@ +package com.gregtechceu.gtceu.utils; + +import net.minecraft.util.StringRepresentable; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Lifecycle; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Locale; +import java.util.function.BooleanSupplier; +import java.util.function.Function; + +/** + * Represents a boolean value that can be {@code true}, {@code false} or refer to a default value. + */ +public enum TriState implements StringRepresentable { + /** + * Represents the boolean value {@code true}. + */ + TRUE, + /** + * Represents a "default" value, often used as a fallback. + */ + DEFAULT, + /** + * Represents the boolean value {@code false}. + */ + FALSE; + + public static final Codec CODEC = Codec.either(Codec.BOOL, StringRepresentable.fromEnum(TriState::values)) + .xmap(either -> either.map(TriState::of, Function.identity()), + triState -> triState != DEFAULT ? Either.left(triState.isTrue()) : Either.right(DEFAULT)); + + // Helper methods + + public boolean isTrue() { + return this == TRUE; + } + + public boolean isDefault() { + return this == DEFAULT; + } + + public boolean isFalse() { + return this == FALSE; + } + + public static TriState of(boolean value) { + return value ? TRUE : FALSE; + } + + public static TriState of(@Nullable Boolean value) { + return value == null ? DEFAULT : of((boolean) value); + } + + public static TriState of(DataResult value) { + if (value.result().isPresent()) return of(value.result().get()); + // throw out parsing errors and return default + else return DEFAULT; + } + + public @Nullable Boolean toBoolean() { + return switch (this) { + case TRUE -> Boolean.TRUE; + case FALSE -> Boolean.FALSE; + default -> null; + }; + } + + public DataResult toBooleanOrError() { + return switch (this) { + case TRUE -> DataResult.success(Boolean.TRUE); + case FALSE -> DataResult.success(Boolean.FALSE); + default -> DataResult.error(() -> "Default does not have a value", Lifecycle.stable()); + }; + } + + public boolean toBooleanOrElse(final boolean other) { + return switch (this) { + case TRUE -> true; + case FALSE -> false; + default -> other; + }; + } + + public boolean toBooleanOrElseGet(final @NotNull BooleanSupplier supplier) { + return switch (this) { + case TRUE -> true; + case FALSE -> false; + default -> supplier.getAsBoolean(); + }; + } + + @Override + public @NotNull String getSerializedName() { + return this.name().toLowerCase(Locale.ROOT); + } +} From 80e2c895f18770ba83df413337217be019e8cb02 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 15:01:56 +0300 Subject: [PATCH 210/269] spotless --- .../client/bloom/BloomEventListeners.java | 2 -- .../gtceu/client/bloom/BloomSafeMode.java | 14 ++++----- .../client/bloom/BloomShaderManager.java | 1 - .../gtceu/client/bloom/BloomUtil.java | 2 +- .../client/util/TextureMetadataHelper.java | 1 - .../gtceu/core/config/GTEarlyConfig.java | 29 +++++++++---------- .../gregtechceu/gtceu/core/config/Option.java | 5 ++-- .../gtceu/core/mixins/GTMixinPlugin.java | 3 +- .../client/bloom/LevelRendererMixin.java | 2 +- .../bloom/normal/ModelBlockRendererMixin.java | 2 +- .../client/bloom/normal/QuadLighterMixin.java | 2 +- .../client/bloom/normal/RebuildTaskMixin.java | 2 +- .../client/bloom/normal/RenderTypeMixin.java | 2 +- .../embeddium/DefaultMaterialsMixin.java | 2 +- .../DefaultTerrainRenderPassesMixin.java | 2 +- .../oculus/WorldRenderingPhaseMixin.java | 2 +- .../bloom/safemode/LevelRendererAccessor.java | 3 +- .../bloom/safemode/LevelRendererMixin.java | 7 +++-- .../safemode/ModelBlockRendererMixin.java | 8 +++-- .../embeddium/BlockRendererMixin.java | 14 ++++----- .../embeddium/GTEmbeddiumCompat.java | 10 +++---- .../com/gregtechceu/gtceu/utils/TriState.java | 1 + 22 files changed, 59 insertions(+), 57 deletions(-) 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 5cb24acd0c1..86671766663 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -2,8 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; - -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.core.config.GTEarlyConfig; import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java index e03310203f0..183a4522d6c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java @@ -3,10 +3,6 @@ import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; -import com.mojang.blaze3d.pipeline.RenderCall; -import com.mojang.blaze3d.shaders.Uniform; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Camera; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.ShaderInstance; @@ -16,6 +12,11 @@ import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.ForgeHooksClient; + +import com.mojang.blaze3d.pipeline.RenderCall; +import com.mojang.blaze3d.shaders.Uniform; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; @@ -150,8 +151,7 @@ public static void bakeBloomChunkBuffers(SectionPos sectionPos, Vec3 camPos) { builder.setQuadSorting(VertexSorting.byDistance( (float) camPos.x() - sectionPos.minBlockX(), (float) camPos.y() - sectionPos.minBlockY(), - (float) camPos.z() - sectionPos.minBlockZ() - )); + (float) camPos.z() - sectionPos.minBlockZ())); finishBloomBuffer(sectionPos, builder); } @@ -161,7 +161,7 @@ private static ShaderInstance setupBlockShaderUniforms(PoseStack poseStack, Matr ShaderInstance shader = RenderSystem.getShader(); assert shader != null; - for(int i = 0; i < 12; ++i) { + for (int i = 0; i < 12; ++i) { int textureId = RenderSystem.getShaderTexture(i); shader.setSampler("Sampler" + i, textureId); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index 7158e59902e..6c0da68027e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -38,7 +38,6 @@ public class BloomShaderManager { @ApiStatus.Internal public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { - event.registerShader(new ShaderInstance(event.getResourceProvider(), GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), shader -> rendertypeBloomShader = shader); diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index c630a0fe839..0adba0b98ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -13,7 +13,6 @@ import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; -import lombok.experimental.UtilityClass; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.*; @@ -34,6 +33,7 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.experimental.UtilityClass; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java index 0007009d079..13cc3a7e5d1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.model.ctm.GTTextureMetadata; - import com.gregtechceu.gtceu.client.util.quad.transformers.GTQuadTransformers; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.TriState; diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java index b731bdfc0e2..d69fec3d5a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java +++ b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java @@ -12,7 +12,8 @@ /** * An early (e.g. mixin) config handler based on the one from ModernFix + * href= + * "https://github.com/embeddedt/ModernFix/blob/4e3ecf9b6d7ab3ebecbc0604db916cd4922689fc/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java">ModernFix */ public class GTEarlyConfig { @@ -32,13 +33,11 @@ private GTEarlyConfig(File file) { option.addComment( "Whether to use a 'safe mode' for bloom rendering", "NOTE: considerably slower than the normal process, but likely fixes compatibility issues with other mods.", - "Requires restarting the client to take effect." - ); + "Requires restarting the client to take effect."); addDelegateRule("client.bloom.safemode", SAFE_MODE_CONFIG_NAME, false); addDelegateRule("client.bloom.normal", SAFE_MODE_CONFIG_NAME, true); - // hidden rules for dev-only mixins addHiddenRule("dev", !FMLLoader.isProduction()); addHiddenRule("dev.datagen", FMLLoader.getLaunchHandler().isData()); @@ -61,7 +60,6 @@ private GTEarlyConfig(File file) { enableIfModPresent("xaerominimap", "xaerominimap"); enableIfModPresent("xaeroworldmap", "xaeroworldmap"); - // bind non-empty parents for (Map.Entry entry : this.options.entrySet()) { if (entry.getValue().getParent() != null) continue; @@ -111,7 +109,7 @@ private void enableIfModPresent(String configName, String... ids) { * Defines a Mixin rule which can be configured by users and other mods. * * @param configName The name of the mixin package which will be controlled by this rule - * @param enabled True if the rule will be enabled by default, otherwise false + * @param enabled True if the rule will be enabled by default, otherwise false * * @throws IllegalStateException If a rule with that name already exists */ @@ -127,7 +125,7 @@ private Option addMixinRule(String configName, boolean enabled) { * Defines a Mixin rule which can be configured by users and other mods. * * @param configName The name of the mixin package which will be controlled by this rule - * @param enabled True if the rule will be enabled by default, otherwise false + * @param enabled True if the rule will be enabled by default, otherwise false * * @throws IllegalStateException If a rule with that name already exists */ @@ -140,11 +138,11 @@ private Option addHiddenRule(String configName, boolean enabled) { /** * Defines a Mixin rule which directly relegates to another (existing) mixin rule. * - * @param configName The name of the mixin package which will be controlled by this rule + * @param configName The name of the mixin package which will be controlled by this rule * @param delegateName The name of the (existing) rule which this rule delegates to - * @param invert Whether to invert {@code delegateName}'s enabled state + * @param invert Whether to invert {@code delegateName}'s enabled state * - * @throws IllegalStateException If a rule with that name already exists + * @throws IllegalStateException If a rule with that name already exists * @throws IllegalArgumentException If a rule named {@code delegateName} doesn't already exist */ private Option addDelegateRule(String configName, String delegateName, boolean invert) { @@ -264,7 +262,8 @@ public void save() throws IOException { try (Writer writer = new FileWriter(configFile)) { writer.write("# This is the early configuration file for GregTech CEu Modern.\n"); writer.write("# The following options can be enabled or disabled if there is a compatibility issue.\n"); - writer.write("# Add a line with your option name and =true or =false at the bottom of the file to enable\n"); + writer.write( + "# Add a line with your option name and =true or =false at the bottom of the file to enable\n"); writer.write("# or disable a rule. For example:\n"); writer.write("# client.bloom.safe_mode=true\n"); writer.write("# Do not include the #. You may reset to defaults by deleting this file.\n"); @@ -281,7 +280,8 @@ public void save() throws IOException { String extraContext; if (!option.isUserDefined()) { - extraContext = "=" + option.isEnabled() + " # " + (option.isModDefined() ? "(overridden for mod compat)" : "(default)"); + extraContext = "=" + option.isEnabled() + " # " + + (option.isModDefined() ? "(overridden for mod compat)" : "(default)"); } else { extraContext = "=" + option.isDefaultEnabled() + " # (default)"; } @@ -339,9 +339,8 @@ public static boolean isModLoaded(String modId) { try { Class.forName("optifine.OptiFineTransformationService"); hasOfClass = true; - } catch (Throwable ignored) { - } + } catch (Throwable ignored) {} OPTIFINE_PRESENT = hasOfClass; } -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/Option.java b/src/main/java/com/gregtechceu/gtceu/core/config/Option.java index f928771a490..5d701c1e9ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/config/Option.java +++ b/src/main/java/com/gregtechceu/gtceu/core/config/Option.java @@ -79,7 +79,8 @@ public boolean isEnabled() { * by the parent rule being disabled. */ public boolean isEffectivelyDisabledByParent() { - return this.parent != null && (!this.parent.enabled || this.parent.isEffectivelyDisabledByParent()) != parentValueInverted; + return this.parent != null && + (!this.parent.enabled || this.parent.isEffectivelyDisabledByParent()) != parentValueInverted; } public boolean isOverridden() { @@ -106,4 +107,4 @@ public void clearUserDefined() { public Collection getDefiningMods() { return this.modDefined != null ? Collections.unmodifiableCollection(this.modDefined) : Collections.emptyList(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 0827d38d189..4e815de0116 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -52,7 +52,8 @@ public GTMixinPlugin() { }); if (OPTIFINE_PRESENT) { - LOGGER.fatal("OptiFine detected. Use of GTCEu with OptiFine is not supported due to its breakage of Forge features."); + LOGGER.fatal( + "OptiFine detected. Use of GTCEu with OptiFine is not supported due to its breakage of Forge features."); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index e77782e7866..4df5eb444a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import net.minecraft.client.Camera; import net.minecraft.client.renderer.GameRenderer; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index 65990970e71..efcc8ec46fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.core.util.CapturedQuadData; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 72b08ed2a01..5b56a7225ed 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.core.IGTQuadLighter; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java index 0b9ed49c066..1a8dcaf9c78 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.bloom.BloomUtil; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index c6b011cfa53..2c011fb9890 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import net.minecraft.client.renderer.RenderType; 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 1faa5a4dc1f..0e015d39ae0 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; 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 d7d4cd56044..ce06b51be23 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.embeddium; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index 2f8159ba209..87900ad1049 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal.oculus; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.integration.iris.GTIrisHooks; import net.irisshaders.iris.pipeline.WorldRenderingPhase; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java index 8d90b9d77d9..3607b5900d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java @@ -1,8 +1,9 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; + +import com.mojang.blaze3d.vertex.PoseStack; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java index b9c2670410d..ec543af4b4e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java @@ -2,10 +2,11 @@ import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; -import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.Camera; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.SectionPos; + +import com.llamalad7.mixinextras.sugar.Local; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,8 +17,8 @@ public class LevelRendererMixin { @Inject(method = "compileChunks", at = @At(value = "INVOKE", - ordinal = 0, - target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) + ordinal = 0, + target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, @Local SectionPos sectionPos) { BloomSafeMode.CURRENT_RENDERING_SECTION.set(sectionPos); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java index 01faafec4a1..2db36029365 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java @@ -1,12 +1,14 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; + +import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.model.BakedQuad; + import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.model.BakedQuad; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -31,4 +33,4 @@ public class ModelBlockRendererMixin { combinedOverlay, mulColor); }); } -} \ No newline at end of file +} 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 57fba93eb6a..450a2ccbfcd 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 @@ -4,16 +4,16 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; -import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import com.mojang.blaze3d.vertex.BufferBuilder; import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.core.SectionPos; 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 com.mojang.blaze3d.vertex.BufferBuilder; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; import me.jellysquid.mods.sodium.client.render.chunk.compile.buffers.ChunkModelBuilder; @@ -53,9 +53,9 @@ public class BlockRendererMixin { @Inject(method = "writeGeometry", at = @At(value = "FIELD", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;light:I", - opcode = Opcodes.PUTFIELD, - shift = At.Shift.AFTER)) + target = "Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;light:I", + opcode = Opcodes.PUTFIELD, + shift = At.Shift.AFTER)) private void gtceu$captureBloomQuads(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, Material material, BakedQuadView quad, int[] colors, QuadLightData light, CallbackInfo ci, 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 0d5f64f21cd..0c62c575c21 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,20 +1,20 @@ package com.gregtechceu.gtceu.integration.embeddium; import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; - import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.core.config.GTEarlyConfig; import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import net.minecraft.client.Minecraft; import net.minecraft.core.SectionPos; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; + +import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; +import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import org.embeddedt.embeddium.api.ChunkMeshEvent; public class GTEmbeddiumCompat { diff --git a/src/main/java/com/gregtechceu/gtceu/utils/TriState.java b/src/main/java/com/gregtechceu/gtceu/utils/TriState.java index 05c6a28d967..e58e68e5cc9 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/TriState.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/TriState.java @@ -17,6 +17,7 @@ * Represents a boolean value that can be {@code true}, {@code false} or refer to a default value. */ public enum TriState implements StringRepresentable { + /** * Represents the boolean value {@code true}. */ From 722f01ba608ef6501fed7951f41d67dd7ce24f01 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 15:05:38 +0300 Subject: [PATCH 211/269] Fix mixin filter bug --- .../gregtechceu/gtceu/core/mixins/GTMixinPlugin.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 4e815de0116..4f722ebb7e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -77,16 +77,9 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { public static boolean isOptionEnabled(String mixin) { Option option = CONFIG.getEffectiveOptionForMixin(mixin); - if (option == null) { - String msg = "No rules matched mixin '{}', treating as foreign and disabling!"; - if (!FMLLoader.isProduction()) { - LOGGER.error(msg, mixin); - } else { - LOGGER.debug(msg, mixin); - } - - return false; + // if the mixin doesn't have an option, it's always enabled + return true; } return option.isEnabled(); From 9738e50944d5d9ed70fff79951d74fb1547be048 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 15:07:03 +0300 Subject: [PATCH 212/269] Oops. Forgot forge appends the modid automatically. --- .../com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 86671766663..f2d7efd857c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -90,7 +90,7 @@ public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { block = GTRenderTypes.bloom(); entity = GTRenderTypes.entityBloomBlockSheet(); } - event.register("gtceu:bloom", block, entity); + event.register("bloom", block, entity); } } } From 2ccc00a0be35e719d3b10eeda212f317a927575c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:26:45 +0300 Subject: [PATCH 213/269] Fix quit deadlock --- src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 0adba0b98ce..f107b4f4ed8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -333,7 +333,7 @@ public static void invalidateLevelData(LevelAccessor level) { } } } finally { - BLOOM_RENDER_LOCK.readLock().lock(); + BLOOM_RENDER_LOCK.readLock().unlock(); } if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { From 4f9ade2b422e348438e86e85375053063dea3709 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:27:56 +0300 Subject: [PATCH 214/269] Wrong package bucko --- src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java | 2 +- .../bloom/{safemode => normal}/LevelRendererAccessor.java | 2 +- src/main/resources/gtceu.mixins.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{safemode => normal}/LevelRendererAccessor.java (88%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index f107b4f4ed8..f6fc417b4cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -9,7 +9,7 @@ import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; -import com.gregtechceu.gtceu.core.mixins.client.bloom.safemode.LevelRendererAccessor; +import com.gregtechceu.gtceu.core.mixins.client.bloom.normal.LevelRendererAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/LevelRendererAccessor.java similarity index 88% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/LevelRendererAccessor.java index 3607b5900d3..ce5433f245f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/LevelRendererAccessor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; +package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 14656a475ee..93bc8270c0e 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -33,6 +33,7 @@ "client.bloom.PostChainAccessor", "client.bloom.PostChainMixin", "client.bloom.normal.ForgeModelBlockRendererMixin", + "client.bloom.normal.LevelRendererAccessor", "client.bloom.normal.ModelBlockRendererMixin", "client.bloom.normal.QuadLighterMixin", "client.bloom.normal.RebuildTaskMixin", @@ -41,7 +42,6 @@ "client.bloom.normal.embeddium.DefaultMaterialsMixin", "client.bloom.normal.embeddium.DefaultTerrainRenderPassesMixin", "client.bloom.normal.oculus.WorldRenderingPhaseMixin", - "client.bloom.safemode.LevelRendererAccessor", "client.bloom.safemode.LevelRendererMixin", "client.bloom.safemode.ModelBlockRendererMixin", "client.bloom.safemode.QuadLighterMixin", From 75939d88a7fcf0cf252b842dfd437ce7d4b0d525 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:28:29 +0300 Subject: [PATCH 215/269] Init post shader at the same time MC does it --- .../gtceu/client/bloom/BloomShaderManager.java | 9 +++------ .../core/mixins/client/bloom/LevelRendererMixin.java | 6 +++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index 6c0da68027e..2ec818cacae 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -44,11 +44,10 @@ public static void onRegisterShaders(RegisterShadersEvent event) throws IOExcept event.registerShader(new ShaderInstance(event.getResourceProvider(), GTCEu.id("rendertype_entity_bloom"), DefaultVertexFormat.NEW_ENTITY), shader -> rendertypeEntityBloomShader = shader); - - initPostShaders(); } - private static void initPostShaders() { + @ApiStatus.Internal + public static void initPostShaders() { deinitPostShaders(); // forcefully update availability on (re-)load @@ -93,11 +92,9 @@ private static void initPostShaders() { } } - @ApiStatus.Internal - public static void deinitPostShaders() { + private static void deinitPostShaders() { if (BLOOM_CHAIN != null) { BLOOM_CHAIN.close(); - // noinspection DataFlowIssue // they should always be null or not together BLOOM_TARGET.destroyBuffers(); BLOOM_CHAIN = null; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 4df5eb444a5..9d84ae1994a 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -30,9 +30,9 @@ public abstract class LevelRendererMixin { } } - @Inject(method = "deinitTransparency", at = @At("TAIL")) - private void gtceu$deinitBloomEffect(CallbackInfo ci) { - BloomShaderManager.deinitPostShaders(); + @Inject(method = "graphicsChanged", at = @At(value = "HEAD")) + private void gtceu$reinitBloomEffect(CallbackInfo ci) { + BloomShaderManager.initPostShaders(); } @Definition(id = "renderBuffers", From 6261ea7b2c30a122d7ad0480a86552ef6e4ccf10 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:28:59 +0300 Subject: [PATCH 216/269] Fix safe mode config not being used correctly --- .../gtceu/core/config/GTEarlyConfig.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java index d69fec3d5a5..d0228a8a700 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java +++ b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java @@ -17,7 +17,7 @@ */ public class GTEarlyConfig { - public static final String SAFE_MODE_CONFIG_NAME = "client.bloom.safe_mode"; + public static final String SAFE_MODE_CONFIG_NAME = "client.bloom.safe_mode."; private static final Logger LOGGER = LogManager.getLogger("GTEarlyConfig"); @@ -29,14 +29,16 @@ private GTEarlyConfig(File file) { // Defines the default rules which can be configured by the user or other mods. // You must manually add a rule for any new mixins not covered by an existing package rule. - Option option = addMixinRule(SAFE_MODE_CONFIG_NAME, false); + final String safeModeConfig = "client.bloom.safe_mode"; // no trailing dot + + Option option = addMixinRule(safeModeConfig, false); option.addComment( "Whether to use a 'safe mode' for bloom rendering", - "NOTE: considerably slower than the normal process, but likely fixes compatibility issues with other mods.", + "NOTE: considerably slower than the normal logic, but likely fixes compatibility issues with other mods.", "Requires restarting the client to take effect."); - addDelegateRule("client.bloom.safemode", SAFE_MODE_CONFIG_NAME, false); - addDelegateRule("client.bloom.normal", SAFE_MODE_CONFIG_NAME, true); + addDelegateRule("client.bloom.safemode", safeModeConfig, false); + addDelegateRule("client.bloom.normal", safeModeConfig, true); // hidden rules for dev-only mixins addHiddenRule("dev", !FMLLoader.isProduction()); @@ -49,7 +51,8 @@ private GTEarlyConfig(File file) { final String[] EMBEDDIUM_MOD_IDS = { "embeddium", "sodium" }; final String[] OCULUS_MOD_IDS = { "oculus", "iris" }; - enableIfModPresent("client.embeddium", EMBEDDIUM_MOD_IDS); + enableIfModPresent("embeddium", EMBEDDIUM_MOD_IDS); + enableIfModPresent("oculus", OCULUS_MOD_IDS); enableIfModPresent("client.bloom.normal.embeddium", EMBEDDIUM_MOD_IDS); enableIfModPresent("client.bloom.normal.oculus", OCULUS_MOD_IDS); enableIfModPresent("client.bloom.safemode.embeddium", EMBEDDIUM_MOD_IDS); @@ -92,16 +95,14 @@ private void disableIfModPresent(String configName, String... ids) { private void enableIfModPresent(String configName, String... ids) { Option option = this.options.get(configName); if (option == null) { - option = addMixinRule(configName, true); + option = addMixinRule(configName, false); } option.setHidden(true); for (String id : ids) { if (isModLoaded(id)) { - option.clearModsDefiningValue(); - break; + option.addModOverride(true, id); } - option.addModOverride(false, id); } } @@ -289,7 +290,7 @@ public void save() throws IOException { writer.write("#\n"); if (option.getComment() != null) { for (String commentLine : option.getComment()) { - writer.write("# " + commentLine + "\n"); + writer.write("# # " + commentLine + "\n"); } } writer.write("# " + line + extraContext + "\n"); From 50d1ad9a5d8e2f2f0d8b84ce7ef0eb4f20cba6bd Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:33:26 +0300 Subject: [PATCH 217/269] Apparently ConcurrentHashMap doesn't like null values. --- .../client/model/ctm/GTTextureMetadata.java | 2 ++ .../client/util/TextureMetadataHelper.java | 31 ++++++++----------- 2 files changed, 15 insertions(+), 18 deletions(-) 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 a96fe6cc5cb..e7f733011e1 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 @@ -24,6 +24,8 @@ public record GTTextureMetadata(@Nullable ResourceLocation connectionTexture, Tr public static final String SECTION_NAME = GTCEu.MOD_ID; public static final MetadataSectionSerializer SERIALIZER = new Serializer(); + public static final GTTextureMetadata EMPTY = new GTTextureMetadata(null, TriState.DEFAULT); + /** * @apiNote This method throws {@link IOException} even though it isn't specified in the method definition. */ diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java index 13cc3a7e5d1..9dea79b910e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -14,7 +14,6 @@ import net.minecraft.resources.ResourceLocation; import lombok.experimental.UtilityClass; -import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.Optional; @@ -23,25 +22,21 @@ @UtilityClass public class TextureMetadataHelper { - private static final Map metadataCache = new ConcurrentHashMap<>(); + private static final Map> metadataCache = new ConcurrentHashMap<>(); public static Optional getMetadata(ResourceLocation res) { - // Note, semantically different from computeIfAbsent, as we DO care about keys mapped to null values - if (metadataCache.containsKey(res)) { - return Optional.ofNullable(metadataCache.get(res)); - } - Optional ret; - try { - ret = Minecraft.getInstance().getResourceManager().getResource(res) - .flatMap(GTTextureMetadata::getForResourceUnsafe); - } catch (Exception e) { - // the real exception that's caught should always be an IOException, - // but @SneakyThrows hides that from us so we catch all exceptions instead. - ret = Optional.empty(); - GTCEu.LOGGER.error("Error loading metadata for location {}", res, e); - } - ret.ifPresentOrElse(r -> metadataCache.put(res, r), () -> metadataCache.put(res, null)); - return ret; + return metadataCache.computeIfAbsent(res, loc -> { + try { + return Minecraft.getInstance().getResourceManager().getResource(res) + .flatMap(GTTextureMetadata::getForResourceUnsafe); + } catch (Exception e) { + // the real exception that's caught should always be an IOException, + // but @SneakyThrows hides that from us so we catch all exceptions instead. + GTCEu.LOGGER.error("Error loading metadata for location {}", res, e); + + return Optional.empty(); + } + }); } public static Optional getMetadata(TextureAtlasSprite sprite) { From 5dc5953fe53469e5d089765f7bc2a0922a1a67d2 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:33:36 +0300 Subject: [PATCH 218/269] Wrong uniform type --- .../java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java index 183a4522d6c..5582d106239 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java @@ -76,7 +76,7 @@ public static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum fr } if (chunkOffset != null) { - chunkOffset.set(0, 0, 0); + chunkOffset.set(0.0f, 0.0f, 0.0f); } shader.clear(); VertexBuffer.unbind(); From daf7b97b4d4f57f414e0b0f3129b397f69060af1 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:34:52 +0300 Subject: [PATCH 219/269] nnnnevermind, draw it after translucent. and check the color. --- .../client/bloom/LevelRendererMixin.java | 23 ++++++++----------- .../shaders/program/filter_bloom_color.fsh | 4 ++++ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 9d84ae1994a..f825a4a58f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -35,20 +35,17 @@ public abstract class LevelRendererMixin { BloomShaderManager.initPostShaders(); } - @Definition(id = "renderBuffers", - field = "Lnet/minecraft/client/renderer/LevelRenderer;renderBuffers:Lnet/minecraft/client/renderer/RenderBuffers;") - @Definition(id = "crumblingBufferSource", - method = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;") - @Definition(id = "endBatch", method = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V") - @Expression("this.renderBuffers.crumblingBufferSource().endBatch()") + @Definition(id = "renderChunkLayer", + method = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V") + @Definition(id = "tripwire", + method = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;") + @Expression("this.renderChunkLayer(tripwire(), ?, ?, ?, ?, ?)") @Inject(method = "renderLevel", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) - private void gtceu$renderBloomBeforeTranslucent(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, - GameRenderer gameRenderer, - LightTexture lightTexture, Matrix4f projectionMatrix, - CallbackInfo ci, - @Local Frustum frustum, - @Local ProfilerFiller profilerFiller) { + private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, + boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, + LightTexture lightTexture, Matrix4f projectionMatrix, + CallbackInfo ci, + @Local Frustum frustum, @Local ProfilerFiller profilerFiller) { BloomUtil.renderBloom(camera, poseStack, frustum, projectionMatrix, partialTick, (LevelRenderer) (Object) this, profilerFiller); } 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 d342ceba752..13e2ba614a8 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 @@ -32,5 +32,9 @@ void main() { if (abs(mainDepth - diffuseDepth) > 0.01) { fragColor = vec4(0.0); } + // also clear it if the main sampler's color is off by too much + else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { + fragColor = vec4(0.0); + } } } From b7399acb39a34b3bc65101ebf8dce2f814b173b9 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 17:35:11 +0300 Subject: [PATCH 220/269] Remove early config printout --- .../gtceu/core/mixins/GTMixinPlugin.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 4f722ebb7e9..095d85f8ddd 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -36,21 +36,6 @@ public GTMixinPlugin() { throw new RuntimeException("Could not load mixin configuration file for GTCEu", e); } - CONFIG.getOptionMap().values().forEach(option -> { - if (option.isOverridden()) { - String source = "[unknown]"; - - if (option.isUserDefined()) { - source = "user configuration"; - } else if (!FMLLoader.getLoadingModList().getErrors().isEmpty()) { - source = "load error"; - } else if (option.isModDefined()) { - source = "mods [" + String.join(", ", option.getDefiningMods()) + "]"; - } - LOGGER.warn("Option '{}' overridden (by {}) to '{}'", option.getName(), source, option.isEnabled()); - } - }); - if (OPTIFINE_PRESENT) { LOGGER.fatal( "OptiFine detected. Use of GTCEu with OptiFine is not supported due to its breakage of Forge features."); From 2df356623f98b94855faabc1d577b2e233d81d0a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 18:01:48 +0300 Subject: [PATCH 221/269] Revert "nnnnevermind, draw it after translucent. and check the color." This reverts commit daf7b97b4d4f57f414e0b0f3129b397f69060af1. --- .../client/bloom/LevelRendererMixin.java | 22 ++++++++++--------- .../shaders/program/filter_bloom_color.fsh | 4 ---- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index f825a4a58f6..2171e925539 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -35,17 +35,19 @@ public abstract class LevelRendererMixin { BloomShaderManager.initPostShaders(); } - @Definition(id = "renderChunkLayer", - method = "Lnet/minecraft/client/renderer/LevelRenderer;renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V") - @Definition(id = "tripwire", - method = "Lnet/minecraft/client/renderer/RenderType;tripwire()Lnet/minecraft/client/renderer/RenderType;") - @Expression("this.renderChunkLayer(tripwire(), ?, ?, ?, ?, ?)") + @Definition(id = "renderBuffers", + field = "Lnet/minecraft/client/renderer/LevelRenderer;renderBuffers:Lnet/minecraft/client/renderer/RenderBuffers;") + @Definition(id = "crumblingBufferSource", + method = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;") + @Definition(id = "endBatch", method = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V") + @Expression("this.renderBuffers.crumblingBufferSource().endBatch()") @Inject(method = "renderLevel", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) - private void gtceu$renderBloom(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - LightTexture lightTexture, Matrix4f projectionMatrix, - CallbackInfo ci, - @Local Frustum frustum, @Local ProfilerFiller profilerFiller) { + private void gtceu$renderBloomBeforeTranslucent(PoseStack poseStack, float partialTick, long finishNanoTime, + boolean renderBlockOutline, Camera camera, + GameRenderer gameRenderer, + LightTexture lightTexture, Matrix4f projectionMatrix, + CallbackInfo ci, + @Local Frustum frustum, @Local ProfilerFiller profilerFiller) { BloomUtil.renderBloom(camera, poseStack, frustum, projectionMatrix, partialTick, (LevelRenderer) (Object) this, profilerFiller); } 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 13e2ba614a8..d342ceba752 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 @@ -32,9 +32,5 @@ void main() { if (abs(mainDepth - diffuseDepth) > 0.01) { fragColor = vec4(0.0); } - // also clear it if the main sampler's color is off by too much - else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { - fragColor = vec4(0.0); - } } } From f9b7e1869168c0741cab61c64ec8fecadaa6d933 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 19:04:23 +0300 Subject: [PATCH 222/269] Fix quads with shade or ambient occlusion always having bloom --- .../gregtechceu/gtceu/client/util/TextureMetadataHelper.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java index 9dea79b910e..e9e4ba4130f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureMetadataHelper.java @@ -62,9 +62,6 @@ public static ResourceLocation spriteToAbsolute(ResourceLocation sprite) { } public static boolean hasBloom(BakedQuad quad, int[] ambientPackedLights) { - if (!quad.isShade() || !quad.hasAmbientOcclusion()) { - return true; - } var metadata = getMetadata(quad.getSprite()); if (metadata.isPresent()) { TriState bloomValue = metadata.get().bloom(); From 6e343e0052c9fc223bf41a8be5808255edbd5386 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 19:04:59 +0300 Subject: [PATCH 223/269] Fix bloom fragment filtering --- .../gtceu/client/bloom/BloomUtil.java | 23 +++++++++++-------- .../shaders/program/filter_bloom_color.fsh | 4 +--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index f6fc417b4cc..cdbbbb7630c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -184,25 +184,28 @@ public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frust profilerFiller.popPush("gtceu:bloom"); BloomUtil.setupBloomShaderUniforms(); + GTRenderTypes.bloom().setupRenderState(); + + renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); + // if safe mode is enabled, don't draw block bloom the 'normal' way if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { - BloomUtil.setFilterToggleUniform(true); ((LevelRendererAccessor) levelRenderer).invokeRenderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); - BloomUtil.setFilterToggleUniform(false); - } - // have to re-setup here. so sad. very aw. - GTRenderTypes.bloom().setupRenderState(); - - renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); - if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { - BloomUtil.setFilterToggleUniform(true); + // have to re-setup here. so sad. very aw. + GTRenderTypes.bloom().setupRenderState(); + } + // use BloomSafeMode.drawBlockBloom instead + else { BloomSafeMode.drawBlockBloom(camera, poseStack, frustum, projectionMatrix, levelRenderer, profilerFiller); - BloomUtil.setFilterToggleUniform(false); } + + BloomUtil.setFilterToggleUniform(true); BloomUtil.processPostEffect(partialTicks, profilerFiller); + BloomUtil.setFilterToggleUniform(false); + // clear state. again. GTRenderTypes.bloom().clearRenderState(); // profiler section is popped by popPush() in the calling function; don't pop it here 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 d342ceba752..2724dfabcdb 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 @@ -2,7 +2,6 @@ uniform sampler2D DiffuseSampler; uniform sampler2D DiffuseDepthSampler; -uniform sampler2D MainSampler; uniform sampler2D MainDepthSampler; uniform bool EnableFilter; @@ -23,11 +22,10 @@ float linearizeDepth(float depth) { void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { - vec4 mainColor = texture(MainSampler, texCoord); - // 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) > 0.01) { fragColor = vec4(0.0); From 0758c321a5f15d9bde19ebfdeb8690cc082ffbb0 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 19:29:08 +0300 Subject: [PATCH 224/269] Apply patch --- .../registry/registrate/MachineBuilder.java | 5 +- .../provider/GTBlockstateProvider.java | 24 ++- .../gtceu/common/data/GTMachines.java | 14 +- .../common/data/machines/GTMultiMachines.java | 1 + .../common/data/models/GTMachineModels.java | 145 ++++++++---------- .../model/builder/MachineModelBuilder.java | 14 +- 6 files changed, 103 insertions(+), 100 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index c1b59704aa3..455863eca4b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -717,9 +717,8 @@ public DEFINITION register() { @FunctionalInterface public interface ModelInitializer { - void configureModel(@NotNull DataGenContext context, - @NotNull GTBlockstateProvider provider, - @NotNull MachineModelBuilder builder); + void configureModel(DataGenContext context, GTBlockstateProvider provider, + MachineModelBuilder builder); default ModelInitializer andThen(ModelInitializer after) { Objects.requireNonNull(after); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java index 6b7789b5159..5a669b9c9a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java @@ -101,20 +101,18 @@ public T addVanillaGenerator(Block block, T gene if (rotationState == RotationState.NONE) return null; PropertyDispatch dispatch; - if (!allowExtendedFacing) { - var disp = PropertyDispatch.property(rotationState.property); - - dispatch = disp.generate((front) -> { - var orientation = ExtendedBlockModelRotation.get(front, Direction.NORTH); - return applyOrientation(Variant.variant(), orientation); - }); + if (allowExtendedFacing) { + dispatch = PropertyDispatch.properties(rotationState.property, GTBlockStateProperties.UPWARDS_FACING) + .generate((front, up) -> { + var orientation = ExtendedBlockModelRotation.get(front, up); + return applyOrientation(Variant.variant(), orientation); + }); } else { - var disp = PropertyDispatch.properties(rotationState.property, GTBlockStateProperties.UPWARDS_FACING); - - dispatch = disp.generate((front, up) -> { - var orientation = ExtendedBlockModelRotation.get(front, up); - return applyOrientation(Variant.variant(), orientation); - }); + dispatch = PropertyDispatch.property(rotationState.property) + .generate((front) -> { + var orientation = ExtendedBlockModelRotation.get(front, Direction.NORTH); + return applyOrientation(Variant.variant(), orientation); + }); } return dispatch; } 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 dfdf9ae80ef..1dcb16fd70c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -40,6 +40,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fml.ModLoader; @@ -878,7 +879,18 @@ public class GTMachines { .rotationState(RotationState.ALL) .abilities(PartAbility.PUMP_FLUID_HATCH) .modelProperty(IS_FORMED, false) - .model(createBasicReplaceableTextureMachineModel(GTCEu.id("block/machine/part/pump_hatch"))) + .model(createBasicReplaceableTextureMachineModel(GTCEu.id("block/machine/part/pump_hatch")) + .andThen(builder -> { + // UV lock the model so the plank texture doesn't rotate weirdly + builder.replaceForAllStates((state, models) -> { + for (int i = 0; i < models.length; i++) { + models[i] = ConfiguredModel.builder() + .modelFile(models[i].model).uvLock(true) + .buildLast(); + } + return models; + }); + })) .register(); public static final MachineDefinition MAINTENANCE_HATCH = REGISTRATE diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java index dfbcf64b53d..a4f22f1f7ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java @@ -585,6 +585,7 @@ public class GTMultiMachines { .model(createSidedWorkableCasingMachineModel(GTCEu.id("block/casings/pump_deck"), GTCEu.id("block/multiblock/primitive_pump")) .andThen(builder -> { + // UV lock the model so the plank texture doesn't rotate weirdly builder.replaceForAllStates((state, models) -> { for (int i = 0; i < models.length; i++) { models[i] = ConfiguredModel.builder() diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java index 6ba47cd12d2..17453ba2366 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java @@ -30,6 +30,7 @@ import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Locale; @@ -70,14 +71,14 @@ public class GTMachineModels { public static MachineBuilder.ModelInitializer createBasicMachineModel(ResourceLocation baseModel) { return (ctx, prov, builder) -> { var model = prov.models().getExistingFile(baseModel); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); }; } public static MachineBuilder.ModelInitializer createBasicReplaceableTextureMachineModel(ResourceLocation baseModel) { return (ctx, prov, builder) -> { var model = prov.models().getExistingFile(baseModel); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); builder.addReplaceableTextures("bottom", "top", "side"); }; } @@ -88,7 +89,7 @@ public static MachineBuilder.ModelInitializer createTieredHullMachineModel(Resou .parent(prov.models().getExistingFile(parentModel)); tieredHullTextures(model, builder.getOwner().getTier()); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); }; } @@ -97,7 +98,7 @@ public static MachineBuilder.ModelInitializer createOverlayTieredHullMachineMode BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); tieredHullTextures(model, builder.getOwner().getTier()); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -110,7 +111,7 @@ public static MachineBuilder.ModelInitializer createOverlayCasingMachineModel(Re .parent(prov.models().getExistingFile(overlayModel)); model.texture("all", baseCasingTexture); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); builder.addReplaceableTextures("all"); }; } @@ -119,11 +120,11 @@ public static MachineBuilder.ModelInitializer createColorOverlayTieredHullMachin @Nullable ResourceLocation pipeOverlay, @Nullable ResourceLocation emissiveOverlay) { return (ctx, prov, builder) -> { - builder.forAllStatesModels(state -> { - BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, state, - prov.models()); + builder.forAllStatesModelsExcept(state -> { + BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, + state, prov.models()); return tieredHullTextures(model, builder.getOwner().getTier()); - }); + }, IS_FORMED); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -137,7 +138,7 @@ public static MachineBuilder.ModelInitializer createSingleOverlayTieredHullMachi .texture("overlay", overlayTexture) .texture("overlay_emissive", emissiveOverlayTexture); tieredHullTextures(model, builder.getOwner().getTier()); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -147,25 +148,25 @@ public static MachineBuilder.ModelInitializer createWorkableTieredHullMachineMod return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStates(state -> { + builder.forAllStatesModelsExcept(state -> { RecipeLogic.Status status = state.getValue(RECIPE_LOGIC_STATUS); BlockModelBuilder model = prov.models().nested().parent(tieredHullModel(prov.models(), builder)); return addWorkableOverlays(overlays, status, model); - }); + }, IS_FORMED); }; } public static MachineBuilder.ModelInitializer createOverlaySteamHullMachineModel(ResourceLocation overlayModel) { return (ctx, prov, builder) -> { - builder.forAllStatesModels(state -> { + builder.forAllStatesModelsExcept(state -> { boolean steel = state.getOptionalValue(IS_STEEL_MACHINE).orElse(false); BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); steamCasingTextures(model, steel); return model; - }); + }, IS_FORMED); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -175,12 +176,12 @@ public static MachineBuilder.ModelInitializer createColorOverlaySteamHullMachine @Nullable ResourceLocation pipeOverlay, @Nullable ResourceLocation emissiveOverlay) { return (ctx, prov, builder) -> { - builder.forAllStatesModels(state -> { - BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, state, - prov.models()); + builder.forAllStatesModelsExcept(state -> { + BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, + state, prov.models()); steamCasingTextures(model, state.getOptionalValue(IS_STEEL_MACHINE).orElse(false)); return model; - }); + }, IS_FORMED); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -228,14 +229,14 @@ public static MachineBuilder.ModelInitializer createWorkableCasingMachineModel(R return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStates(state -> { + builder.forAllStatesModelsExcept(state -> { RecipeLogic.Status status = state.getValue(RECIPE_LOGIC_STATUS); BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(CUBE_ALL_SIDED_OVERLAY_MODEL)) .texture("all", baseCasingTexture); return addWorkableOverlays(overlays, status, model); - }); + }, IS_FORMED); builder.addTextureOverride("all", baseCasingTexture); }; } @@ -247,7 +248,7 @@ public static MachineBuilder.ModelInitializer createSidedOverlayCasingMachineMod BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); casingTextures(model, baseCasingTexture); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -258,14 +259,14 @@ public static MachineBuilder.ModelInitializer createSidedWorkableCasingMachineMo return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStates(state -> { + builder.forAllStatesModelsExcept(state -> { RecipeLogic.Status status = state.getValue(RECIPE_LOGIC_STATUS); BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); casingTextures(model, baseCasingTexture); return addWorkableOverlays(overlays, status, model); - }); + }, IS_FORMED); var texturePath = baseCasingTexture; if (!texturePath.getPath().endsWith("/")) { @@ -325,7 +326,7 @@ public static MachineBuilder.ModelInitializer createBatteryBufferModel(int inven .texture("overlay_out_io", BLANK_TEXTURE); tieredHullTextures(model, builder.getOwner().getTier()); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); }; } @@ -362,17 +363,14 @@ public static MachineBuilder.ModelInitializer createChargerModel() { }); }; } - // spotless:on public static final ResourceLocation TRANSFORMER_LIKE = GTCEu.id("block/machine/template/transformer_like_machine"); public static final ResourceLocation CONVERTER_FE_IN = GTCEu.id("block/overlay/converter/converter_native_in"); public static final ResourceLocation CONVERTER_FE_OUT = GTCEu.id("block/overlay/converter/converter_native_out"); - public static final ResourceLocation CONVERTER_FE_IN_EMISSIVE = GTCEu - .id("block/overlay/converter/converter_native_in_emissive"); - public static final ResourceLocation CONVERTER_FE_OUT_EMISSIVE = GTCEu - .id("block/overlay/converter/converter_native_out_emissive"); + public static final ResourceLocation CONVERTER_FE_IN_EMISSIVE = GTCEu.id("block/overlay/converter/converter_native_in_emissive"); + public static final ResourceLocation CONVERTER_FE_OUT_EMISSIVE = GTCEu.id("block/overlay/converter/converter_native_out_emissive"); public static MachineBuilder.ModelInitializer createConverterModel(int amperage) { return (ctx, prov, builder) -> { @@ -398,14 +396,14 @@ public static MachineBuilder.ModelInitializer createConverterModel(int amperage) tieredHullTextures(feToEuModel, builder.getOwner().getTier()); builder.partialState() - .with(IS_FE_TO_EU, false) - .setModel(euToFeModel) + .with(IS_FE_TO_EU, false) + .setModel(euToFeModel) .partialState() - .with(IS_FE_TO_EU, true) - .setModel(feToEuModel) - .end(); + .with(IS_FE_TO_EU, true) + .setModel(feToEuModel); }; } + // spotless:on public static MachineBuilder.ModelInitializer createCrateModel(boolean wooden) { return (ctx, prov, builder) -> { @@ -425,7 +423,7 @@ public static MachineBuilder.ModelInitializer createCrateModel(boolean wooden) { public static MachineBuilder.ModelInitializer createDiodeModel() { return (ctx, prov, builder) -> { - builder.forAllStatesModels(renderState -> { + builder.forAllStatesModelsExcept(renderState -> { DiodePartMachine.AmpMode mode = renderState.getValue(DIODE_AMP_MODE); final EnergyIOOverlay energyIn = IN_OVERLAYS_FOR_AMP.get(mode.getAmpValue()); final EnergyIOOverlay energyOut = OUT_OVERLAYS_FOR_AMP.get(mode.getAmpValue()); @@ -440,7 +438,7 @@ public static MachineBuilder.ModelInitializer createDiodeModel() { .texture("overlay_out_tinted", energyOut.getTintedPart()); tieredHullTextures(model, builder.getOwner().getTier()); return model; - }); + }, IS_FORMED); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -448,7 +446,7 @@ public static MachineBuilder.ModelInitializer createDiodeModel() { public static MachineBuilder.ModelInitializer createTransformerModel(int baseAmp) { return (ctx, prov, builder) -> { - builder.forAllStatesModels(renderState -> { + builder.forAllStatesModelsExcept(renderState -> { boolean transformUp = renderState.getValue(IS_TRANSFORM_UP); EnergyIOOverlay frontFace = (transformUp ? OUT_OVERLAYS_FOR_AMP : IN_OVERLAYS_FOR_AMP) .get(baseAmp); @@ -464,7 +462,7 @@ public static MachineBuilder.ModelInitializer createTransformerModel(int baseAmp .texture("overlay_out_tinted", otherFace.getTintedPart()); tieredHullTextures(model, builder.getOwner().getTier()); return model; - }); + }, IS_FORMED); }; } @@ -526,23 +524,9 @@ public static MachineBuilder.ModelInitializer createWorldAcceleratorModel(Resour WorkableOverlays rtOverlays = WorkableOverlays.get(rtModeModelPath, prov.getExistingFileHelper()); WorkableOverlays beOverlays = WorkableOverlays.get(beModeModelPath, prov.getExistingFileHelper()); - builder.forAllStates(state -> { - boolean rtMode = state.getValue(IS_RANDOM_TICK_MODE); - WorkableOverlays overlays = rtMode ? rtOverlays : beOverlays; - - boolean active = state.getValue(IS_ACTIVE); - boolean workingEnabled = state.getValue(IS_WORKING_ENABLED); - RecipeLogic.Status status = active ? - workingEnabled ? - RecipeLogic.Status.WORKING : - RecipeLogic.Status.SUSPEND : - RecipeLogic.Status.IDLE; - - BlockModelBuilder model = prov.models().nested() - .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); - tieredHullTextures(model, builder.getOwner().getTier()); - - return addWorkableOverlays(overlays, status, model); + builder.forAllStatesModels(state -> { + WorkableOverlays overlays = state.getValue(IS_RANDOM_TICK_MODE) ? rtOverlays : beOverlays; + return createModelFromActiveWorkingState(prov, builder, overlays, state); }); }; } @@ -552,7 +536,7 @@ public static MachineBuilder.ModelInitializer createWorldAcceleratorModel(Resour public static MachineBuilder.ModelInitializer createMaintenanceModel(ResourceLocation overlayModel) { return (ctx, prov, builder) -> { - builder.forAllStatesModels(state -> { + builder.forAllStatesModelsExcept(state -> { var baseModel = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); tieredHullTextures(baseModel, builder.getOwner().getTier()); @@ -561,7 +545,7 @@ public static MachineBuilder.ModelInitializer createMaintenanceModel(ResourceLoc baseModel.texture("overlay_2", MAINTENANCE_TAPED_OVERLAY); } return baseModel; - }); + }, IS_FORMED); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -571,6 +555,7 @@ public static MachineBuilder.ModelInitializer createMaintenanceModel(ResourceLoc public static final ResourceLocation HPCA_PART_MODEL = GTCEu.id("block/machine/template/part/hpca_part_machine"); public static final ResourceLocation COMPUTER_CASING_TEXTURE = GTCEu.id("block/casings/hpca/computer_casing/"); public static final ResourceLocation ADVANCED_COMPUTER_CASING_TEXTURE = GTCEu.id("block/casings/hpca/advanced_computer_casing/"); + // spotless:on public static MachineBuilder.ModelInitializer createHPCAPartModel(boolean advanced, ResourceLocation normalTexture, @@ -586,14 +571,14 @@ public static MachineBuilder.ModelInitializer createHPCAPartModel(boolean advanc casingTexture(baseModel, "back", textures); casingTexture(baseModel, "side", textures); - builder.forAllStatesModels(state -> { + builder.forAllStatesModelsExcept(state -> { boolean damaged = state.getValue(IS_HPCA_PART_DAMAGED); boolean active = state.getValue(IS_ACTIVE); return prov.models().nested().parent(baseModel) .texture("overlay", overlay.getTexture(active, damaged)) .texture("overlay_emissive", overlay.getEmissiveTexture(active, damaged)); - }); + }, IS_FORMED); }; } @@ -609,7 +594,7 @@ public static MachineBuilder.ModelInitializer createFisherModel() { .texture("overlay_emissive", OVERLAY_QTANK_EMISSIVE_TEXTURE); tieredHullTextures(model, builder.getOwner().getTier()); - builder.forAllStatesModels(state -> model); + builder.partialState().setModel(model); }; } @@ -617,28 +602,31 @@ public static MachineBuilder.ModelInitializer createItemCollectorModel(ResourceL return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStates(state -> { - boolean active = state.getValue(IS_ACTIVE); - boolean workingEnabled = state.getValue(IS_WORKING_ENABLED); - RecipeLogic.Status status = active ? - workingEnabled ? - RecipeLogic.Status.WORKING : - RecipeLogic.Status.SUSPEND : - RecipeLogic.Status.IDLE; + builder.forAllStatesModels(state -> createModelFromActiveWorkingState(prov, builder, overlays, state)); + }; + } - BlockModelBuilder model = prov.models().nested() - .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); - tieredHullTextures(model, builder.getOwner().getTier()); + public static ModelFile createModelFromActiveWorkingState(@NotNull GTBlockstateProvider prov, + @NotNull MachineModelBuilder builder, + WorkableOverlays overlays, MachineRenderState state) { + RecipeLogic.Status status = state.getValue(IS_ACTIVE) ? + state.getValue(IS_WORKING_ENABLED) ? + RecipeLogic.Status.WORKING : + RecipeLogic.Status.SUSPEND : + RecipeLogic.Status.IDLE; - return addWorkableOverlays(overlays, status, model); - }); - }; + BlockModelBuilder model = prov.models().nested() + .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); + tieredHullTextures(model, builder.getOwner().getTier()); + + return addWorkableOverlays(overlays, status, model); } // endregion // region helper functions + // spotless:off public static NonNullBiConsumer, GTBlockstateProvider> createMachineModel(MachineBuilder.ModelInitializer modelInitializer) { return (ctx, prov) -> { Block block = ctx.getEntry(); @@ -652,8 +640,9 @@ public static MachineBuilder.ModelInitializer createItemCollectorModel(ResourceL MachineModelBuilder builder = prov.models().getBuilder(modelLocation) .customLoader(MachineModelBuilder.begin(definition)); modelInitializer.configureModel(ctx, prov, builder); + final BlockModelBuilder model = builder.end(); - model.parent(prov.models().getExistingFile(prov.mcLoc("block/block"))); + model.parent(new ModelFile.UncheckedModelFile("block/block")); var generator = prov.multiVariantGenerator(block, Variant.variant().with(VariantProperties.MODEL, model.getLocation())); @@ -665,8 +654,8 @@ public static MachineBuilder.ModelInitializer createItemCollectorModel(ResourceL } // spotless:on - public static ConfiguredModel[] addWorkableOverlays(WorkableOverlays overlays, RecipeLogic.Status status, - BlockModelBuilder model) { + public static ModelFile addWorkableOverlays(WorkableOverlays overlays, RecipeLogic.Status status, + BlockModelBuilder model) { for (var entry : overlays.getTextures().entrySet()) { var face = entry.getKey(); var textures = entry.getValue(); @@ -681,7 +670,7 @@ public static ConfiguredModel[] addWorkableOverlays(WorkableOverlays overlays, R model.texture(OVERLAY_PREFIX + face.getName() + EMISSIVE_SUFFIX, overlayEmissive); } } - return ConfiguredModel.builder().modelFile(model).build(); + return model; } public static BlockModelBuilder colorOverlayHullModel(ResourceLocation overlay, diff --git a/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java index 27284c95f96..f532e194db5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java @@ -302,7 +302,12 @@ public PartBuilder part(ResourceLocation model) { } public MachineModelBuilder forAllStatesModels(Function mapper) { - return forAllStates(mapper.andThen(m -> ConfiguredModel.builder().modelFile(m).build())); + return forAllStatesModelsExcept(mapper); + } + + public MachineModelBuilder forAllStatesModelsExcept(Function mapper, + Property... ignored) { + return forAllStatesExcept(mapper.andThen(m -> ConfiguredModel.builder().modelFile(m).build()), ignored); } public MachineModelBuilder forAllStates(Function mapper) { @@ -357,15 +362,14 @@ public static class PartialState> implements Predicate private final MachineDefinition owner; @Getter private final SortedMap, Comparable> setStates; - @Nullable private final MachineModelBuilder outerBuilder; - private PartialState(MachineDefinition owner, @Nullable MachineModelBuilder outerBuilder) { + private PartialState(MachineDefinition owner, MachineModelBuilder outerBuilder) { this(owner, ImmutableMap.of(), outerBuilder); } private PartialState(MachineDefinition owner, Map, Comparable> setStates, - @Nullable MachineModelBuilder outerBuilder) { + MachineModelBuilder outerBuilder) { this.owner = owner; this.outerBuilder = outerBuilder; for (Map.Entry, Comparable> entry : setStates.entrySet()) { @@ -688,7 +692,7 @@ public class ConditionGroup { .arrayListValues() .build(); public final List nestedConditionGroups = new ArrayList<>(); - private ConditionGroup parent = null; + private @Nullable ConditionGroup parent = null; public boolean useOr; /** From f8176d1f05e9aa1046260a2abdb8af702ec1f762 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 20:51:17 +0300 Subject: [PATCH 225/269] DOH --- .../assets/gtceu/shaders/program/filter_bloom_color.fsh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 2724dfabcdb..13e2ba614a8 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 @@ -2,6 +2,7 @@ uniform sampler2D DiffuseSampler; uniform sampler2D DiffuseDepthSampler; +uniform sampler2D MainSampler; uniform sampler2D MainDepthSampler; uniform bool EnableFilter; @@ -22,13 +23,18 @@ float linearizeDepth(float depth) { void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { + vec4 mainColor = texture(MainSampler, texCoord); + // 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) > 0.01) { fragColor = vec4(0.0); } + // also clear it if the main sampler's color is off by too much + else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { + fragColor = vec4(0.0); + } } } From 0455aa244d5051ba1c73c002d9707f324a35bb8a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 20:52:39 +0300 Subject: [PATCH 226/269] Fix quad derotation not working as intended --- .../client/model/quad/MutableQuadView.java | 7 ++- .../gtceu/client/util/quad/CTMHelper.java | 59 ++++++++++--------- 2 files changed, 34 insertions(+), 32 deletions(-) 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 33ffcfb44cc..c807573e0c1 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 @@ -27,6 +27,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; +import org.joml.Vector2fc; import org.joml.Vector3f; import static com.gregtechceu.gtceu.client.model.quad.EncodingFormat.*; @@ -219,13 +220,13 @@ public MutableQuadView uv(int vertexIndex, float u, float v) { * Set texture coordinates. * *

- * Only use this function if you already have a {@link Vector2f}. + * Only use this function if you already have a {@link Vector2fc}. * Otherwise, see {@link MutableQuadView#uv(int, float, float)}. * * @see MutableQuadView#uv(int, float, float) */ - public MutableQuadView uv(int vertexIndex, Vector2f uv) { - return uv(vertexIndex, uv.x, uv.y); + public MutableQuadView uv(int vertexIndex, Vector2fc uv) { + return uv(vertexIndex, uv.x(), uv.y()); } /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index d9fd7eadba1..e6d4c3aa0be 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -40,21 +40,6 @@ public static Vector2f[] findMinMaxUVs(Vector2f[] uvs) { return new Vector2f[] { new Vector2f(minU, minV), new Vector2f(maxU, maxV) }; } - public static int findMinUVIndex(Vector2f[] uvs) { - int minIndex = 0; - float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE; - - for (int v = 0; v < 4; v++) { - Vector2f uv = uvs[v]; - if (uv.x() <= minU && uv.y() <= minV) { - minIndex = v; - minU = uv.x(); - minV = uv.y(); - } - } - return minIndex; - } - public static List buildCTMQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, List quads, Direction cullFace) { CTMCache ctmCache = CTMCache.getInstance(); @@ -90,6 +75,7 @@ public static List buildCTMQuads(CTMCache cachedConnections, List xy[i].set(position.z, position.y); @@ -235,10 +236,10 @@ public static MutableQuadView subsect(MutableQuadView quad, ISubmap submap) { float u3 = normalize(newXy[3].x, xy[3].x, xy[0].x), v3 = normalize(newXy[3].y, xy[3].y, xy[2].y); - quad.uv(0, Mth.lerp(u0, uvs[0].x, uvs[3].x), Mth.lerp(v0, uvs[0].y, uvs[1].y)); - quad.uv(1, Mth.lerp(u1, uvs[1].x, uvs[2].x), Mth.lerp(v1, uvs[1].y, uvs[0].y)); - quad.uv(2, Mth.lerp(u2, uvs[2].x, uvs[1].x), Mth.lerp(v2, uvs[2].y, uvs[3].y)); - quad.uv(3, Mth.lerp(u3, uvs[3].x, uvs[0].x), Mth.lerp(v3, uvs[3].y, uvs[2].y)); + quad.uv(0, Mth.lerp(u0, quad.u(0), quad.u(3)), Mth.lerp(v0, quad.v(0), quad.v(1))); + quad.uv(1, Mth.lerp(u1, quad.u(1), quad.u(2)), Mth.lerp(v1, quad.v(1), quad.v(0))); + quad.uv(2, Mth.lerp(u2, quad.u(2), quad.u(1)), Mth.lerp(v2, quad.v(2), quad.v(3))); + quad.uv(3, Mth.lerp(u3, quad.u(3), quad.u(0)), Mth.lerp(v3, quad.v(3), quad.v(2))); // spotless:off for (int i = 0; i < 4; i++) { @@ -262,6 +263,6 @@ private static Vector2f normalize(float minU, float minV, float maxU, float maxV /// scale {@code delta} to a 0-1 range based on {@code min} and {@code max} public static float normalize(float delta, float min, float max) { if (min == max) return 0.5f; - return Mth.inverseLerp(delta, min, max); + return Mth.clamp(Mth.inverseLerp(delta, min, max), 0.0f, 1.0f); } } From be18493b10d61ae677c61b29804f66b9154f6a24 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 21:11:03 +0300 Subject: [PATCH 227/269] Move BloomRenderTicket into a standalone class --- .../gtceu/client/bloom/BloomRenderTicket.java | 49 +++++++++++++++++++ .../gtceu/client/bloom/BloomUtil.java | 49 ++----------------- .../gtceu/client/bloom/IRenderSetup.java | 5 ++ .../bloom/particle/GTBloomParticle.java | 2 +- .../machine/impl/FusionRingRender.java | 25 +++++----- .../electric/FusionReactorMachine.java | 3 +- 6 files changed, 76 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderTicket.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderTicket.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderTicket.java new file mode 100644 index 00000000000..8c6ef1cade9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderTicket.java @@ -0,0 +1,49 @@ +package com.gregtechceu.gtceu.client.bloom; + +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; +import java.util.function.Predicate; +import java.util.function.Supplier; + +public final class BloomRenderTicket { + + public static final BloomRenderTicket INVALID = new BloomRenderTicket(); + + final @Nullable IRenderSetup renderSetup; + final IBloomEffect render; + final @Nullable Predicate validityChecker; + final @Nullable Supplier<@Nullable Level> worldContext; + + private boolean invalidated; + + private BloomRenderTicket() { + this(null, (p, b, c) -> {}, null, null); + this.invalidated = true; + } + + BloomRenderTicket(@Nullable IRenderSetup renderSetup, IBloomEffect render, + @Nullable Predicate validityChecker, + @Nullable Supplier<@Nullable Level> worldContext) { + this.renderSetup = renderSetup; + this.render = Objects.requireNonNull(render, "render == null"); + this.validityChecker = validityChecker; + this.worldContext = worldContext; + } + + public boolean isValid() { + return !this.invalidated; + } + + public void invalidate() { + this.invalidated = true; + } + + void checkValidity() { + if (!this.invalidated && this.validityChecker != null && !this.validityChecker.test(this)) { + invalidate(); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index cdbbbb7630c..0636137873c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -25,8 +25,6 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RenderLevelStageEvent; import com.mojang.blaze3d.vertex.*; @@ -45,7 +43,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.*; -@OnlyIn(Dist.CLIENT) @UtilityClass public class BloomUtil { @@ -462,46 +459,6 @@ public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderT // endregion - public static final class BloomRenderTicket { - - public static final BloomRenderTicket INVALID = new BloomRenderTicket(); - - private final @Nullable IRenderSetup renderSetup; - private final IBloomEffect render; - private final @Nullable Predicate validityChecker; - private final @Nullable Supplier<@Nullable Level> worldContext; - - private boolean invalidated; - - private BloomRenderTicket() { - this(null, (p, b, c) -> {}, null, null); - this.invalidated = true; - } - - BloomRenderTicket(@Nullable IRenderSetup renderSetup, IBloomEffect render, - @Nullable Predicate validityChecker, - @Nullable Supplier<@Nullable Level> worldContext) { - this.renderSetup = renderSetup; - this.render = Objects.requireNonNull(render, "render == null"); - this.validityChecker = validityChecker; - this.worldContext = worldContext; - } - - public boolean isValid() { - return !this.invalidated; - } - - public void invalidate() { - this.invalidated = true; - } - - private void checkValidity() { - if (!this.invalidated && this.validityChecker != null && !this.validityChecker.test(this)) { - invalidate(); - } - } - } - private static class BloomRenderList extends ArrayList { private final @Nullable IRenderSetup renderSetup; @@ -514,6 +471,9 @@ private BloomRenderList(@Nullable IRenderSetup renderSetup) { private void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) { boolean initialized = false; + poseStack.pushPose(); + poseStack.translate(-context.camPos().x(), -context.camPos().y(), -context.camPos().z()); + for (BloomRenderTicket ticket : this) { ticket.checkValidity(); if (!ticket.isValid() || !ticket.render.shouldRenderBloomEffect(context)) continue; @@ -526,11 +486,12 @@ private void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext } poseStack.pushPose(); - poseStack.translate(-context.camPos().x(), -context.camPos().y(), -context.camPos().z()); ticket.render.renderBloomEffect(poseStack, buffer, context); poseStack.popPose(); } + poseStack.popPose(); + if (initialized && this.renderSetup != null) { this.renderSetup.postDraw(buffer); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java index 93d7af7a945..fcc79e5832e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IRenderSetup.java @@ -1,5 +1,8 @@ package com.gregtechceu.gtceu.client.bloom; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + import com.mojang.blaze3d.vertex.BufferBuilder; public interface IRenderSetup { @@ -9,6 +12,7 @@ public interface IRenderSetup { * * @param buffer Buffer builder */ + @OnlyIn(Dist.CLIENT) void preDraw(BufferBuilder buffer); /** @@ -16,5 +20,6 @@ public interface IRenderSetup { * * @param buffer Buffer builder */ + @OnlyIn(Dist.CLIENT) void postDraw(BufferBuilder buffer); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java index c30e61faeff..b5c9ddb0afd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java @@ -14,5 +14,5 @@ public GTBloomParticle(double posX, double posY, double posZ) { BloomUtil.registerBloomRender(getBloomRenderSetup(), this, this); } - protected @Nullable abstract IRenderSetup getBloomRenderSetup(); + protected abstract @Nullable IRenderSetup getBloomRenderSetup(); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index dbd0ac5b53a..f3d8e10e0a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -57,26 +57,27 @@ public boolean shouldRender(FusionReactorMachine machine, Vec3 cameraPos) { } @Override - public void render(FusionReactorMachine machine, float partialTick, - PoseStack poseStack, MultiBufferSource buffer, + public void render(FusionReactorMachine machine, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay) { if (!machine.recipeLogic.isWorking() && delta <= 0) { return; } - if (machine.isRegisteredBloomTicket() && !machine.isFormed()) { - machine.setRegisteredBloomTicket(false); + if (machine.getRegisteredBloomTicket().isValid() && !machine.isFormed()) { + machine.setRegisteredBloomTicket(BloomRenderTicket.INVALID); } - if (!machine.isRegisteredBloomTicket()) { - machine.setRegisteredBloomTicket(true); - BloomUtil.registerBloomRender(null, new FusionBloomEffect(machine), machine.self()); + if (!machine.getRegisteredBloomTicket().isValid() && BloomShaderManager.isBloomShaderInUse()) { + BloomRenderTicket ticket = BloomUtil.registerBloomRender(null, new FusionBloomEffect(machine), machine); + + machine.setRegisteredBloomTicket(ticket); } - renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.getLightRing())); + + renderLightRing(machine, partialTick, poseStack, buffer.getBuffer(GTRenderTypes.lightRing())); } @OnlyIn(Dist.CLIENT) - private void renderLightRing(FusionReactorMachine machine, float partialTicks, PoseStack stack, - VertexConsumer buffer) { + private void renderLightRing(FusionReactorMachine machine, float partialTicks, + PoseStack stack, VertexConsumer buffer) { float alpha = 1f; if (machine.recipeLogic.isWorking()) { lastColor = machine.getColor(); @@ -87,15 +88,17 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, P delta -= Minecraft.getInstance().getDeltaFrameTime(); } - final float lerpFactor = Math.abs((Math.abs(machine.getOffsetTimer() % 50) + partialTicks) - 25) / 25; Direction front = machine.getFrontFacing(); Direction upwards = machine.getUpwardsFacing(); boolean flipped = machine.isFlipped(); Direction back = RelativeDirection.BACK.getRelative(front, upwards, flipped); Direction.Axis axis = RelativeDirection.UP.getRelative(front, upwards, flipped).getAxis(); + + float lerpFactor = Math.abs((Math.abs(machine.getOffsetTimer() % 50) + partialTicks) - 25) / 25; float r = Mth.lerp(lerpFactor, red(lastColor), 255) / 255f; float g = Mth.lerp(lerpFactor, green(lastColor), 255) / 255f; float b = Mth.lerp(lerpFactor, blue(lastColor), 255) / 255f; + RenderBufferHelper.renderRing(stack, buffer, back.getStepX() * 7 + 0.5F, back.getStepY() * 7 + 0.5F, diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java index c85b2454f03..91fa2986d45 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.client.bloom.BloomRenderTicket; import com.gregtechceu.gtceu.common.block.FusionCasingBlock; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -84,7 +85,7 @@ public class FusionReactorMachine extends WorkableElectricMultiblockMachine impl @Getter @Setter - protected boolean registeredBloomTicket; + protected BloomRenderTicket registeredBloomTicket = BloomRenderTicket.INVALID; public FusionReactorMachine(BlockEntityCreationInfo info, int tier) { super(info); From 6e5f95a0ad991b97839e1d04d26cab7e38d4129b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 23:19:04 +0300 Subject: [PATCH 228/269] Use the event, Actually --- .../client/bloom/BloomEventListeners.java | 8 ++++++ .../client/bloom/LevelRendererMixin.java | 28 ------------------- 2 files changed, 8 insertions(+), 28 deletions(-) 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 f2d7efd857c..754bbcbe05a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -29,6 +29,14 @@ @UtilityClass public class BloomEventListeners { + @SubscribeEvent + public static void afterParticlesRendered(RenderLevelStageEvent event) { + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) return; + + BloomUtil.renderBloom(event.getCamera(), event.getPoseStack(), event.getFrustum(), event.getProjectionMatrix(), + event.getPartialTick(), event.getLevelRenderer(), Minecraft.getInstance().getProfiler()); + } + @SubscribeEvent public static void onRenderTick(TickEvent.RenderTickEvent event) { if (event.phase != TickEvent.Phase.START || Minecraft.getInstance().level == null) return; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java index 2171e925539..2eda3f3cf2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererMixin.java @@ -1,20 +1,9 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import net.minecraft.client.Camera; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.util.profiling.ProfilerFiller; -import com.llamalad7.mixinextras.expression.Definition; -import com.llamalad7.mixinextras.expression.Expression; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.vertex.PoseStack; -import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -34,21 +23,4 @@ public abstract class LevelRendererMixin { private void gtceu$reinitBloomEffect(CallbackInfo ci) { BloomShaderManager.initPostShaders(); } - - @Definition(id = "renderBuffers", - field = "Lnet/minecraft/client/renderer/LevelRenderer;renderBuffers:Lnet/minecraft/client/renderer/RenderBuffers;") - @Definition(id = "crumblingBufferSource", - method = "Lnet/minecraft/client/renderer/RenderBuffers;crumblingBufferSource()Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;") - @Definition(id = "endBatch", method = "Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;endBatch()V") - @Expression("this.renderBuffers.crumblingBufferSource().endBatch()") - @Inject(method = "renderLevel", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) - private void gtceu$renderBloomBeforeTranslucent(PoseStack poseStack, float partialTick, long finishNanoTime, - boolean renderBlockOutline, Camera camera, - GameRenderer gameRenderer, - LightTexture lightTexture, Matrix4f projectionMatrix, - CallbackInfo ci, - @Local Frustum frustum, @Local ProfilerFiller profilerFiller) { - BloomUtil.renderBloom(camera, poseStack, frustum, projectionMatrix, partialTick, - (LevelRenderer) (Object) this, profilerFiller); - } } From 08fec1b2fa92a8211bdbe2510a00070a159fb4cc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 23:19:44 +0300 Subject: [PATCH 229/269] fix unity bloom filter --- .../resources/assets/gtceu/shaders/post/bloom_unity.json | 2 +- .../assets/gtceu/shaders/program/filter_bloom_color.fsh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 c9a73aa7d9a..b661878a69c 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -20,7 +20,7 @@ }, { "name": "blit", - "intarget": "final", + "intarget": "filter", "outtarget": "swap_a2" }, { 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 13e2ba614a8..16d3f714e5c 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 @@ -33,8 +33,8 @@ void main() { fragColor = vec4(0.0); } // also clear it if the main sampler's color is off by too much - else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { - fragColor = vec4(0.0); - } +// else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { +// fragColor = vec4(0.0); +// } } } From 6139823dac2536c263014db9c824fe7cbed5b122 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 23:25:21 +0300 Subject: [PATCH 230/269] Fix fusion ring bloom --- .../gtceu/client/bloom/BloomUtil.java | 14 ++--- .../gtceu/client/renderer/GTRenderTypes.java | 4 +- .../machine/impl/FusionRingRender.java | 54 ++++++++++++------- 3 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 0636137873c..b45a7868bc2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -185,7 +185,7 @@ public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frust renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); - // if safe mode is enabled, don't draw block bloom the 'normal' way + // safe mode disabled -> use deeper, faster hackery if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { ((LevelRendererAccessor) levelRenderer).invokeRenderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); @@ -193,7 +193,7 @@ public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frust // have to re-setup here. so sad. very aw. GTRenderTypes.bloom().setupRenderState(); } - // use BloomSafeMode.drawBlockBloom instead + // safe mode enabled -> don't draw block bloom the 'normal' way; use BloomSafeMode.drawBlockBloom instead else { BloomSafeMode.drawBlockBloom(camera, poseStack, frustum, projectionMatrix, levelRenderer, profilerFiller); } @@ -500,17 +500,17 @@ private void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext /** * Do post-draw cleanup such as removing invalidated draw tickets. * - * @return Whether this list is empty and should thus be removed from the tracking map. + * @return Whether this list should be removed from the tracking map. */ private boolean postDraw() { if (this.isEmpty()) return true; - if (!this.removeIf(ticket -> { + boolean removedAny = this.removeIf(ticket -> { ticket.checkValidity(); return !ticket.isValid(); - })) { - return true; - } + }); + if (!removedAny) return false; + return this.isEmpty(); } } 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 92d2f0c809c..d132c13377c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -53,7 +53,7 @@ public class GTRenderTypes extends RenderType { .createCompositeState(false)); private static final Function ENTITY_BLOOM = Util.memoize((texture) -> { return create("gtceu:entity_bloom", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, - RenderType.TRANSIENT_BUFFER_SIZE, true, false, + RenderType.TRANSIENT_BUFFER_SIZE, false, false, RenderType.CompositeState.builder() .setShaderState(RENDERTYPE_ENTITY_BLOOM_SHADER) .setOutputState(BLOOM_TARGET) @@ -87,7 +87,7 @@ private GTRenderTypes(String name, VertexFormat format, VertexFormat.Mode mode, super(name, format, mode, bufferSize, affectsCrumbling, sortOnUpload, setupState, clearState); } - public static RenderType getLightRing() { + public static RenderType lightRing() { return LIGHT_RING; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index f3d8e10e0a6..d1928ba465e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.client.renderer.machine.impl; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.client.bloom.EffectRenderContext; -import com.gregtechceu.gtceu.client.bloom.IBloomEffect; +import com.gregtechceu.gtceu.client.bloom.*; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; @@ -23,12 +21,10 @@ import net.minecraftforge.api.distmarker.OnlyIn; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.BufferUploader; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.*; import com.mojang.serialization.Codec; import lombok.RequiredArgsConstructor; +import org.lwjgl.opengl.GL11; import static net.minecraft.util.FastColor.ARGB32.*; @@ -64,10 +60,11 @@ public void render(FusionReactorMachine machine, float partialTick, PoseStack po } if (machine.getRegisteredBloomTicket().isValid() && !machine.isFormed()) { - machine.setRegisteredBloomTicket(BloomRenderTicket.INVALID); + machine.getRegisteredBloomTicket().invalidate(); } if (!machine.getRegisteredBloomTicket().isValid() && BloomShaderManager.isBloomShaderInUse()) { - BloomRenderTicket ticket = BloomUtil.registerBloomRender(null, new FusionBloomEffect(machine), machine); + BloomRenderTicket ticket = BloomUtil.registerBloomRender(FusionBloomEffect.SETUP, + new FusionBloomEffect(machine), machine); machine.setRegisteredBloomTicket(ticket); } @@ -78,6 +75,10 @@ public void render(FusionReactorMachine machine, float partialTick, PoseStack po @OnlyIn(Dist.CLIENT) private void renderLightRing(FusionReactorMachine machine, float partialTicks, PoseStack stack, VertexConsumer buffer) { + RenderSystem.disableCull(); + RenderSystem.disableDepthTest(); + RenderSystem.depthFunc(GL11.GL_ALWAYS); + float alpha = 1f; if (machine.recipeLogic.isWorking()) { lastColor = machine.getColor(); @@ -105,6 +106,10 @@ private void renderLightRing(FusionReactorMachine machine, float partialTicks, back.getStepZ() * 7 + 0.5F, 6, 0.2F, 10, 20, r, g, b, alpha, axis); + + RenderSystem.enableCull(); + RenderSystem.enableDepthTest(); + RenderSystem.depthFunc(GL11.GL_LEQUAL); } @Override @@ -122,27 +127,38 @@ private final class FusionBloomEffect implements IBloomEffect { private final FusionReactorMachine machine; - private static final BufferBuilder lightRingBuffer = new BufferBuilder( - GTRenderTypes.getLightRing().bufferSize()); + private static final BufferBuilder lightRingBuffer = new BufferBuilder(GTRenderTypes.lightRing().bufferSize()); + + private static final IRenderSetup SETUP = new IRenderSetup() { + + @Override + @OnlyIn(Dist.CLIENT) + public void preDraw(BufferBuilder buffer) { + lightRingBuffer.begin(GTRenderTypes.lightRing().mode(), GTRenderTypes.lightRing().format()); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void postDraw(BufferBuilder buffer) { + ShaderInstance lastShader = RenderSystem.getShader(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + BufferUploader.drawWithShader(lightRingBuffer.end()); + + RenderSystem.setShader(() -> lastShader); + } + }; @Override public void renderBloomEffect(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) { BlockPos pos = machine.getBlockPos(); - lightRingBuffer.begin(GTRenderTypes.getLightRing().mode(), GTRenderTypes.getLightRing().format()); poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); FusionRingRender.this.renderLightRing(machine, context.partialTicks(), poseStack, lightRingBuffer); poseStack.popPose(); - - ShaderInstance lastShader = RenderSystem.getShader(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - - BufferUploader.drawWithShader(lightRingBuffer.end()); - - RenderSystem.setShader(() -> lastShader); } @Override From 97ddd680c84100006f9a19f90d859fb08eb283ad Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 23:27:07 +0300 Subject: [PATCH 231/269] Spotless, datagen --- src/generated/resources/assets/gtceu/lang/en_ud.json | 5 ++--- src/generated/resources/assets/gtceu/lang/en_us.json | 5 ++--- .../gregtechceu/gtceu/client/model/quad/MutableQuadView.java | 1 - .../com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java | 2 -- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 9387f77c0ad..6b0755bbbca 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1767,7 +1767,8 @@ "config.gtceu.option.batchDuration": "uoıʇɐɹnᗡɥɔʇɐq", "config.gtceu.option.bedrockOreDistance": "ǝɔuɐʇsıᗡǝɹOʞɔoɹpǝq", "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", - "config.gtceu.option.bloomAlgorithm": "ɯɥʇıɹobןⱯɯooןq", + "config.gtceu.option.bloom": "ɯooןq", + "config.gtceu.option.bloomType": "ǝdʎ⟘ɯooןq", "config.gtceu.option.borderColor": "ɹoןoƆɹǝpɹoq", "config.gtceu.option.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", "config.gtceu.option.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", @@ -1795,7 +1796,6 @@ "config.gtceu.option.dumpRecipes": "sǝdıɔǝᴚdɯnp", "config.gtceu.option.emissiveTexturesHaveBloom": "ɯooןᗺǝʌɐHsǝɹnʇxǝ⟘ǝʌıssıɯǝ", "config.gtceu.option.enableArcRecycling": "buıןɔʎɔǝᴚɔɹⱯǝןqɐuǝ", - "config.gtceu.option.enableBloom": "ɯooןᗺǝןqɐuǝ", "config.gtceu.option.enableCleanroom": "ɯooɹuɐǝןƆǝןqɐuǝ", "config.gtceu.option.enableExtractorRecycling": "buıןɔʎɔǝᴚɹoʇɔɐɹʇxƎǝןqɐuǝ", "config.gtceu.option.enableFEConverters": "sɹǝʇɹǝʌuoƆƎℲǝןqɐuǝ", @@ -1901,7 +1901,6 @@ "config.gtceu.option.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", "config.gtceu.option.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", "config.gtceu.option.sandOresFall": "ןןɐℲsǝɹOpuɐs", - "config.gtceu.option.shader": "ɹǝpɐɥs", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "uoısoןdxƎuıɐɹɹǝ⟘ɹOɹǝɥʇɐǝMpןnoɥs", "config.gtceu.option.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", "config.gtceu.option.smallBoilers": "sɹǝןıoᗺןןɐɯs", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a369053e529..6d31d118c92 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1767,7 +1767,8 @@ "config.gtceu.option.batchDuration": "batchDuration", "config.gtceu.option.bedrockOreDistance": "bedrockOreDistance", "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", - "config.gtceu.option.bloomAlgorithm": "bloomAlgorithm", + "config.gtceu.option.bloom": "bloom", + "config.gtceu.option.bloomType": "bloomType", "config.gtceu.option.borderColor": "borderColor", "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", @@ -1795,7 +1796,6 @@ "config.gtceu.option.dumpRecipes": "dumpRecipes", "config.gtceu.option.emissiveTexturesHaveBloom": "emissiveTexturesHaveBloom", "config.gtceu.option.enableArcRecycling": "enableArcRecycling", - "config.gtceu.option.enableBloom": "enableBloom", "config.gtceu.option.enableCleanroom": "enableCleanroom", "config.gtceu.option.enableExtractorRecycling": "enableExtractorRecycling", "config.gtceu.option.enableFEConverters": "enableFEConverters", @@ -1901,7 +1901,6 @@ "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", "config.gtceu.option.rubberTreeSpawnChance": "rubberTreeSpawnChance", "config.gtceu.option.sandOresFall": "sandOresFall", - "config.gtceu.option.shader": "shader", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "shouldWeatherOrTerrainExplosion", "config.gtceu.option.showDimensionTier": "showDimensionTier", "config.gtceu.option.smallBoilers": "smallBoilers", 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 c807573e0c1..ff414ce72a4 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 @@ -26,7 +26,6 @@ import net.minecraftforge.client.model.QuadTransformers; import org.jetbrains.annotations.Nullable; -import org.joml.Vector2f; import org.joml.Vector2fc; import org.joml.Vector3f; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index 095d85f8ddd..c03a64becd8 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -3,8 +3,6 @@ import com.gregtechceu.gtceu.core.config.GTEarlyConfig; import com.gregtechceu.gtceu.core.config.Option; -import net.minecraftforge.fml.loading.FMLLoader; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.UnknownNullability; From fd05e9b044bae126e5e6181c498e290a2efd812a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 1 May 2026 23:27:49 +0300 Subject: [PATCH 232/269] Oops, that belonged to a different branch Revert "Apply patch" This reverts commit 0758c321a5f15d9bde19ebfdeb8690cc082ffbb0. --- .../registry/registrate/MachineBuilder.java | 5 +- .../provider/GTBlockstateProvider.java | 24 +-- .../gtceu/common/data/GTMachines.java | 14 +- .../common/data/machines/GTMultiMachines.java | 1 - .../common/data/models/GTMachineModels.java | 145 ++++++++++-------- .../model/builder/MachineModelBuilder.java | 14 +- 6 files changed, 100 insertions(+), 103 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index 455863eca4b..c1b59704aa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -717,8 +717,9 @@ public DEFINITION register() { @FunctionalInterface public interface ModelInitializer { - void configureModel(DataGenContext context, GTBlockstateProvider provider, - MachineModelBuilder builder); + void configureModel(@NotNull DataGenContext context, + @NotNull GTBlockstateProvider provider, + @NotNull MachineModelBuilder builder); default ModelInitializer andThen(ModelInitializer after) { Objects.requireNonNull(after); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java index 5a669b9c9a2..6b7789b5159 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/provider/GTBlockstateProvider.java @@ -101,18 +101,20 @@ public T addVanillaGenerator(Block block, T gene if (rotationState == RotationState.NONE) return null; PropertyDispatch dispatch; - if (allowExtendedFacing) { - dispatch = PropertyDispatch.properties(rotationState.property, GTBlockStateProperties.UPWARDS_FACING) - .generate((front, up) -> { - var orientation = ExtendedBlockModelRotation.get(front, up); - return applyOrientation(Variant.variant(), orientation); - }); + if (!allowExtendedFacing) { + var disp = PropertyDispatch.property(rotationState.property); + + dispatch = disp.generate((front) -> { + var orientation = ExtendedBlockModelRotation.get(front, Direction.NORTH); + return applyOrientation(Variant.variant(), orientation); + }); } else { - dispatch = PropertyDispatch.property(rotationState.property) - .generate((front) -> { - var orientation = ExtendedBlockModelRotation.get(front, Direction.NORTH); - return applyOrientation(Variant.variant(), orientation); - }); + var disp = PropertyDispatch.properties(rotationState.property, GTBlockStateProperties.UPWARDS_FACING); + + dispatch = disp.generate((front, up) -> { + var orientation = ExtendedBlockModelRotation.get(front, up); + return applyOrientation(Variant.variant(), orientation); + }); } return dispatch; } 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 1dcb16fd70c..dfdf9ae80ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -40,7 +40,6 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fml.ModLoader; @@ -879,18 +878,7 @@ public class GTMachines { .rotationState(RotationState.ALL) .abilities(PartAbility.PUMP_FLUID_HATCH) .modelProperty(IS_FORMED, false) - .model(createBasicReplaceableTextureMachineModel(GTCEu.id("block/machine/part/pump_hatch")) - .andThen(builder -> { - // UV lock the model so the plank texture doesn't rotate weirdly - builder.replaceForAllStates((state, models) -> { - for (int i = 0; i < models.length; i++) { - models[i] = ConfiguredModel.builder() - .modelFile(models[i].model).uvLock(true) - .buildLast(); - } - return models; - }); - })) + .model(createBasicReplaceableTextureMachineModel(GTCEu.id("block/machine/part/pump_hatch"))) .register(); public static final MachineDefinition MAINTENANCE_HATCH = REGISTRATE diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java index a4f22f1f7ab..dfbcf64b53d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java @@ -585,7 +585,6 @@ public class GTMultiMachines { .model(createSidedWorkableCasingMachineModel(GTCEu.id("block/casings/pump_deck"), GTCEu.id("block/multiblock/primitive_pump")) .andThen(builder -> { - // UV lock the model so the plank texture doesn't rotate weirdly builder.replaceForAllStates((state, models) -> { for (int i = 0; i < models.length; i++) { models[i] = ConfiguredModel.builder() diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java index 17453ba2366..6ba47cd12d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java @@ -30,7 +30,6 @@ import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Locale; @@ -71,14 +70,14 @@ public class GTMachineModels { public static MachineBuilder.ModelInitializer createBasicMachineModel(ResourceLocation baseModel) { return (ctx, prov, builder) -> { var model = prov.models().getExistingFile(baseModel); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); }; } public static MachineBuilder.ModelInitializer createBasicReplaceableTextureMachineModel(ResourceLocation baseModel) { return (ctx, prov, builder) -> { var model = prov.models().getExistingFile(baseModel); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); builder.addReplaceableTextures("bottom", "top", "side"); }; } @@ -89,7 +88,7 @@ public static MachineBuilder.ModelInitializer createTieredHullMachineModel(Resou .parent(prov.models().getExistingFile(parentModel)); tieredHullTextures(model, builder.getOwner().getTier()); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); }; } @@ -98,7 +97,7 @@ public static MachineBuilder.ModelInitializer createOverlayTieredHullMachineMode BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); tieredHullTextures(model, builder.getOwner().getTier()); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -111,7 +110,7 @@ public static MachineBuilder.ModelInitializer createOverlayCasingMachineModel(Re .parent(prov.models().getExistingFile(overlayModel)); model.texture("all", baseCasingTexture); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); builder.addReplaceableTextures("all"); }; } @@ -120,11 +119,11 @@ public static MachineBuilder.ModelInitializer createColorOverlayTieredHullMachin @Nullable ResourceLocation pipeOverlay, @Nullable ResourceLocation emissiveOverlay) { return (ctx, prov, builder) -> { - builder.forAllStatesModelsExcept(state -> { - BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, - state, prov.models()); + builder.forAllStatesModels(state -> { + BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, state, + prov.models()); return tieredHullTextures(model, builder.getOwner().getTier()); - }, IS_FORMED); + }); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -138,7 +137,7 @@ public static MachineBuilder.ModelInitializer createSingleOverlayTieredHullMachi .texture("overlay", overlayTexture) .texture("overlay_emissive", emissiveOverlayTexture); tieredHullTextures(model, builder.getOwner().getTier()); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -148,25 +147,25 @@ public static MachineBuilder.ModelInitializer createWorkableTieredHullMachineMod return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStatesModelsExcept(state -> { + builder.forAllStates(state -> { RecipeLogic.Status status = state.getValue(RECIPE_LOGIC_STATUS); BlockModelBuilder model = prov.models().nested().parent(tieredHullModel(prov.models(), builder)); return addWorkableOverlays(overlays, status, model); - }, IS_FORMED); + }); }; } public static MachineBuilder.ModelInitializer createOverlaySteamHullMachineModel(ResourceLocation overlayModel) { return (ctx, prov, builder) -> { - builder.forAllStatesModelsExcept(state -> { + builder.forAllStatesModels(state -> { boolean steel = state.getOptionalValue(IS_STEEL_MACHINE).orElse(false); BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); steamCasingTextures(model, steel); return model; - }, IS_FORMED); + }); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -176,12 +175,12 @@ public static MachineBuilder.ModelInitializer createColorOverlaySteamHullMachine @Nullable ResourceLocation pipeOverlay, @Nullable ResourceLocation emissiveOverlay) { return (ctx, prov, builder) -> { - builder.forAllStatesModelsExcept(state -> { - BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, - state, prov.models()); + builder.forAllStatesModels(state -> { + BlockModelBuilder model = colorOverlayHullModel(overlay, pipeOverlay, emissiveOverlay, state, + prov.models()); steamCasingTextures(model, state.getOptionalValue(IS_STEEL_MACHINE).orElse(false)); return model; - }, IS_FORMED); + }); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -229,14 +228,14 @@ public static MachineBuilder.ModelInitializer createWorkableCasingMachineModel(R return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStatesModelsExcept(state -> { + builder.forAllStates(state -> { RecipeLogic.Status status = state.getValue(RECIPE_LOGIC_STATUS); BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(CUBE_ALL_SIDED_OVERLAY_MODEL)) .texture("all", baseCasingTexture); return addWorkableOverlays(overlays, status, model); - }, IS_FORMED); + }); builder.addTextureOverride("all", baseCasingTexture); }; } @@ -248,7 +247,7 @@ public static MachineBuilder.ModelInitializer createSidedOverlayCasingMachineMod BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); casingTextures(model, baseCasingTexture); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -259,14 +258,14 @@ public static MachineBuilder.ModelInitializer createSidedWorkableCasingMachineMo return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStatesModelsExcept(state -> { + builder.forAllStates(state -> { RecipeLogic.Status status = state.getValue(RECIPE_LOGIC_STATUS); BlockModelBuilder model = prov.models().nested() .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); casingTextures(model, baseCasingTexture); return addWorkableOverlays(overlays, status, model); - }, IS_FORMED); + }); var texturePath = baseCasingTexture; if (!texturePath.getPath().endsWith("/")) { @@ -326,7 +325,7 @@ public static MachineBuilder.ModelInitializer createBatteryBufferModel(int inven .texture("overlay_out_io", BLANK_TEXTURE); tieredHullTextures(model, builder.getOwner().getTier()); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); }; } @@ -363,14 +362,17 @@ public static MachineBuilder.ModelInitializer createChargerModel() { }); }; } + // spotless:on public static final ResourceLocation TRANSFORMER_LIKE = GTCEu.id("block/machine/template/transformer_like_machine"); public static final ResourceLocation CONVERTER_FE_IN = GTCEu.id("block/overlay/converter/converter_native_in"); public static final ResourceLocation CONVERTER_FE_OUT = GTCEu.id("block/overlay/converter/converter_native_out"); - public static final ResourceLocation CONVERTER_FE_IN_EMISSIVE = GTCEu.id("block/overlay/converter/converter_native_in_emissive"); - public static final ResourceLocation CONVERTER_FE_OUT_EMISSIVE = GTCEu.id("block/overlay/converter/converter_native_out_emissive"); + public static final ResourceLocation CONVERTER_FE_IN_EMISSIVE = GTCEu + .id("block/overlay/converter/converter_native_in_emissive"); + public static final ResourceLocation CONVERTER_FE_OUT_EMISSIVE = GTCEu + .id("block/overlay/converter/converter_native_out_emissive"); public static MachineBuilder.ModelInitializer createConverterModel(int amperage) { return (ctx, prov, builder) -> { @@ -396,14 +398,14 @@ public static MachineBuilder.ModelInitializer createConverterModel(int amperage) tieredHullTextures(feToEuModel, builder.getOwner().getTier()); builder.partialState() - .with(IS_FE_TO_EU, false) - .setModel(euToFeModel) + .with(IS_FE_TO_EU, false) + .setModel(euToFeModel) .partialState() - .with(IS_FE_TO_EU, true) - .setModel(feToEuModel); + .with(IS_FE_TO_EU, true) + .setModel(feToEuModel) + .end(); }; } - // spotless:on public static MachineBuilder.ModelInitializer createCrateModel(boolean wooden) { return (ctx, prov, builder) -> { @@ -423,7 +425,7 @@ public static MachineBuilder.ModelInitializer createCrateModel(boolean wooden) { public static MachineBuilder.ModelInitializer createDiodeModel() { return (ctx, prov, builder) -> { - builder.forAllStatesModelsExcept(renderState -> { + builder.forAllStatesModels(renderState -> { DiodePartMachine.AmpMode mode = renderState.getValue(DIODE_AMP_MODE); final EnergyIOOverlay energyIn = IN_OVERLAYS_FOR_AMP.get(mode.getAmpValue()); final EnergyIOOverlay energyOut = OUT_OVERLAYS_FOR_AMP.get(mode.getAmpValue()); @@ -438,7 +440,7 @@ public static MachineBuilder.ModelInitializer createDiodeModel() { .texture("overlay_out_tinted", energyOut.getTintedPart()); tieredHullTextures(model, builder.getOwner().getTier()); return model; - }, IS_FORMED); + }); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -446,7 +448,7 @@ public static MachineBuilder.ModelInitializer createDiodeModel() { public static MachineBuilder.ModelInitializer createTransformerModel(int baseAmp) { return (ctx, prov, builder) -> { - builder.forAllStatesModelsExcept(renderState -> { + builder.forAllStatesModels(renderState -> { boolean transformUp = renderState.getValue(IS_TRANSFORM_UP); EnergyIOOverlay frontFace = (transformUp ? OUT_OVERLAYS_FOR_AMP : IN_OVERLAYS_FOR_AMP) .get(baseAmp); @@ -462,7 +464,7 @@ public static MachineBuilder.ModelInitializer createTransformerModel(int baseAmp .texture("overlay_out_tinted", otherFace.getTintedPart()); tieredHullTextures(model, builder.getOwner().getTier()); return model; - }, IS_FORMED); + }); }; } @@ -524,9 +526,23 @@ public static MachineBuilder.ModelInitializer createWorldAcceleratorModel(Resour WorkableOverlays rtOverlays = WorkableOverlays.get(rtModeModelPath, prov.getExistingFileHelper()); WorkableOverlays beOverlays = WorkableOverlays.get(beModeModelPath, prov.getExistingFileHelper()); - builder.forAllStatesModels(state -> { - WorkableOverlays overlays = state.getValue(IS_RANDOM_TICK_MODE) ? rtOverlays : beOverlays; - return createModelFromActiveWorkingState(prov, builder, overlays, state); + builder.forAllStates(state -> { + boolean rtMode = state.getValue(IS_RANDOM_TICK_MODE); + WorkableOverlays overlays = rtMode ? rtOverlays : beOverlays; + + boolean active = state.getValue(IS_ACTIVE); + boolean workingEnabled = state.getValue(IS_WORKING_ENABLED); + RecipeLogic.Status status = active ? + workingEnabled ? + RecipeLogic.Status.WORKING : + RecipeLogic.Status.SUSPEND : + RecipeLogic.Status.IDLE; + + BlockModelBuilder model = prov.models().nested() + .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); + tieredHullTextures(model, builder.getOwner().getTier()); + + return addWorkableOverlays(overlays, status, model); }); }; } @@ -536,7 +552,7 @@ public static MachineBuilder.ModelInitializer createWorldAcceleratorModel(Resour public static MachineBuilder.ModelInitializer createMaintenanceModel(ResourceLocation overlayModel) { return (ctx, prov, builder) -> { - builder.forAllStatesModelsExcept(state -> { + builder.forAllStatesModels(state -> { var baseModel = prov.models().nested() .parent(prov.models().getExistingFile(overlayModel)); tieredHullTextures(baseModel, builder.getOwner().getTier()); @@ -545,7 +561,7 @@ public static MachineBuilder.ModelInitializer createMaintenanceModel(ResourceLoc baseModel.texture("overlay_2", MAINTENANCE_TAPED_OVERLAY); } return baseModel; - }, IS_FORMED); + }); builder.addReplaceableTextures("bottom", "top", "side"); }; @@ -555,7 +571,6 @@ public static MachineBuilder.ModelInitializer createMaintenanceModel(ResourceLoc public static final ResourceLocation HPCA_PART_MODEL = GTCEu.id("block/machine/template/part/hpca_part_machine"); public static final ResourceLocation COMPUTER_CASING_TEXTURE = GTCEu.id("block/casings/hpca/computer_casing/"); public static final ResourceLocation ADVANCED_COMPUTER_CASING_TEXTURE = GTCEu.id("block/casings/hpca/advanced_computer_casing/"); - // spotless:on public static MachineBuilder.ModelInitializer createHPCAPartModel(boolean advanced, ResourceLocation normalTexture, @@ -571,14 +586,14 @@ public static MachineBuilder.ModelInitializer createHPCAPartModel(boolean advanc casingTexture(baseModel, "back", textures); casingTexture(baseModel, "side", textures); - builder.forAllStatesModelsExcept(state -> { + builder.forAllStatesModels(state -> { boolean damaged = state.getValue(IS_HPCA_PART_DAMAGED); boolean active = state.getValue(IS_ACTIVE); return prov.models().nested().parent(baseModel) .texture("overlay", overlay.getTexture(active, damaged)) .texture("overlay_emissive", overlay.getEmissiveTexture(active, damaged)); - }, IS_FORMED); + }); }; } @@ -594,7 +609,7 @@ public static MachineBuilder.ModelInitializer createFisherModel() { .texture("overlay_emissive", OVERLAY_QTANK_EMISSIVE_TEXTURE); tieredHullTextures(model, builder.getOwner().getTier()); - builder.partialState().setModel(model); + builder.forAllStatesModels(state -> model); }; } @@ -602,31 +617,28 @@ public static MachineBuilder.ModelInitializer createItemCollectorModel(ResourceL return (ctx, prov, builder) -> { WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); - builder.forAllStatesModels(state -> createModelFromActiveWorkingState(prov, builder, overlays, state)); - }; - } - - public static ModelFile createModelFromActiveWorkingState(@NotNull GTBlockstateProvider prov, - @NotNull MachineModelBuilder builder, - WorkableOverlays overlays, MachineRenderState state) { - RecipeLogic.Status status = state.getValue(IS_ACTIVE) ? - state.getValue(IS_WORKING_ENABLED) ? - RecipeLogic.Status.WORKING : - RecipeLogic.Status.SUSPEND : - RecipeLogic.Status.IDLE; + builder.forAllStates(state -> { + boolean active = state.getValue(IS_ACTIVE); + boolean workingEnabled = state.getValue(IS_WORKING_ENABLED); + RecipeLogic.Status status = active ? + workingEnabled ? + RecipeLogic.Status.WORKING : + RecipeLogic.Status.SUSPEND : + RecipeLogic.Status.IDLE; - BlockModelBuilder model = prov.models().nested() - .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); - tieredHullTextures(model, builder.getOwner().getTier()); + BlockModelBuilder model = prov.models().nested() + .parent(prov.models().getExistingFile(SIDED_SIDED_OVERLAY_MODEL)); + tieredHullTextures(model, builder.getOwner().getTier()); - return addWorkableOverlays(overlays, status, model); + return addWorkableOverlays(overlays, status, model); + }); + }; } // endregion // region helper functions - // spotless:off public static NonNullBiConsumer, GTBlockstateProvider> createMachineModel(MachineBuilder.ModelInitializer modelInitializer) { return (ctx, prov) -> { Block block = ctx.getEntry(); @@ -640,9 +652,8 @@ public static ModelFile createModelFromActiveWorkingState(@NotNull GTBlockstateP MachineModelBuilder builder = prov.models().getBuilder(modelLocation) .customLoader(MachineModelBuilder.begin(definition)); modelInitializer.configureModel(ctx, prov, builder); - final BlockModelBuilder model = builder.end(); - model.parent(new ModelFile.UncheckedModelFile("block/block")); + model.parent(prov.models().getExistingFile(prov.mcLoc("block/block"))); var generator = prov.multiVariantGenerator(block, Variant.variant().with(VariantProperties.MODEL, model.getLocation())); @@ -654,8 +665,8 @@ public static ModelFile createModelFromActiveWorkingState(@NotNull GTBlockstateP } // spotless:on - public static ModelFile addWorkableOverlays(WorkableOverlays overlays, RecipeLogic.Status status, - BlockModelBuilder model) { + public static ConfiguredModel[] addWorkableOverlays(WorkableOverlays overlays, RecipeLogic.Status status, + BlockModelBuilder model) { for (var entry : overlays.getTextures().entrySet()) { var face = entry.getKey(); var textures = entry.getValue(); @@ -670,7 +681,7 @@ public static ModelFile addWorkableOverlays(WorkableOverlays overlays, RecipeLog model.texture(OVERLAY_PREFIX + face.getName() + EMISSIVE_SUFFIX, overlayEmissive); } } - return model; + return ConfiguredModel.builder().modelFile(model).build(); } public static BlockModelBuilder colorOverlayHullModel(ResourceLocation overlay, diff --git a/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java index f532e194db5..27284c95f96 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/model/builder/MachineModelBuilder.java @@ -302,12 +302,7 @@ public PartBuilder part(ResourceLocation model) { } public MachineModelBuilder forAllStatesModels(Function mapper) { - return forAllStatesModelsExcept(mapper); - } - - public MachineModelBuilder forAllStatesModelsExcept(Function mapper, - Property... ignored) { - return forAllStatesExcept(mapper.andThen(m -> ConfiguredModel.builder().modelFile(m).build()), ignored); + return forAllStates(mapper.andThen(m -> ConfiguredModel.builder().modelFile(m).build())); } public MachineModelBuilder forAllStates(Function mapper) { @@ -362,14 +357,15 @@ public static class PartialState> implements Predicate private final MachineDefinition owner; @Getter private final SortedMap, Comparable> setStates; + @Nullable private final MachineModelBuilder outerBuilder; - private PartialState(MachineDefinition owner, MachineModelBuilder outerBuilder) { + private PartialState(MachineDefinition owner, @Nullable MachineModelBuilder outerBuilder) { this(owner, ImmutableMap.of(), outerBuilder); } private PartialState(MachineDefinition owner, Map, Comparable> setStates, - MachineModelBuilder outerBuilder) { + @Nullable MachineModelBuilder outerBuilder) { this.owner = owner; this.outerBuilder = outerBuilder; for (Map.Entry, Comparable> entry : setStates.entrySet()) { @@ -692,7 +688,7 @@ public class ConditionGroup { .arrayListValues() .build(); public final List nestedConditionGroups = new ArrayList<>(); - private @Nullable ConditionGroup parent = null; + private ConditionGroup parent = null; public boolean useOr; /** From f85232143a84b9491457c1d57ea727c3aaa9f6db Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 16:50:42 +0300 Subject: [PATCH 233/269] Rename early config file --- .../java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java index c03a64becd8..db567a4aa79 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/GTMixinPlugin.java @@ -29,7 +29,7 @@ public GTMixinPlugin() { } try { - CONFIG = GTEarlyConfig.load(new File("./config/gtceu-early-config.properties")); + CONFIG = GTEarlyConfig.load(new File("./config/gtceu-early.properties")); } catch (Exception e) { throw new RuntimeException("Could not load mixin configuration file for GTCEu", e); } From fef82ad3d927046fe88bebf8761064a6bfb74d9b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 19:42:27 +0300 Subject: [PATCH 234/269] Fix bad ctm texture names in light blue lamps --- .../gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta | 2 +- .../assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta index b4f85d2b175..cf7408e3bdb 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_bloom.png.mcmeta @@ -1,6 +1,6 @@ { "gtceu": { - "connection_texture": "gtceu:block/lamps/light_blue_ctm_emissive", + "connection_texture": "gtceu:block/lamps/light_blue_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta index 97a3aa4b3ca..dbfc460f870 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_blue_on.png.mcmeta @@ -1,6 +1,6 @@ { "gtceu": { - "connection_texture": "gtceu:block/lamps/light_blue_ctm", + "connection_texture": "gtceu:block/lamps/light_blue_on_ctm", "bloom": false } } \ No newline at end of file From 0780bafc13d88b279d3f9c486e4e12a86b02da8a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 19:42:49 +0300 Subject: [PATCH 235/269] Fix QuadLighterMixin's target not being remapped when it should be --- .../bloom/normal/ModelBlockRendererMixin.java | 16 ++++++++-------- .../client/bloom/normal/QuadLighterMixin.java | 11 +++++------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index efcc8ec46fa..d5475e02242 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java @@ -34,11 +34,11 @@ public class ModelBlockRendererMixin { "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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", "tesselateWithoutAO(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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V" }, remap = false) - private void gtceu$captureBloomQuads$1(BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, - PoseStack poseStack, VertexConsumer consumer, boolean checkSides, - RandomSource random, long seed, int packedOverlay, - ModelData modelData, RenderType renderType, - Operation original) { + private void gtceu$copyBloomQuads$1(BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, + PoseStack poseStack, VertexConsumer consumer, boolean checkSides, + RandomSource random, long seed, int packedOverlay, + ModelData modelData, RenderType renderType, + Operation original) { try (var $ = gtceu$currentRenderType_tl.get().with(renderType, pos)) { original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, modelData, renderType); @@ -48,9 +48,9 @@ public class ModelBlockRendererMixin { @WrapWithCondition(method = "putQuadData", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) - private boolean gtceu$captureBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] brightness, float red, float green, float blue, - int[] packedLights, int packedOverlay, boolean mulColor) { + private boolean gtceu$copyBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] brightness, float red, float green, float blue, + int[] packedLights, int packedOverlay, boolean mulColor) { if (!BloomShaderManager.isBloomShaderInUse()) return true; CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 5b56a7225ed..3c9a213b265 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -29,12 +29,11 @@ public class QuadLighterMixin implements IGTQuadLighter { @WrapWithCondition(method = "process", at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) - private boolean gtceu$skipBloomyQuadsFromModel(VertexConsumer instance, PoseStack.Pose poseEntry, - BakedQuad quad, float[] brightness, - float red, float green, float blue, - int[] packedLights, int packedOverlay, - boolean mulColor) { + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", + remap = true)) + private boolean gtceu$copyBloomQuads(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, + float[] brightness, float red, float green, float blue, + int[] packedLights, int packedOverlay, boolean mulColor) { if (!BloomShaderManager.isBloomShaderInUse()) return true; BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), From 55c3bfd47811d850685b2f379504097dd7ab713d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 19:45:21 +0300 Subject: [PATCH 236/269] Downgrade Embeddium to a release version --- gradle/forge.versions.toml | 2 +- .../embeddium/DefaultTerrainRenderPassesMixin.java | 10 ---------- .../gtceu/integration/embeddium/GTEmbeddiumCompat.java | 5 +---- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index 60c998e8480..662eadc6f0c 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -30,7 +30,7 @@ xaerosMinimap = "25.3.10" ## modrinth maven ## jade = "11.6.3" -embeddium = "0.3.32-beta.57+mc1.20.1" +embeddium = "0.3.31-beta.53+mc1.20.1" oculus = "1.20.1-1.8.0" modernfix = "DdUByV9S" # 5.24.1+mc1.20.1 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 ce06b51be23..49f17c726d8 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 @@ -26,19 +26,9 @@ public class DefaultTerrainRenderPassesMixin { @Mutable public static TerrainRenderPass[] ALL; - @Shadow - @Final - @Mutable - public static Map> RENDER_PASS_MAPPINGS; - static { if (BloomShaderManager.isBloomShaderAvailable()) { ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.BLOOM_RENDER_PASS); - - RENDER_PASS_MAPPINGS = ImmutableMap.>builder() - .putAll(RENDER_PASS_MAPPINGS) - .put(GTRenderTypes.bloom(), List.of(GTEmbeddiumCompat.BLOOM_RENDER_PASS)) - .build(); } } } 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 0c62c575c21..c921f638296 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -19,10 +19,7 @@ public class GTEmbeddiumCompat { - public static final TerrainRenderPass BLOOM_RENDER_PASS = TerrainRenderPass.builder() - .layer(GTRenderTypes.bloom()) - .fragmentDiscard(true) - .build(); + 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.ONE_TENTH, false); From 287808450e4a849f608075649a5ab19ace10d924 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 19:55:31 +0300 Subject: [PATCH 237/269] Remove unnecessary bloom availability checks --- .../client/bloom/normal/RenderTypeMixin.java | 5 ++++- .../DefaultTerrainRenderPassesMixin.java | 6 +++--- .../normal/oculus/WorldRenderingPhaseMixin.java | 17 ++++++++--------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index 2c011fb9890..db3fe9bbb5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; import net.minecraft.client.renderer.RenderType; @@ -18,7 +19,9 @@ public class RenderTypeMixin { target = "Lcom/google/common/collect/ImmutableList;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableList;", remap = false)) private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { - if (!BloomShaderManager.isBloomShaderAvailable()) return original; + // don't bother checking if bloom can be loaded here; Bloom can't be used with OptiFine installed and shaders + // aren't loaded when this class is loaded. + if (GTEarlyConfig.OPTIFINE_PRESENT) return original; return ImmutableList.builder() .addAll(original).add(GTRenderTypes.bloom()) 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 49f17c726d8..55fe56ee333 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 @@ -27,8 +27,8 @@ public class DefaultTerrainRenderPassesMixin { public static TerrainRenderPass[] ALL; static { - if (BloomShaderManager.isBloomShaderAvailable()) { - ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.BLOOM_RENDER_PASS); - } + // 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. + ALL = ArrayUtils.add(ALL, GTEmbeddiumCompat.BLOOM_RENDER_PASS); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index 87900ad1049..38e0318ffb1 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -8,10 +8,7 @@ import net.minecraft.client.renderer.RenderType; import org.apache.commons.lang3.ArrayUtils; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -25,17 +22,19 @@ public class WorldRenderingPhaseMixin { @Mutable private static WorldRenderingPhase[] $VALUES; - @SuppressWarnings("SameParameterValue") + @Unique + private static final WorldRenderingPhase GTCEU$BLOOM; + @Invoker("") private static WorldRenderingPhase gtceu$callInit(String name, int ordinal) { throw new AssertionError(); } static { - if (BloomShaderManager.isBloomShaderAvailable()) { - GTIrisHooks.BLOOM_RENDERING_PHASE = gtceu$callInit("GTCEU:BLOOM", $VALUES.length); - $VALUES = ArrayUtils.add($VALUES, GTIrisHooks.BLOOM_RENDERING_PHASE); - } + // don't bother checking if bloom can be loaded here; Oculus won't load with OptiFine installed and shaders + // aren't loaded when this class is loaded. + GTCEU$BLOOM = gtceu$callInit("GTCEU$BLOOM", $VALUES.length); + $VALUES = ArrayUtils.add($VALUES, GTCEU$BLOOM); } @Inject(method = "fromTerrainRenderType", at = @At(value = "HEAD"), cancellable = true) From 6329d17d0ed4bd633b4b62a4a0b8b7350d737a17 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 19:56:44 +0300 Subject: [PATCH 238/269] Rename `BloomShaderManager.isBloomShaderInUse` to `isBloomActive` and `isBloomShaderAvailable` to `isBloomAvailable` --- .../gtceu/client/bloom/BloomEventListeners.java | 6 +++--- .../gtceu/client/bloom/BloomSafeMode.java | 4 ++-- .../gtceu/client/bloom/BloomShaderManager.java | 12 ++++++------ .../gregtechceu/gtceu/client/bloom/BloomUtil.java | 4 ++-- .../gtceu/client/renderer/GTRenderTypes.java | 4 ++-- .../renderer/machine/impl/FusionRingRender.java | 2 +- .../client/bloom/normal/ModelBlockRendererMixin.java | 2 +- .../mixins/client/bloom/normal/QuadLighterMixin.java | 2 +- .../mixins/client/bloom/normal/RebuildTaskMixin.java | 2 +- .../bloom/normal/embeddium/BlockRendererMixin.java | 2 +- .../normal/embeddium/DefaultMaterialsMixin.java | 2 +- .../normal/oculus/WorldRenderingPhaseMixin.java | 2 +- .../bloom/safemode/embeddium/BlockRendererMixin.java | 2 +- .../integration/embeddium/GTEmbeddiumCompat.java | 2 +- 14 files changed, 24 insertions(+), 24 deletions(-) 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 754bbcbe05a..ac9470836d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -40,7 +40,7 @@ public static void afterParticlesRendered(RenderLevelStageEvent event) { @SubscribeEvent public static void onRenderTick(TickEvent.RenderTickEvent event) { if (event.phase != TickEvent.Phase.START || Minecraft.getInstance().level == null) return; - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; BloomShaderManager.BLOOM_TARGET.clear(Minecraft.ON_OSX); Minecraft.getInstance().getMainRenderTarget().bindWrite(false); @@ -58,7 +58,7 @@ public static void onLevelUnload(LevelEvent.Unload event) { @SubscribeEvent public static void onChunkUnload(ChunkEvent.Unload event) { - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; ChunkAccess chunk = event.getChunk(); LevelAccessor level = chunk.getWorldForge(); @@ -90,7 +90,7 @@ public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent e public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { RenderType block, entity; if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME) || - !BloomShaderManager.isBloomShaderAvailable()) { + !BloomShaderManager.isBloomAvailable()) { // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' block = RenderType.cutout(); entity = ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java index 5582d106239..7f49ff17e4e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java @@ -90,7 +90,7 @@ public static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum fr } public static void copyToBloomBuffer(BakedQuad quad, int[] combinedLights, Consumer draw) { - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; SectionPos sectionOrigin = CURRENT_RENDERING_SECTION.get(); if (sectionOrigin != null && TextureMetadataHelper.hasBloom(quad, combinedLights)) { @@ -142,7 +142,7 @@ public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { } public static void bakeBloomChunkBuffers(SectionPos sectionPos, Vec3 camPos) { - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(sectionPos); if (builder == null || !builder.building()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index 2ec818cacae..532fe3900f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -51,9 +51,9 @@ public static void initPostShaders() { deinitPostShaders(); // forcefully update availability on (re-)load - bloomShaderAvailable = updateBloomShaderAvailability(); + bloomAvailable = updateBloomShaderAvailability(); - if (!isBloomShaderAvailable()) return; + if (!isBloomAvailable()) return; ResourceLocation id = null; @@ -102,13 +102,13 @@ private static void deinitPostShaders() { } } - public static boolean isBloomShaderInUse() { + public static boolean isBloomActive() { return BLOOM_CHAIN != null && BLOOM_TARGET != null && - ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && isBloomShaderAvailable(); + ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && isBloomAvailable(); } @Getter - private static boolean bloomShaderAvailable = updateBloomShaderAvailability(); + private static boolean bloomAvailable = updateBloomShaderAvailability(); @ApiStatus.Internal public static void updateShaderAvailability(TickEvent.ClientTickEvent event) { @@ -118,7 +118,7 @@ public static void updateShaderAvailability(TickEvent.ClientTickEvent event) { // only update bloom availability once a second so every frame isn't bogged down with mod loaded checks if (tick % 20 != 0) return; - bloomShaderAvailable = updateBloomShaderAvailability(); + bloomAvailable = updateBloomShaderAvailability(); } private static boolean updateBloomShaderAvailability() { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index b45a7868bc2..eb0ca436eae 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -159,7 +159,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup, IBloomEffect render, @Nullable Predicate validityChecker, @Nullable Supplier<@Nullable Level> worldContext) { - if (!BloomShaderManager.isBloomShaderInUse()) return BloomRenderTicket.INVALID; + if (!BloomShaderManager.isBloomActive()) return BloomRenderTicket.INVALID; BloomRenderTicket ticket = new BloomRenderTicket(setup, render, validityChecker, worldContext); BLOOM_RENDER_LOCK.writeLock().lock(); @@ -174,7 +174,7 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup @ApiStatus.Internal public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, float partialTicks, LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; Vec3 camPos = camera.getPosition(); 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 d132c13377c..c325a53a38e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -22,12 +22,12 @@ public class GTRenderTypes extends RenderType { public static final RenderStateShard.OutputStateShard BLOOM_TARGET = new RenderStateShard.OutputStateShard( "bloom_target", () -> { - if (BloomShaderManager.isBloomShaderInUse()) { + if (BloomShaderManager.isBloomActive()) { BloomShaderManager.BLOOM_TARGET.bindWrite(false); } }, () -> { - if (BloomShaderManager.isBloomShaderInUse()) { + if (BloomShaderManager.isBloomActive()) { Minecraft.getInstance().getMainRenderTarget().bindWrite(false); } }); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index d1928ba465e..219e26e7d19 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -62,7 +62,7 @@ public void render(FusionReactorMachine machine, float partialTick, PoseStack po if (machine.getRegisteredBloomTicket().isValid() && !machine.isFormed()) { machine.getRegisteredBloomTicket().invalidate(); } - if (!machine.getRegisteredBloomTicket().isValid() && BloomShaderManager.isBloomShaderInUse()) { + if (!machine.getRegisteredBloomTicket().isValid() && BloomShaderManager.isBloomActive()) { BloomRenderTicket ticket = BloomUtil.registerBloomRender(FusionBloomEffect.SETUP, new FusionBloomEffect(machine), machine); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index d5475e02242..f9f4fc32ca4 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java @@ -51,7 +51,7 @@ public class ModelBlockRendererMixin { private boolean gtceu$copyBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!BloomShaderManager.isBloomShaderInUse()) return true; + if (!BloomShaderManager.isBloomActive()) return true; CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); if (!currentData.isSet()) return true; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 3c9a213b265..19986d69b47 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -34,7 +34,7 @@ public class QuadLighterMixin implements IGTQuadLighter { private boolean gtceu$copyBloomQuads(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, float[] brightness, float red, float green, float blue, int[] packedLights, int packedOverlay, boolean mulColor) { - if (!BloomShaderManager.isBloomShaderInUse()) return true; + if (!BloomShaderManager.isBloomActive()) return true; BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), packedLights, packedOverlay, brightness, red, green, blue); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java index 1a8dcaf9c78..badd4e711c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java @@ -34,7 +34,7 @@ public abstract class RebuildTaskMixin { CallbackInfoReturnable cir, @Local(ordinal = 0) BlockPos sectionOrigin, @Local Set usedRenderTypes) { - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; long sectionPos = SectionPos.asLong(sectionOrigin); if (!BloomUtil.chunkSectionHasBloomQuads(sectionPos)) return; 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 1c119bc72b9..c314fbc5c5a 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 @@ -36,7 +36,7 @@ public class BlockRendererMixin { @Share("bloomBuilder") LocalRef bloomBuilderRef) { original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); if (chunkContext != null && TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { 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 0e015d39ae0..4d1f80c5e5e 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 @@ -19,7 +19,7 @@ public class DefaultMaterialsMixin { @Inject(method = "forRenderLayer", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - if (!BloomShaderManager.isBloomShaderAvailable()) return; + if (!BloomShaderManager.isBloomAvailable()) return; if (renderType == GTRenderTypes.bloom()) { cir.setReturnValue(GTEmbeddiumCompat.BLOOM_MATERIAL); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index 38e0318ffb1..3749386c64c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -40,7 +40,7 @@ public class WorldRenderingPhaseMixin { @Inject(method = "fromTerrainRenderType", at = @At(value = "HEAD"), cancellable = true) private static void gtceu$fixBloomLayerError(RenderType renderType, CallbackInfoReturnable cir) { - if (!BloomShaderManager.isBloomShaderAvailable()) return; + if (!BloomShaderManager.isBloomAvailable()) return; if (renderType == GTRenderTypes.bloom()) { cir.setReturnValue(GTIrisHooks.getBloomRenderingPhase()); 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 450a2ccbfcd..2a57b8ed232 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 @@ -42,7 +42,7 @@ public class BlockRendererMixin { CallbackInfo ci, @Share("bufferBuilder") LocalRef bufferBuilderRef) { // Check if quad is full brightness OR we have bloom enabled for the quad - if (!BloomShaderManager.isBloomShaderInUse() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { + if (!BloomShaderManager.isBloomActive() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { bufferBuilderRef.set(null); return; } 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 c921f638296..883d076ee5d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -30,7 +30,7 @@ public static void init() { @SubscribeEvent public static void registerSafeModeChunkMeshAppender(ChunkMeshEvent event) { if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) return; - if (!BloomShaderManager.isBloomShaderInUse()) return; + if (!BloomShaderManager.isBloomActive()) return; event.addMeshAppender(context -> { SectionPos sectionOrigin = context.sectionOrigin(); From 86f25a1dd3932bb0b2064458db5020c446f94ed6 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 20:49:11 +0300 Subject: [PATCH 239/269] Add an update listener for the config field so bloom shaders are automatically updated when it's changed --- .../resources/assets/gtceu/lang/en_ud.json | 1 + .../resources/assets/gtceu/lang/en_us.json | 1 + .../client/bloom/BloomShaderManager.java | 23 +++++------ .../gtceu/config/ConfigHolder.java | 39 ++++++++++++++++++- .../gtceu/data/lang/ConfigurationLang.java | 3 ++ 5 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 6b0755bbbca..0f4d96a813a 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1769,6 +1769,7 @@ "config.gtceu.option.bedrockOreDropTagPrefix": "xıɟǝɹԀbɐ⟘doɹᗡǝɹOʞɔoɹpǝq", "config.gtceu.option.bloom": "ɯooןq", "config.gtceu.option.bloomType": "ǝdʎ⟘ɯooןq", + "config.gtceu.option.bloomType.load_error": "sןıɐʇǝp ɹoɟ %s ǝǝs 'ʇɔǝɟɟǝ ɯooןq ǝɥʇ ɹoɟ sɹǝpɐɥs pɐoן ʇou pןnoƆ", "config.gtceu.option.borderColor": "ɹoןoƆɹǝpɹoq", "config.gtceu.option.bronzeBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺǝzuoɹq", "config.gtceu.option.bronzeBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺǝzuoɹq", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6d31d118c92..63721612f3a 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1769,6 +1769,7 @@ "config.gtceu.option.bedrockOreDropTagPrefix": "bedrockOreDropTagPrefix", "config.gtceu.option.bloom": "bloom", "config.gtceu.option.bloomType": "bloomType", + "config.gtceu.option.bloomType.load_error": "Could not load shaders for the bloom effect, see %s for details", "config.gtceu.option.borderColor": "borderColor", "config.gtceu.option.bronzeBoilerHeatSpeed": "bronzeBoilerHeatSpeed", "config.gtceu.option.bronzeBoilerMaxTemperature": "bronzeBoilerMaxTemperature", diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index 532fe3900f1..81974187edd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -46,14 +46,15 @@ public static void onRegisterShaders(RegisterShadersEvent event) throws IOExcept shader -> rendertypeEntityBloomShader = shader); } + /// @return whether the post effect was loaded successfully @ApiStatus.Internal - public static void initPostShaders() { + public static boolean initPostShaders() { deinitPostShaders(); // forcefully update availability on (re-)load bloomAvailable = updateBloomShaderAvailability(); - if (!isBloomAvailable()) return; + if (!isBloomAvailable()) return false; ResourceLocation id = null; @@ -61,14 +62,14 @@ public static void initPostShaders() { case UNITY -> id = GTCEu.id("shaders/post/bloom_unity.json"); case UNREAL -> id = GTCEu.id("shaders/post/bloom_unreal.json"); case DISABLED -> { - return; + return true; } // skip adding a default branch in favor of the if statement below } if (id == null) { GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.bloom.bloomType); ConfigHolder.INSTANCE.client.bloom.bloomType = BloomAlgorithm.DISABLED; - return; + return false; } try { @@ -77,18 +78,12 @@ public static void initPostShaders() { BLOOM_CHAIN = new PostChain(mc.getTextureManager(), mc.getResourceManager(), mc.getMainRenderTarget(), id); BLOOM_CHAIN.resize(mc.getWindow().getWidth(), mc.getWindow().getHeight()); BLOOM_TARGET = BLOOM_CHAIN.getTempTarget("final"); - } catch (IOException e) { - GTCEu.LOGGER.error("Failed to load shader {}:", id, e); - BLOOM_CHAIN = null; - BLOOM_TARGET = null; - } catch (JsonSyntaxException e) { - GTCEu.LOGGER.error("Failed to parse shader {}:", id, e); - BLOOM_CHAIN = null; - BLOOM_TARGET = null; - } catch (RuntimeException e) { - GTCEu.LOGGER.error("Unexpected error loading shader {}:", id, e); + return true; + } catch (Exception e) { + GTCEu.LOGGER.error("Failed to {} shader {}:", e instanceof JsonSyntaxException ? "parse" : "load", id, e); BLOOM_CHAIN = null; BLOOM_TARGET = null; + return false; } } diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 05067ba310e..b2929c5ec3b 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -3,13 +3,22 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; +import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import net.minecraft.commands.Commands; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraftforge.fml.loading.FMLPaths; import dev.toma.configuration.Configuration; +import dev.toma.configuration.client.IValidationHandler; import dev.toma.configuration.config.Config; import dev.toma.configuration.config.Configurable; import dev.toma.configuration.config.format.ConfigFormats; +import dev.toma.configuration.config.validate.ValidationResult; +import org.jetbrains.annotations.ApiStatus; + +import java.nio.file.Path; @Config(id = GTCEu.MOD_ID) public class ConfigHolder { @@ -17,10 +26,14 @@ public class ConfigHolder { public static ConfigHolder INSTANCE; private static final Object LOCK = new Object(); + @ApiStatus.Internal + public static dev.toma.configuration.config.ConfigHolder INTERNAL_INSTANCE; + public static void init() { synchronized (LOCK) { if (INSTANCE == null) { - INSTANCE = Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getConfigInstance(); + INTERNAL_INSTANCE = Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()); + INSTANCE = INTERNAL_INSTANCE.getConfigInstance(); } } } @@ -831,10 +844,13 @@ public static class BloomOptions { @Configurable @Configurable.Comment({ "Bloom Algorithm", + "Requires reloading all chunks ", "UNITY - Unity-like Bloom (rescale)", "UNREAL - Unreal-like Bloom (gaussian blur)", "DISABLED - No bloom", "Default: UNREAL" }) + @Configurable.ValueUpdateCallback(method = "onBloomTypeOptionChange") + // @Configurable.Validator(BloomEventListeners.BloomTypeUpdateCallback.class) // for Configuration 3.x public BloomAlgorithm bloomType = BloomAlgorithm.UNREAL; @Configurable @@ -878,6 +894,27 @@ public static class BloomOptions { @Configurable.Comment({ "Blur Step (bloom range)", "Default: 1" }) @Configurable.DecimalRange(min = 0) public float step = 1.0f; + + // used by bloomType field's value update callback + @SuppressWarnings("unused") + private void onBloomTypeOptionChange(BloomAlgorithm bloomType, IValidationHandler validationHandler) { + if (!BloomShaderManager.initPostShaders()) { + // failed to load post shaders + + Path gameDir = FMLPaths.GAMEDIR.get().toAbsolutePath(); + Path logFile = gameDir.resolve(Path.of("logs", "latest.log")); + Component latestLogClickable = Component.literal(gameDir.relativize(logFile).toString()) + .withStyle((style) -> style.withUnderlined(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, + logFile.toFile().toString()))); + + validationHandler.setValidationResult(ValidationResult.warn(Component.translatable( + "config.gtceu.option.bloomType.load_error", latestLogClickable))); + } else { + // post shader loaded successfully + validationHandler.setOkStatus(); + } + } } public static class RendererOptions { diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java index d24677602c5..42ffac29a46 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ConfigurationLang.java @@ -16,6 +16,9 @@ public class ConfigurationLang { public static void init(RegistrateLangProvider provider) { + provider.add("config.gtceu.option.bloomType.load_error", + "Could not load shaders for the bloom effect, see %s for details"); + dfs(provider, new HashSet<>(), Configuration.registerConfig(ConfigHolder.class, ConfigFormats.yaml()).getValueMap()); } From 1e59aee75be1a0f13fbe70411cb6056c0211f232 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 20:49:21 +0300 Subject: [PATCH 240/269] Spotless --- .../core/mixins/client/bloom/normal/RenderTypeMixin.java | 1 - .../normal/embeddium/DefaultTerrainRenderPassesMixin.java | 8 -------- 2 files changed, 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index db3fe9bbb5b..c5c37fea0c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; -import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.core.config.GTEarlyConfig; 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 55fe56ee333..55c67e51da2 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 @@ -1,12 +1,7 @@ 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.integration.embeddium.GTEmbeddiumCompat; -import net.minecraft.client.renderer.RenderType; - -import com.google.common.collect.ImmutableMap; import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import org.apache.commons.lang3.ArrayUtils; @@ -15,9 +10,6 @@ import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; -import java.util.List; -import java.util.Map; - @Mixin(value = DefaultTerrainRenderPasses.class, remap = false) public class DefaultTerrainRenderPassesMixin { From d4e1f6dd63391cf8a6768b795efa567c4fdad95e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 23:37:57 +0300 Subject: [PATCH 241/269] Fix bloom clearing the main render target's depth buffer --- .../gregtechceu/gtceu/core/PostPassExt.java | 10 +++++ .../mixins/client/bloom/PostChainMixin.java | 43 +++++++++++++----- .../mixins/client/bloom/PostPassMixin.java | 45 +++++++++++++++++++ .../gtceu/shaders/post/bloom_unity.json | 8 +++- .../gtceu/shaders/post/bloom_unreal.json | 35 ++++++++------- .../assets/gtceu/shaders/program/blur.json | 4 +- .../gtceu/shaders/program/down_sampling.json | 4 +- .../shaders/program/filter_bloom_color.json | 4 +- .../gtceu/shaders/program/unity_composite.fsh | 7 ++- .../shaders/program/unity_composite.json | 4 +- .../shaders/program/unreal_composite.fsh | 5 +++ .../shaders/program/unreal_composite.json | 4 +- .../gtceu/shaders/program/up_sampling.json | 8 ++-- src/main/resources/gtceu.mixins.json | 2 + 14 files changed, 133 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java b/src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java new file mode 100644 index 00000000000..26947c3a47a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java @@ -0,0 +1,10 @@ +package com.gregtechceu.gtceu.core; + +import com.mojang.blaze3d.pipeline.RenderTarget; + +import java.util.function.IntSupplier; + +public interface PostPassExt { + + default void gtceu$copyDepthFrom(RenderTarget source) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java index baae0f0aba8..458f631b433 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java @@ -1,36 +1,55 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.core.PostPassExt; + import net.minecraft.client.renderer.PostChain; +import net.minecraft.client.renderer.PostPass; import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.pipeline.RenderTarget; import org.lwjgl.opengl.GL11; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Map; - @Mixin(PostChain.class) -public class PostChainMixin { +public abstract class PostChainMixin { @Shadow - @Final - private Map customRenderTargets; + protected abstract RenderTarget getRenderTarget(String target); - @Inject(method = "parseTargetNode", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/PostChain;addTempTarget(Ljava/lang/String;II)V", - ordinal = 1, - shift = At.Shift.AFTER)) + @Definition(id = "addTempTarget", + method = "Lnet/minecraft/client/renderer/PostChain;addTempTarget(Ljava/lang/String;II)V") + @Definition(id = "name", local = @Local(type = String.class)) // targeting locals is brittle, so minimize them + @Expression("this.addTempTarget(name, ?, ?)") + @Inject(method = "parseTargetNode", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) private void gtceu$makeTargetLinear(CallbackInfo ci, @Local JsonObject json, @Local String name) { if (GsonHelper.getAsBoolean(json, "bilinear", false)) { - this.customRenderTargets.get(name).setFilterMode(GL11.GL_LINEAR); + this.getRenderTarget(name).setFilterMode(GL11.GL_LINEAR); + } + } + + @ModifyExpressionValue(method = "parsePassNode", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/renderer/PostChain;addPass(Ljava/lang/String;Lcom/mojang/blaze3d/pipeline/RenderTarget;Lcom/mojang/blaze3d/pipeline/RenderTarget;)Lnet/minecraft/client/renderer/PostPass;")) + private PostPass gtceu$setPassClearOutputValue(PostPass pass, @Local JsonObject json) { + String copyDepthFrom = GsonHelper.getAsString(json, "copy_depth_from", null); + if (copyDepthFrom != null) { + RenderTarget source = this.getRenderTarget(copyDepthFrom); + if (source != null) { + ((PostPassExt) pass).gtceu$copyDepthFrom(source); + } else { + GTCEu.LOGGER.error("Cannot copy depth from invalid render target {}", copyDepthFrom); + } } + return pass; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java new file mode 100644 index 00000000000..8dfe2dc28b1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java @@ -0,0 +1,45 @@ +package com.gregtechceu.gtceu.core.mixins.client.bloom; + +import com.gregtechceu.gtceu.core.PostPassExt; + +import net.minecraft.client.renderer.PostPass; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.mojang.blaze3d.pipeline.RenderTarget; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.function.IntSupplier; + +@Mixin(PostPass.class) +public class PostPassMixin implements PostPassExt { + + @Shadow + @Final + public RenderTarget outTarget; + + @Unique + private @Nullable RenderTarget gtceu$copyDepthFrom = null; + + @Definition(id = "outTarget", field = "Lnet/minecraft/client/renderer/PostPass;outTarget:Lcom/mojang/blaze3d/pipeline/RenderTarget;") + @Definition(id = "unbindWrite", method = "Lcom/mojang/blaze3d/pipeline/RenderTarget;unbindWrite()V") + @Expression("this.outTarget.unbindWrite()") + @Inject(method = "process", at = @At(value = "MIXINEXTRAS:EXPRESSION")) + private void gtceu$copyInputDepthToOutput(float partialTicks, CallbackInfo ci) { + if (gtceu$copyDepthFrom != null) { + this.outTarget.copyDepthFrom(gtceu$copyDepthFrom); + } + } + + @Override + public void gtceu$copyDepthFrom(RenderTarget source) { + this.gtceu$copyDepthFrom = source; + } +} 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 b661878a69c..75ff8e6fc97 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -69,12 +69,16 @@ "auxtargets": [ { "id": "filter", "name": "HighlightSampler" }, { "id": "minecraft:main", "name": "MainSampler" } - ] + ], + + "copy_depth_from": "minecraft:main" }, { "name": "blit", "intarget": "final", - "outtarget": "minecraft:main" + "outtarget": "minecraft:main", + + "copy_depth_from": "final" } ] } 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 11488db164d..96318bd7ed6 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -2,10 +2,10 @@ "targets": [ "final", "filter", - { "name": "swap", "bilinear": true }, - { "name": "swap_b1", "bilinear": true }, - { "name": "swap_b2", "bilinear": true }, - { "name": "swap_b3", "bilinear": true }, + { "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 } ], "passes": [ @@ -16,13 +16,14 @@ "auxtargets": [ { "id": "final:depth", "name": "DiffuseDepthSampler" }, { "id": "minecraft:main", "name": "MainSampler" }, - { "id": "minecraft:main:depth", "name": "MainDepthSampler" } + { "id": "minecraft:main:depth", "name": "MainDepthSampler" }, + { "id": "minecraft:main:depth", "name": "DepthSampler" } ] }, { "name": "gtceu:blur", "intarget": "filter", - "outtarget": "swap", + "outtarget": "swap_b0", "uniforms": [ { "name": "BlurDir", @@ -36,7 +37,7 @@ }, { "name": "gtceu:blur", - "intarget": "swap", + "intarget": "swap_b0", "outtarget": "swap_b1", "uniforms": [ { @@ -52,7 +53,7 @@ { "name": "gtceu:blur", "intarget": "swap_b1", - "outtarget": "swap", + "outtarget": "swap_b0", "uniforms": [ { "name": "BlurDir", @@ -66,7 +67,7 @@ }, { "name": "gtceu:blur", - "intarget": "swap", + "intarget": "swap_b0", "outtarget": "swap_b2", "uniforms": [ { @@ -82,7 +83,7 @@ { "name": "gtceu:blur", "intarget": "swap_b2", - "outtarget": "swap", + "outtarget": "swap_b0", "uniforms": [ { "name": "BlurDir", @@ -96,7 +97,7 @@ }, { "name": "gtceu:blur", - "intarget": "swap", + "intarget": "swap_b0", "outtarget": "swap_b3", "uniforms": [ { @@ -112,7 +113,7 @@ { "name": "gtceu:blur", "intarget": "swap_b3", - "outtarget": "swap", + "outtarget": "swap_b0", "uniforms": [ { "name": "BlurDir", @@ -126,7 +127,7 @@ }, { "name": "gtceu:blur", - "intarget": "swap", + "intarget": "swap_b0", "outtarget": "swap_b4", "uniforms": [ { @@ -152,12 +153,16 @@ ], "uniforms": [ { "name": "BloomRadius", "values": [1.0] } - ] + ], + + "copy_depth_from": "minecraft:main" }, { "name": "blit", "intarget": "final", - "outtarget": "minecraft:main" + "outtarget": "minecraft:main", + + "copy_depth_from": "final" } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.json b/src/main/resources/assets/gtceu/shaders/program/blur.json index 8a1ed353426..79361fb9ca0 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.json +++ b/src/main/resources/assets/gtceu/shaders/program/blur.json @@ -2,9 +2,7 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha", - "srcalpha": "zero", - "dstalpha": "one" + "dstrgb": "1-srcalpha" }, "vertex": "blit", "fragment": "gtceu:blur", diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json index 244807fae30..df122db23d6 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json @@ -2,9 +2,7 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha", - "srcalpha": "zero", - "dstalpha": "one" + "dstrgb": "1-srcalpha" }, "vertex": "blit", "fragment": "gtceu:down_sampling", diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index a6a31c4e6e1..b2ac4345a46 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -2,9 +2,7 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha", - "srcalpha": "zero", - "dstalpha": "one" + "dstrgb": "1-srcalpha" }, "vertex": "blit", "fragment": "gtceu:filter_bloom_color", diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh index 3059e925221..06775a3e668 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh @@ -12,9 +12,13 @@ in vec2 texCoord; out vec4 fragColor; void main() { - vec4 highlight = texture(HighlightSampler, texCoord); vec4 bloom = BloomStrength * texture(DiffuseSampler, texCoord); +// if (bloom.a < 0.1) { +// fragColor = vec4(0.0); +// return; +// } + vec4 highlight = texture(HighlightSampler, texCoord); vec4 background = texture(MainSampler, texCoord); background.rgb = background.rgb * (1 - highlight.a) + highlight.a * highlight.rgb; @@ -22,5 +26,6 @@ void main() { float max = max(background.r, max(background.g, background.b)); float backgroundBrightness = (max + min) / 2.0; + // fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), background.a); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json index 411ff0180fa..5b31a23674b 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -2,9 +2,7 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha", - "srcalpha": "zero", - "dstalpha": "one" + "dstrgb": "1-srcalpha" }, "vertex": "blit", "fragment": "gtceu:unity_composite", diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh index 57a266f3021..d25e7bc0562 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -53,6 +53,10 @@ void main() { lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); +// if (bloom.a < 0.1) { +// fragColor = vec4(0.0); +// return; +// } bloom.rgb = jodieReinhardTonemap(bloom.rgb); vec4 background = texture(DiffuseSampler, texCoord); @@ -63,5 +67,6 @@ void main() { float max = max(background.r, max(background.g, background.b)); float backgroundBrightness = (max + min) / 2.0; + // fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), background.a); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index 011e688ca50..5b6c181ee2c 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -2,9 +2,7 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha", - "srcalpha": "zero", - "dstalpha": "one" + "dstrgb": "1-srcalpha" }, "vertex": "blit", "fragment": "gtceu:unreal_composite", diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json index 1ada000f1e3..6087bbbf925 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -1,12 +1,10 @@ { "blend": { - "func": "add", + "func": "add",s "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha", - "srcalpha": "zero", - "dstalpha": "one" + "dstrgb": "1-srcalpha" }, - "vertex": "blit", + "vertex": "gtceu:blit_copy_depth", "fragment": "gtceu:up_sampling", "attributes": [ "Position" ], "samplers": [ diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 778325ad6d4..d1a42adac73 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -32,6 +32,7 @@ "client.bloom.LevelRendererMixin", "client.bloom.PostChainAccessor", "client.bloom.PostChainMixin", + "client.bloom.PostPassMixin", "client.bloom.normal.ForgeModelBlockRendererMixin", "client.bloom.normal.LevelRendererAccessor", "client.bloom.normal.ModelBlockRendererMixin", @@ -90,6 +91,7 @@ "TagManagerMixin", "TagValueAccessor", "client.ItemEntityMixin", + "client.bloom.normal.embeddium.SodiumWorldRendererMixin", "dev.datagen.FixParallelKeyMappingRegistrationMixin", "dev.test.GameTestRegistryMixin", "emi.EmiRecipeFillerMixin", From 0b9b5b1064e29295d87c30726e60faebac4e6031 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 23:38:54 +0300 Subject: [PATCH 242/269] actually, it *is* mipped. oops. --- .../gtceu/client/bloom/BloomEventListeners.java | 2 +- .../gregtechceu/gtceu/client/renderer/GTRenderTypes.java | 8 ++++---- .../gtceu/integration/embeddium/GTEmbeddiumCompat.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) 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 ac9470836d2..373c5caf39c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -92,7 +92,7 @@ public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME) || !BloomShaderManager.isBloomAvailable()) { // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' - block = RenderType.cutout(); + block = RenderType.cutoutMipped(); entity = ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); } else { block = GTRenderTypes.bloom(); 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 c325a53a38e..d71227d9f0a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/GTRenderTypes.java @@ -44,23 +44,23 @@ public class GTRenderTypes extends RenderType { .createCompositeState(false)); private static final RenderType BLOOM = RenderType.create("gtceu:bloom", DefaultVertexFormat.BLOCK, - VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, false, false, + VertexFormat.Mode.QUADS, RenderType.BIG_BUFFER_SIZE, true, false, RenderType.CompositeState.builder() .setShaderState(RENDERTYPE_BLOOM_SHADER) .setOutputState(BLOOM_TARGET) .setLightmapState(LIGHTMAP) .setTextureState(BLOCK_SHEET_MIPPED) - .createCompositeState(false)); + .createCompositeState(true)); private static final Function ENTITY_BLOOM = Util.memoize((texture) -> { return create("gtceu:entity_bloom", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, - RenderType.TRANSIENT_BUFFER_SIZE, false, false, + 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)) - .createCompositeState(false)); + .createCompositeState(true)); }); private static final RenderType MONITOR = RenderType.create("central_monitor", 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 883d076ee5d..fe0910c0fcf 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -21,7 +21,7 @@ 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.ONE_TENTH, false); + AlphaCutoffParameter.ONE_TENTH, true); public static void init() { MinecraftForge.EVENT_BUS.register(GTEmbeddiumCompat.class); From f99f2730d42fab7ef36eda64133114b91ade995f Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 23:39:39 +0300 Subject: [PATCH 243/269] Fix compatibility with latest curseforge/modrinth release of Embeddium (fr this time) --- .../DefaultTerrainRenderPassesMixin.java | 1 + .../embeddium/SodiumWorldRendererMixin.java | 36 +++++++++++++++++++ .../oculus/WorldRenderingPhaseMixin.java | 4 +-- .../gtceu/integration/iris/GTIrisHooks.java | 21 ----------- .../gtceu/integration/iris/package-info.java | 4 --- 5 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/SodiumWorldRendererMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/iris/GTIrisHooks.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java 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 55c67e51da2..f763198b2b3 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 @@ -21,6 +21,7 @@ public class DefaultTerrainRenderPassesMixin { static { // 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); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/SodiumWorldRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/SodiumWorldRendererMixin.java new file mode 100644 index 00000000000..c650f6284cd --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/embeddium/SodiumWorldRendererMixin.java @@ -0,0 +1,36 @@ +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.integration.embeddium.GTEmbeddiumCompat; + +import net.minecraft.client.renderer.RenderType; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.vertex.PoseStack; +import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; +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; + +@Mixin(value = SodiumWorldRenderer.class, remap = false) +public class SodiumWorldRendererMixin { + + @Shadow + private RenderSectionManager renderSectionManager; + + @Inject(method = "drawChunkLayer", at = @At("RETURN")) + private void gtceu$drawBloomChunkLayer(RenderType renderLayer, PoseStack matrixStack, double x, double y, double z, + CallbackInfo ci, + @Local(name = "matrices") ChunkRenderMatrices matrices) { + if (!BloomShaderManager.isBloomActive()) return; + + if (renderLayer == GTRenderTypes.bloom()) { + this.renderSectionManager.renderLayer(matrices, GTEmbeddiumCompat.BLOOM_RENDER_PASS, x, y, z); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java index 3749386c64c..f994caa731f 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/oculus/WorldRenderingPhaseMixin.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.integration.iris.GTIrisHooks; import net.irisshaders.iris.pipeline.WorldRenderingPhase; import net.minecraft.client.renderer.RenderType; @@ -33,6 +32,7 @@ public class WorldRenderingPhaseMixin { static { // don't bother checking if bloom can be loaded here; Oculus 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. GTCEU$BLOOM = gtceu$callInit("GTCEU$BLOOM", $VALUES.length); $VALUES = ArrayUtils.add($VALUES, GTCEU$BLOOM); } @@ -43,7 +43,7 @@ public class WorldRenderingPhaseMixin { if (!BloomShaderManager.isBloomAvailable()) return; if (renderType == GTRenderTypes.bloom()) { - cir.setReturnValue(GTIrisHooks.getBloomRenderingPhase()); + cir.setReturnValue(GTCEU$BLOOM); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/iris/GTIrisHooks.java b/src/main/java/com/gregtechceu/gtceu/integration/iris/GTIrisHooks.java deleted file mode 100644 index 5d2ae4f8891..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/iris/GTIrisHooks.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gregtechceu.gtceu.integration.iris; - -import net.irisshaders.iris.pipeline.WorldRenderingPhase; - -import lombok.experimental.UtilityClass; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; - -import java.util.Objects; - -@UtilityClass -public class GTIrisHooks { - - /// Do not access directly, use {@link #getBloomRenderingPhase()} - @ApiStatus.Internal - public static @Nullable WorldRenderingPhase BLOOM_RENDERING_PHASE; - - public static WorldRenderingPhase getBloomRenderingPhase() { - return Objects.requireNonNull(BLOOM_RENDERING_PHASE, "BLOOM_PHASE == null"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java b/src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java deleted file mode 100644 index 7ddda1a021e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/integration/iris/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@NotNullByDefault -package com.gregtechceu.gtceu.integration.iris; - -import org.jetbrains.annotations.NotNullByDefault; From 52292253682744bd4aa0a175bf21026feef8a51d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 2 May 2026 23:41:29 +0300 Subject: [PATCH 244/269] Renames + interface injection --- injected_interfaces/interfaces.json | 5 +- ...GTQuadLighter.java => QuadLighterExt.java} | 2 +- ...exConsumer.java => VertexConsumerExt.java} | 2 +- .../mixins/client/VertexConsumerMixin.java | 4 +- .../normal/ForgeModelBlockRendererMixin.java | 6 +- .../client/bloom/normal/QuadLighterMixin.java | 4 +- .../client/bloom/normal/RenderTypeMixin.java | 1 + .../embeddium/BlockRendererMixin.java | 22 +++--- .../gtceu/utils/ContextualObjectHelper.java | 19 ----- .../gregtechceu/gtceu/utils/ScopedValue.java | 74 +++++++++++++++++++ 10 files changed, 98 insertions(+), 41 deletions(-) rename src/main/java/com/gregtechceu/gtceu/core/{IGTQuadLighter.java => QuadLighterExt.java} (81%) rename src/main/java/com/gregtechceu/gtceu/core/{IGTVertexConsumer.java => VertexConsumerExt.java} (94%) delete mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ContextualObjectHelper.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java diff --git a/injected_interfaces/interfaces.json b/injected_interfaces/interfaces.json index 36e97d0ced9..85627673489 100644 --- a/injected_interfaces/interfaces.json +++ b/injected_interfaces/interfaces.json @@ -3,7 +3,10 @@ "com/gregtechceu/gtceu/core/IGTBakedQuad" ], "com/mojang/blaze3d/vertex/VertexConsumer": [ - "com/gregtechceu/gtceu/core/IGTVertexConsumer" + "com/gregtechceu/gtceu/core/VertexConsumerExt" + ], + "net/minecraftforge/client/model/lighting/QuadLighter": [ + "com/gregtechceu/gtceu/core/QuadLighterExt" ], "net/minecraft/world/entity/Entity": [ "com/gregtechceu/gtceu/core/IFireImmuneEntity", diff --git a/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java b/src/main/java/com/gregtechceu/gtceu/core/QuadLighterExt.java similarity index 81% rename from src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java rename to src/main/java/com/gregtechceu/gtceu/core/QuadLighterExt.java index 4f0bb8b9308..04b4822ed52 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/IGTQuadLighter.java +++ b/src/main/java/com/gregtechceu/gtceu/core/QuadLighterExt.java @@ -2,7 +2,7 @@ import net.minecraft.client.renderer.RenderType; -public interface IGTQuadLighter { +public interface QuadLighterExt { void gtceu$setRenderType(RenderType currentRenderType); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java b/src/main/java/com/gregtechceu/gtceu/core/VertexConsumerExt.java similarity index 94% rename from src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java rename to src/main/java/com/gregtechceu/gtceu/core/VertexConsumerExt.java index cebf4140bb7..e2e59df6293 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/IGTVertexConsumer.java +++ b/src/main/java/com/gregtechceu/gtceu/core/VertexConsumerExt.java @@ -3,7 +3,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import org.joml.*; -public interface IGTVertexConsumer { +public interface VertexConsumerExt { private VertexConsumer self() { return (VertexConsumer) this; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java index 7ab1ff44abd..81ec312ed8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.core.IGTVertexConsumer; +import com.gregtechceu.gtceu.core.VertexConsumerExt; import com.mojang.blaze3d.vertex.VertexConsumer; import org.spongepowered.asm.mixin.Mixin; @Mixin(VertexConsumer.class) -public interface VertexConsumerMixin extends IGTVertexConsumer {} +public interface VertexConsumerMixin extends VertexConsumerExt {} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java index 5c575a01cca..a509ae13cc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; -import com.gregtechceu.gtceu.core.IGTQuadLighter; - import net.minecraft.client.renderer.RenderType; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; @@ -35,10 +33,10 @@ public class ForgeModelBlockRendererMixin { @Local(name = "flatLighter") QuadLighter flatLighter) { if (flatLighter != null) { // this is always in the flatLighter init block - ((IGTQuadLighter) flatLighter).gtceu$setRenderType(renderType); + flatLighter.gtceu$setRenderType(renderType); } else { // and this _should_ always be outside of it - ((IGTQuadLighter) lighter).gtceu$setRenderType(renderType); + lighter.gtceu$setRenderType(renderType); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 19986d69b47..032e06ca440 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.core.IGTQuadLighter; +import com.gregtechceu.gtceu.core.QuadLighterExt; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -20,7 +20,7 @@ @SuppressWarnings("SameReturnValue") @Mixin(value = QuadLighter.class, remap = false) -public class QuadLighterMixin implements IGTQuadLighter { +public class QuadLighterMixin implements QuadLighterExt { @Shadow private BlockPos pos; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java index c5c37fea0c6..369cd1304e6 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RenderTypeMixin.java @@ -20,6 +20,7 @@ public class RenderTypeMixin { private static ImmutableList gtceu$forceAddBloomToChunkBufferLayers(ImmutableList original) { // don't bother checking if bloom can be loaded here; Bloom can't be used 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. if (GTEarlyConfig.OPTIFINE_PRESENT) return original; return ImmutableList.builder() 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 2a57b8ed232..aaeffe5057b 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 @@ -36,11 +36,11 @@ public class BlockRendererMixin { @Inject(method = "writeGeometry", at = @At(value = "HEAD")) - private void gtceu$captureBloomQuads$initLocals(BlockRenderContext ctx, ChunkModelBuilder builder, - Vec3 offset, Material material, BakedQuadView quad, - int[] colors, QuadLightData light, - CallbackInfo ci, - @Share("bufferBuilder") LocalRef bufferBuilderRef) { + private void gtceu$copyBloomQuads$initLocals(BlockRenderContext ctx, ChunkModelBuilder builder, + Vec3 offset, Material material, BakedQuadView quad, + int[] colors, QuadLightData light, + CallbackInfo ci, + @Share("bufferBuilder") LocalRef bufferBuilderRef) { // Check if quad is full brightness OR we have bloom enabled for the quad if (!BloomShaderManager.isBloomActive() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { bufferBuilderRef.set(null); @@ -56,12 +56,12 @@ public class BlockRendererMixin { target = "Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;light:I", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER)) - private void gtceu$captureBloomQuads(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, - Material material, BakedQuadView quad, int[] colors, QuadLightData light, - CallbackInfo ci, - @Local(name = "srcIndex") int srcIndex, - @Local(name = "out") ChunkVertexEncoder.Vertex v, - @Share("bufferBuilder") LocalRef bufferBuilderRef) { + private void gtceu$copyBloomQuads(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, + Material material, BakedQuadView quad, int[] colors, QuadLightData light, + CallbackInfo ci, + @Local(name = "srcIndex") int srcIndex, + @Local(name = "out") ChunkVertexEncoder.Vertex v, + @Share("bufferBuilder") LocalRef bufferBuilderRef) { BufferBuilder bufferBuilder = bufferBuilderRef.get(); // bufferBuilder is null if bloom isn't available or the quad's texture doesn't have bloom if (bufferBuilder == null) return; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ContextualObjectHelper.java b/src/main/java/com/gregtechceu/gtceu/utils/ContextualObjectHelper.java deleted file mode 100644 index 6ff3e811f41..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/utils/ContextualObjectHelper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gregtechceu.gtceu.utils; - -import lombok.Getter; - -public class ContextualObjectHelper implements AutoCloseable { - - @Getter - private T current; - - public ContextualObjectHelper with(T object) { - this.current = object; - return this; - } - - @Override - public void close() { - this.current = null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java b/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java new file mode 100644 index 00000000000..75c84344a17 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java @@ -0,0 +1,74 @@ +package com.gregtechceu.gtceu.utils; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * "recreations" of Java 25 scoped values using {@link AutoCloseable AutoCloseables}. + */ +public abstract class ScopedValue implements AutoCloseable { + + /** + * Scoped object value. Resets to {@code null} when exiting scope. + * @param The type of the object. + */ + public static final class Object extends ScopedValue { + + /** + * Current value in this scope + */ + @Getter + private T current; + + /** + * Set {@code current} to {@code value} within this scope. + * @return this + */ + public Object with(T object) { + this.current = object; + return this; + } + + @Override + public void close() { + this.current = null; + } + } + + /** + * Scoped boolean value. Resets to {@link #initialValue} when exiting scope. + */ + @RequiredArgsConstructor + public static final class Boolean extends ScopedValue { + + private final boolean initialValue; + + /** + * Current value in this scope + */ + @Getter + private boolean active; + + /** + * Set {@code current} to {@code value} within this scope. + * @return this + */ + public Boolean with(boolean value) { + this.active = value; + return this; + } + + /** + * Shortcut method that sets {@code current} to {@code !initial} + * @return this + */ + public Boolean active() { + return with(!this.initialValue); + } + + @Override + public void close() { + this.active = this.initialValue; + } + } +} From ff25e1694d2b7f64920e96b03674d93b05420840 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 14:42:21 +0300 Subject: [PATCH 245/269] Move (most) extension interfaces to core/util/extensions --- injected_interfaces/interfaces.json | 6 +++--- .../gregtechceu/gtceu/core/MixinHelpers.java | 6 ------ .../gregtechceu/gtceu/core/PostPassExt.java | 10 ---------- .../gregtechceu/gtceu/core/QuadLighterExt.java | 8 -------- .../core/mixins/client/BakedQuadMixin.java | 4 ++-- .../mixins/client/VertexConsumerMixin.java | 2 +- .../mixins/client/bloom/PostChainMixin.java | 2 +- .../mixins/client/bloom/PostPassMixin.java | 2 +- .../client/bloom/normal/QuadLighterMixin.java | 2 +- .../extensions/BakedQuadExt.java} | 8 ++++---- .../core/util/extensions/ExtensionHelpers.java | 14 ++++++++++++++ .../core/util/extensions/PostPassExt.java | 18 ++++++++++++++++++ .../core/util/extensions/QuadLighterExt.java | 10 ++++++++++ .../core/util/extensions/RenderTargetExt.java | 12 ++++++++++++ .../extensions}/VertexConsumerExt.java | 7 ++++--- 15 files changed, 71 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/QuadLighterExt.java rename src/main/java/com/gregtechceu/gtceu/core/{IGTBakedQuad.java => util/extensions/BakedQuadExt.java} (61%) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/ExtensionHelpers.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/QuadLighterExt.java create mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java rename src/main/java/com/gregtechceu/gtceu/core/{ => util/extensions}/VertexConsumerExt.java (66%) diff --git a/injected_interfaces/interfaces.json b/injected_interfaces/interfaces.json index 85627673489..01ee4dec99d 100644 --- a/injected_interfaces/interfaces.json +++ b/injected_interfaces/interfaces.json @@ -1,12 +1,12 @@ { "net/minecraft/client/renderer/block/model/BakedQuad": [ - "com/gregtechceu/gtceu/core/IGTBakedQuad" + "com/gregtechceu/gtceu/core/util/extensions/BakedQuadExt" ], "com/mojang/blaze3d/vertex/VertexConsumer": [ - "com/gregtechceu/gtceu/core/VertexConsumerExt" + "com/gregtechceu/gtceu/core/util/extensions/VertexConsumerExt" ], "net/minecraftforge/client/model/lighting/QuadLighter": [ - "com/gregtechceu/gtceu/core/QuadLighterExt" + "com/gregtechceu/gtceu/core/util/extensions/QuadLighterExt" ], "net/minecraft/world/entity/Entity": [ "com/gregtechceu/gtceu/core/IFireImmuneEntity", diff --git a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java index 7d2482749d5..26da2a0bc53 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/core/MixinHelpers.java @@ -52,8 +52,6 @@ import net.minecraftforge.versions.forge.ForgeVersion; import com.tterrag.registrate.util.entry.BlockEntry; -import org.jetbrains.annotations.ApiStatus; -import org.joml.Vector3f; import java.util.ArrayList; import java.util.List; @@ -366,8 +364,4 @@ public static void addFluidTexture(Material material, FluidStorage.FluidEntry va } } } - - // package-private so only things in this package can use it - @ApiStatus.Internal - static final ThreadLocal scratch = ThreadLocal.withInitial(Vector3f::new); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java b/src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java deleted file mode 100644 index 26947c3a47a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/PostPassExt.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gregtechceu.gtceu.core; - -import com.mojang.blaze3d.pipeline.RenderTarget; - -import java.util.function.IntSupplier; - -public interface PostPassExt { - - default void gtceu$copyDepthFrom(RenderTarget source) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/QuadLighterExt.java b/src/main/java/com/gregtechceu/gtceu/core/QuadLighterExt.java deleted file mode 100644 index 04b4822ed52..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/QuadLighterExt.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gregtechceu.gtceu.core; - -import net.minecraft.client.renderer.RenderType; - -public interface QuadLighterExt { - - void gtceu$setRenderType(RenderType currentRenderType); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java index 653d001dd70..9b137439356 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/BakedQuadMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.core.IGTBakedQuad; +import com.gregtechceu.gtceu.core.util.extensions.BakedQuadExt; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -10,7 +10,7 @@ import java.util.Arrays; @Mixin(BakedQuad.class) -public class BakedQuadMixin implements IGTBakedQuad { +public class BakedQuadMixin implements BakedQuadExt { @Unique private String gtceu$textureKey = null; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java index 81ec312ed8e..d89a7c203ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/VertexConsumerMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client; -import com.gregtechceu.gtceu.core.VertexConsumerExt; +import com.gregtechceu.gtceu.core.util.extensions.VertexConsumerExt; import com.mojang.blaze3d.vertex.VertexConsumer; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java index 458f631b433..edc6eb18c65 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.core.PostPassExt; +import com.gregtechceu.gtceu.core.util.extensions.PostPassExt; import net.minecraft.client.renderer.PostChain; import net.minecraft.client.renderer.PostPass; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java index 8dfe2dc28b1..80d7ae3327c 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom; -import com.gregtechceu.gtceu.core.PostPassExt; +import com.gregtechceu.gtceu.core.util.extensions.PostPassExt; import net.minecraft.client.renderer.PostPass; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index 032e06ca440..ab6facaf0db 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.core.QuadLighterExt; +import com.gregtechceu.gtceu.core.util.extensions.QuadLighterExt; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/core/IGTBakedQuad.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/BakedQuadExt.java similarity index 61% rename from src/main/java/com/gregtechceu/gtceu/core/IGTBakedQuad.java rename to src/main/java/com/gregtechceu/gtceu/core/util/extensions/BakedQuadExt.java index 8cb853a080a..2e0db8ca1be 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/IGTBakedQuad.java +++ b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/BakedQuadExt.java @@ -1,18 +1,18 @@ -package com.gregtechceu.gtceu.core; +package com.gregtechceu.gtceu.core.util.extensions; import net.minecraft.client.renderer.block.model.BakedQuad; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -public interface IGTBakedQuad { +public interface BakedQuadExt { @ApiStatus.Internal default BakedQuad gtceu$setTextureKey(@Nullable String key) { - return (BakedQuad) this; + throw new AssertionError("Mixin didn't apply"); } default @Nullable String gtceu$getTextureKey() { - return null; + throw new AssertionError("Mixin didn't apply"); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/ExtensionHelpers.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/ExtensionHelpers.java new file mode 100644 index 00000000000..92a9fad317a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/ExtensionHelpers.java @@ -0,0 +1,14 @@ +package com.gregtechceu.gtceu.core.util.extensions; + +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.ApiStatus; +import org.joml.Vector3f; + +// package-private so only things in this package can use it +@UtilityClass +class ExtensionHelpers { + + /// Avoid allocations in hot code by using thread-local temporary vectors in {@link VertexConsumerExt} + @ApiStatus.Internal + static final ThreadLocal scratch = ThreadLocal.withInitial(Vector3f::new); +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java new file mode 100644 index 00000000000..31ee02a9b84 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java @@ -0,0 +1,18 @@ +package com.gregtechceu.gtceu.core.util.extensions; + +import com.mojang.blaze3d.pipeline.RenderTarget; + +public interface PostPassExt { + + default void gtceu$setDepthCopySource(RenderTarget source) { + throw new AssertionError("Mixin didn't apply"); + } + + default void gtceu$setClearBeforeDraw(boolean clearBeforeDraw) { + throw new AssertionError("Mixin didn't apply"); + } + + default void gtceu$setWriteDepth(boolean writeDepth) { + throw new AssertionError("Mixin didn't apply"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/QuadLighterExt.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/QuadLighterExt.java new file mode 100644 index 00000000000..e97dbe19cbc --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/QuadLighterExt.java @@ -0,0 +1,10 @@ +package com.gregtechceu.gtceu.core.util.extensions; + +import net.minecraft.client.renderer.RenderType; + +public interface QuadLighterExt { + + default void gtceu$setRenderType(RenderType currentRenderType) { + throw new AssertionError("Mixin didn't apply"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java new file mode 100644 index 00000000000..2a058f47261 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java @@ -0,0 +1,12 @@ +package com.gregtechceu.gtceu.core.util.extensions; + +public interface RenderTargetExt { + + default void gtceu$setShouldClearDepth(boolean shouldClearDepth) { + throw new AssertionError("Mixin didn't apply"); + } + + default void gtceu$changeShouldClearDepth() { + throw new AssertionError("Mixin didn't apply"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/core/VertexConsumerExt.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/VertexConsumerExt.java similarity index 66% rename from src/main/java/com/gregtechceu/gtceu/core/VertexConsumerExt.java rename to src/main/java/com/gregtechceu/gtceu/core/util/extensions/VertexConsumerExt.java index e2e59df6293..3d64d602e86 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/VertexConsumerExt.java +++ b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/VertexConsumerExt.java @@ -1,8 +1,9 @@ -package com.gregtechceu.gtceu.core; +package com.gregtechceu.gtceu.core.util.extensions; import com.mojang.blaze3d.vertex.VertexConsumer; import org.joml.*; +@SuppressWarnings("unused") public interface VertexConsumerExt { private VertexConsumer self() { @@ -10,12 +11,12 @@ private VertexConsumer self() { } default VertexConsumer gtceu$vertex(Matrix4f poseMatrix, Vector3fc pos) { - pos = poseMatrix.transformPosition(pos, MixinHelpers.scratch.get()); + pos = poseMatrix.transformPosition(pos, ExtensionHelpers.scratch.get()); return self().vertex(pos.x(), pos.y(), pos.z()); } default VertexConsumer gtceu$normal(Matrix3f normalMatrix, Vector3fc normal) { - normal = normalMatrix.transform(normal, MixinHelpers.scratch.get()); + normal = normalMatrix.transform(normal, ExtensionHelpers.scratch.get()); return self().normal(normal.x(), normal.y(), normal.z()); } } From 1a44891b140acb9c027a97fa6cd126fdf8054d96 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 17:01:46 +0300 Subject: [PATCH 246/269] Remove unused samplers from filter_bloom_color --- .../resources/assets/gtceu/shaders/post/bloom_unity.json | 1 - .../resources/assets/gtceu/shaders/post/bloom_unreal.json | 4 +--- .../assets/gtceu/shaders/program/filter_bloom_color.fsh | 7 ------- .../assets/gtceu/shaders/program/filter_bloom_color.json | 1 - 4 files changed, 1 insertion(+), 12 deletions(-) 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 75ff8e6fc97..ca8965ea8ad 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -14,7 +14,6 @@ "outtarget": "filter", "auxtargets": [ { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, 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 96318bd7ed6..62491561c77 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -15,9 +15,7 @@ "outtarget": "filter", "auxtargets": [ { "id": "final:depth", "name": "DiffuseDepthSampler" }, - { "id": "minecraft:main", "name": "MainSampler" }, - { "id": "minecraft:main:depth", "name": "MainDepthSampler" }, - { "id": "minecraft:main:depth", "name": "DepthSampler" } + { "id": "minecraft:main:depth", "name": "MainDepthSampler" } ] }, { 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 16d3f714e5c..0188355d321 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 @@ -2,7 +2,6 @@ uniform sampler2D DiffuseSampler; uniform sampler2D DiffuseDepthSampler; -uniform sampler2D MainSampler; uniform sampler2D MainDepthSampler; uniform bool EnableFilter; @@ -23,8 +22,6 @@ float linearizeDepth(float depth) { void main() { fragColor = texture(DiffuseSampler, texCoord); if (EnableFilter) { - vec4 mainColor = texture(MainSampler, texCoord); - // calculate linear depth float mainDepth = linearizeDepth(texture(MainDepthSampler, texCoord).r); float diffuseDepth = linearizeDepth(texture(DiffuseDepthSampler, texCoord).r); @@ -32,9 +29,5 @@ void main() { if (abs(mainDepth - diffuseDepth) > 0.01) { fragColor = vec4(0.0); } - // also clear it if the main sampler's color is off by too much -// else if (distance((mainColor.rgb * fragColor.a), fragColor.rgb) > 0.05) { -// fragColor = vec4(0.0); -// } } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index b2ac4345a46..f1a706a8df4 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -10,7 +10,6 @@ "samplers": [ { "name": "DiffuseSampler" }, { "name": "DiffuseDepthSampler" }, - { "name": "MainSampler" }, { "name": "MainDepthSampler" } ], "uniforms": [ From d78666331d4304ba05fa4c3a34777d7834c42904 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 17:03:55 +0300 Subject: [PATCH 247/269] Re-enable separate blend mode --- src/main/resources/assets/gtceu/shaders/program/blur.fsh | 6 ++---- src/main/resources/assets/gtceu/shaders/program/blur.json | 4 +++- .../assets/gtceu/shaders/program/down_sampling.json | 4 +++- .../assets/gtceu/shaders/program/filter_bloom_color.json | 6 ++++-- .../assets/gtceu/shaders/program/unity_composite.json | 4 +++- .../assets/gtceu/shaders/program/unreal_composite.json | 4 +++- .../resources/assets/gtceu/shaders/program/up_sampling.json | 6 ++++-- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.fsh b/src/main/resources/assets/gtceu/shaders/program/blur.fsh index c83ee396225..6ab6c8ae16e 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/blur.fsh @@ -24,13 +24,11 @@ float gaussianPdf(float x, float sigma) { void main() { vec2 invSize = 1.0 / OutSize; - float weightSum = gaussianPdf(0.0, Radius); + float weightSum = gaussianPdf(0.0, Radius); vec4 diffuseSum = texture(DiffuseSampler, texCoord) * weightSum; - float iRadius = int(Radius); - for(int i = 1; i < iRadius; i++) { - float x = float(i); + for(float x = 1; x < Radius; x += 1.0) { float w = gaussianPdf(x, Radius); vec2 uvOffset = BlurDir * invSize * x; diff --git a/src/main/resources/assets/gtceu/shaders/program/blur.json b/src/main/resources/assets/gtceu/shaders/program/blur.json index 79361fb9ca0..8a1ed353426 100644 --- a/src/main/resources/assets/gtceu/shaders/program/blur.json +++ b/src/main/resources/assets/gtceu/shaders/program/blur.json @@ -2,7 +2,9 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:blur", diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json index df122db23d6..244807fae30 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.json @@ -2,7 +2,9 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:down_sampling", diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index f1a706a8df4..98a94f0be81 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -2,7 +2,9 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:filter_bloom_color", @@ -15,7 +17,7 @@ "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": "EnableFilter", "type": "int", "count": 1, "values": [ 0 ] }, + { "name": "EnableFilter", "type": "int", "count": 1, "values": [ 1 ] }, { "name": "DepthNear", "type": "float", "count": 1, "values": [ 0.05 ] }, { "name": "DepthFar", "type": "float", "count": 1, "values": [ 512.0 ] } ] diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json index 5b31a23674b..411ff0180fa 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.json @@ -2,7 +2,9 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:unity_composite", diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json index 5b6c181ee2c..011e688ca50 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.json @@ -2,7 +2,9 @@ "blend": { "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "blit", "fragment": "gtceu:unreal_composite", diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json index 6087bbbf925..c1556b68b9e 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -1,8 +1,10 @@ { "blend": { - "func": "add",s + "func": "add", "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" + "dstrgb": "1-srcalpha", + "srcalpha": "zero", + "dstalpha": "one" }, "vertex": "gtceu:blit_copy_depth", "fragment": "gtceu:up_sampling", From 5a5da50af045355c202a37c8c796e32d1734bbe6 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 17:05:41 +0300 Subject: [PATCH 248/269] More averaging (IDK yet if good) --- .../gtceu/shaders/program/down_sampling.fsh | 90 +++++++++++-------- .../gtceu/shaders/program/up_sampling.fsh | 41 ++++++--- 2 files changed, 81 insertions(+), 50 deletions(-) diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh index 88c0f6d77a8..fb54613cac8 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh @@ -1,7 +1,5 @@ #version 150 -#define OUTPUT_SCALE_FACTOR (0.25 * 0.25 * 0.125) - uniform sampler2D DiffuseSampler; uniform vec2 OutSize; uniform vec2 InSize; @@ -10,50 +8,70 @@ in vec2 texCoord; out vec4 fragColor; +#define OUTPUT_SCALE_FACTOR (0.25 * 0.25 * 0.125) + vec2 inTexel = 1.0 / InSize; -vec2 inTexelNegX = vec2(-inTexel.x, inTexel.y); -vec2 inTexelNegY = vec2(inTexel.x, -inTexel.y); +vec2 inTexelInv = vec2(-inTexel.x, inTexel.y); vec2 outTexel = 1.0 / OutSize; vec2 outTexelX = vec2(outTexel.x, 0.0); vec2 outTexelY = vec2(0.0, outTexel.y); -vec2 outTexelNegX = vec2(-outTexel.x, outTexel.y); -vec2 outTexelNegY = vec2(outTexel.x, -outTexel.y); +vec2 outTexelInv = vec2(-outTexel.x, outTexel.y); + +vec4 average(vec4 center, vec4 left, vec4 right, vec4 up, vec4 down, bool accountCenterColor) { + float totalAlpha = abs(center.a - left.a) + abs(center.a - right.a) + abs(center.a - up.a) + abs(center.a - down.a); + totalAlpha = clamp(totalAlpha, 0.0, 1.0); + vec3 totalColor = (left.rgb * left.a) + + (right.rgb * right.a) + + (up.rgb * up.a) + + (down.rgb * down.a) + + (center.rgb * center.a * accountCenterColor); + + return vec4(totalColor, totalAlpha); +} vec4 four_k(vec2 uv) { - return texture(DiffuseSampler, uv + inTexel) // 1 1 - + texture(DiffuseSampler, uv + inTexelNegX) // -1 1 - + texture(DiffuseSampler, uv + inTexelNegY) // 1 -1 - + texture(DiffuseSampler, uv - inTexel); // -1 -1 + vec4 center = texture(DiffuseSampler, uv); // 1 1 + vec4 tl = texture(DiffuseSampler, uv + inTexel); // 1 1 + vec4 tr = texture(DiffuseSampler, uv + inTexelInv); // -1 1 + vec4 bl = texture(DiffuseSampler, uv - inTexel); // -1 -1 + vec4 br = texture(DiffuseSampler, uv - inTexelInv); // 1 -1 + + return average(center, tl, tr, bl, br, false); } +// I really hope GPU drivers are smart enough to optimize most of the repeated lookups away +// - screret + void main() { - fragColor = four_k(texCoord - outTexel) // -1 -1 - + four_k(texCoord - outTexelX) // -1 0 - + four_k(texCoord - outTexelY) // 0 -1 - + four_k(texCoord); // 0 0 - - fragColor += four_k(texCoord + outTexelNegY) // 1 -1 - + four_k(texCoord - outTexelY) // 0 -1 - + four_k(texCoord + outTexelX) // 1 0 - + four_k(texCoord); // 0 0 - - fragColor += four_k(texCoord + outTexelNegX) // -1 1 - + four_k(texCoord - outTexelX) // -1 0 - + four_k(texCoord + outTexelY) // 0 1 - + four_k(texCoord); // 0 0 - - fragColor += four_k(texCoord + outTexel) // 1 1 - + four_k(texCoord + outTexelX) // 1 0 - + four_k(texCoord + outTexelY) // 0 1 - + four_k(texCoord); // 0 0 - - fragColor += four_k(texCoord + outTexel) // 1 1 - + four_k(texCoord + outTexelNegX) // -1 1 - + four_k(texCoord + outTexelNegY) // 1 -1 - + four_k(texCoord - outTexel); // -1 -1 + vec4 center = four_k(texCoord + outTexel) // 1 1 + + four_k(texCoord + outTexelInv) // -1 1 + + four_k(texCoord - outTexelInv) // 1 -1 + + four_k(texCoord - outTexel); // -1 -1 + + vec4 tl = four_k(texCoord + outTexelInv) // -1 1 + + four_k(texCoord - outTexelX) // -1 0 + + four_k(texCoord + outTexelY) // 0 1 + + four_k(texCoord); // 0 0 + + vec4 tr = four_k(texCoord + outTexel) // 1 1 + + four_k(texCoord + outTexelX) // 1 0 + + four_k(texCoord + outTexelY) // 0 1 + + four_k(texCoord); // 0 0 + + vec4 bl = four_k(texCoord - outTexel) // -1 -1 + + four_k(texCoord - outTexelX) // -1 0 + + four_k(texCoord - outTexelY) // 0 -1 + + four_k(texCoord); // 0 0 + + vec4 br = four_k(texCoord - outTexelInv) // 1 -1 + + four_k(texCoord - outTexelY) // 0 -1 + + four_k(texCoord + outTexelX) // 1 0 + + four_k(texCoord); // 0 0 + + fragColor = average(center, tl, tr, bl, br, true); // Optimization: do multiplication in one step at the end - // They used to be done separately on each addition to fragColor (and in four_k) - fragColor *= OUTPUT_SCALE_FACTOR; + // They used to be done separately on each addition to fragColor and in four_k +// fragColor.rgb *= OUTPUT_SCALE_FACTOR; } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh index 4254a8ece2a..6dbba0e2b47 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh @@ -11,23 +11,36 @@ out vec4 fragColor; vec2 outTexel = 1.0 / OutSize; vec2 outTexelX = vec2(outTexel.x, 0.0); vec2 outTexelY = vec2(0.0, outTexel.y); -vec2 outTexelNegX = vec2(-outTexel.x, outTexel.y); -vec2 outTexelNegY = vec2(outTexel.x, -outTexel.y); +vec2 outTexelInv = vec2(-outTexel.x, outTexel.y); + +vec4 average(vec4 center, vec4 left, vec4 right, vec4 up, vec4 down, bool accountCenterColor) { + float totalAlpha = abs(center.a - left.a) + abs(center.a - right.a) + abs(center.a - up.a) + abs(center.a - down.a); + vec3 totalColor = (left.rgb * left.a) + + (right.rgb * right.a) + + (up.rgb * up.a) + + (down.rgb * down.a) + + (center.rgb * center.a * accountCenterColor); + + return vec4(totalColor, totalAlpha); +} void main() { - vec4 out_color = texture(DiffuseSampler, texCoord) * 4.0; // 0 0 + vec4 center = texture(DiffuseSampler, texCoord) * 4.0; // 0 0 + + vec4 tr = texture(DiffuseSampler, texCoord + outTexel); // 1 1 + vec4 tl = texture(DiffuseSampler, texCoord - outTexelInv); // 1 -1 + vec4 br = texture(DiffuseSampler, texCoord + outTexelInv); // -1 1 + vec4 bl = texture(DiffuseSampler, texCoord - outTexel); // -1 -1 + + vec4 right = texture(DiffuseSampler, texCoord + outTexelX) * 2.0; // 1 0 + vec4 left = texture(DiffuseSampler, texCoord - outTexelX) * 2.0; // -1 0 + vec4 up = texture(DiffuseSampler, texCoord + outTexelY) * 2.0; // 0 1 + vec4 down = texture(DiffuseSampler, texCoord - outTexelY) * 2.0; // 0 -1 - out_color += texture(DiffuseSampler, texCoord + outTexel); // 1 1 - out_color += texture(DiffuseSampler, texCoord + outTexelNegX); // -1 1 - out_color += texture(DiffuseSampler, texCoord + outTexelNegY); // 1 -1 - out_color += texture(DiffuseSampler, texCoord - outTexel); // -1 -1 + vec4 colorSum = average(center, left, right, up, down, true); + colorSum += average(center, tl, tr, bl, br, false); - out_color += texture(DiffuseSampler, texCoord + outTexelX) * 2.0; // 1 0 - out_color += texture(DiffuseSampler, texCoord - outTexelX) * 2.0; // -1 0 - out_color += texture(DiffuseSampler, texCoord + outTexelY) * 2.0; // 0 1 - out_color += texture(DiffuseSampler, texCoord - outTexelY) * 2.0; // 0 -1 + colorSum = (colorSum / 16.0 + texture(DownTexture, texCoord)) * 0.8; - vec4 total = out_color * 0.8 / 16.0 + texture(DownTexture, texCoord) * 0.8; - total = clamp(total, 0.0, 1.0); - fragColor = total; + fragColor = clamp(colorSum, 0.0, 1.0); } From f621956087908977f8f20346eef48fd2aad04036 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 17:07:21 +0300 Subject: [PATCH 249/269] Considerably more precise fragment filtering --- .../assets/gtceu/shaders/program/filter_bloom_color.fsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0188355d321..c6ac93cce8f 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 @@ -26,7 +26,7 @@ void main() { 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) > 0.01) { + if (abs(mainDepth - diffuseDepth) > 1.0e-5) { fragColor = vec4(0.0); } } From f72271ccb420303dfd1e8f773e81f7ce410bd640 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 17:11:42 +0300 Subject: [PATCH 250/269] instead of copying the depth buffer, draw with blending enabled and depth writing disabled --- .../gtceu/client/bloom/BloomUtil.java | 30 ++++++++-- .../mixins/client/bloom/PostChainMixin.java | 55 ------------------- .../mixins/client/bloom/PostPassMixin.java | 45 --------------- .../core/util/extensions/PostPassExt.java | 18 ------ .../core/util/extensions/RenderTargetExt.java | 12 ---- .../gtceu/shaders/post/bloom_unity.json | 11 +--- .../gtceu/shaders/post/bloom_unreal.json | 11 +--- .../gtceu/shaders/program/unity_composite.fsh | 7 +-- .../shaders/program/unreal_composite.fsh | 12 +--- src/main/resources/gtceu.mixins.json | 2 - 10 files changed, 30 insertions(+), 173 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index eb0ca436eae..587377c3570 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -27,6 +27,10 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.RenderLevelStageEvent; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; +import com.mojang.blaze3d.platform.GlStateManager.DestFactor; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; @@ -37,12 +41,15 @@ import org.jetbrains.annotations.UnknownNullability; import org.joml.Matrix4f; import org.joml.Matrix4fc; +import org.lwjgl.opengl.GL11; import java.util.*; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.*; +import static com.gregtechceu.gtceu.client.bloom.BloomShaderManager.BLOOM_TARGET; + @UtilityClass public class BloomUtil { @@ -198,9 +205,7 @@ public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frust BloomSafeMode.drawBlockBloom(camera, poseStack, frustum, projectionMatrix, levelRenderer, profilerFiller); } - BloomUtil.setFilterToggleUniform(true); BloomUtil.processPostEffect(partialTicks, profilerFiller); - BloomUtil.setFilterToggleUniform(false); // clear state. again. GTRenderTypes.bloom().clearRenderState(); @@ -235,13 +240,26 @@ private static void renderSpecialBloom(Camera camera, PoseStack poseStack, Frust } public static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) { - profilerFiller.push("processPostEffect"); + Minecraft minecraft = Minecraft.getInstance(); + RenderTarget mainTarget = minecraft.getMainRenderTarget(); - // render state is set up & cleared in calling function + profilerFiller.push("processPostEffect"); + BloomUtil.setFilterToggleUniform(true); BloomShaderManager.BLOOM_CHAIN.process(partialTicks); - Minecraft.getInstance().getMainRenderTarget().bindWrite(false); - VertexBuffer.unbind(); + BloomUtil.setFilterToggleUniform(false); + + mainTarget.bindWrite(false); + + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, + SourceFactor.ZERO, DestFactor.ONE); + + BLOOM_TARGET.blitToScreen(mainTarget.viewWidth, mainTarget.viewHeight, false); + BLOOM_TARGET.unbindRead(); + + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); profilerFiller.pop(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java deleted file mode 100644 index edc6eb18c65..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostChainMixin.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.core.util.extensions.PostPassExt; - -import net.minecraft.client.renderer.PostChain; -import net.minecraft.client.renderer.PostPass; -import net.minecraft.util.GsonHelper; - -import com.google.gson.JsonObject; -import com.llamalad7.mixinextras.expression.Definition; -import com.llamalad7.mixinextras.expression.Expression; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.pipeline.RenderTarget; -import org.lwjgl.opengl.GL11; -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; - -@Mixin(PostChain.class) -public abstract class PostChainMixin { - - @Shadow - protected abstract RenderTarget getRenderTarget(String target); - - @Definition(id = "addTempTarget", - method = "Lnet/minecraft/client/renderer/PostChain;addTempTarget(Ljava/lang/String;II)V") - @Definition(id = "name", local = @Local(type = String.class)) // targeting locals is brittle, so minimize them - @Expression("this.addTempTarget(name, ?, ?)") - @Inject(method = "parseTargetNode", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER)) - private void gtceu$makeTargetLinear(CallbackInfo ci, @Local JsonObject json, @Local String name) { - if (GsonHelper.getAsBoolean(json, "bilinear", false)) { - this.getRenderTarget(name).setFilterMode(GL11.GL_LINEAR); - } - } - - @ModifyExpressionValue(method = "parsePassNode", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/PostChain;addPass(Ljava/lang/String;Lcom/mojang/blaze3d/pipeline/RenderTarget;Lcom/mojang/blaze3d/pipeline/RenderTarget;)Lnet/minecraft/client/renderer/PostPass;")) - private PostPass gtceu$setPassClearOutputValue(PostPass pass, @Local JsonObject json) { - String copyDepthFrom = GsonHelper.getAsString(json, "copy_depth_from", null); - if (copyDepthFrom != null) { - RenderTarget source = this.getRenderTarget(copyDepthFrom); - if (source != null) { - ((PostPassExt) pass).gtceu$copyDepthFrom(source); - } else { - GTCEu.LOGGER.error("Cannot copy depth from invalid render target {}", copyDepthFrom); - } - } - return pass; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java deleted file mode 100644 index 80d7ae3327c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/PostPassMixin.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom; - -import com.gregtechceu.gtceu.core.util.extensions.PostPassExt; - -import net.minecraft.client.renderer.PostPass; - -import com.llamalad7.mixinextras.expression.Definition; -import com.llamalad7.mixinextras.expression.Expression; -import com.mojang.blaze3d.pipeline.RenderTarget; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.function.IntSupplier; - -@Mixin(PostPass.class) -public class PostPassMixin implements PostPassExt { - - @Shadow - @Final - public RenderTarget outTarget; - - @Unique - private @Nullable RenderTarget gtceu$copyDepthFrom = null; - - @Definition(id = "outTarget", field = "Lnet/minecraft/client/renderer/PostPass;outTarget:Lcom/mojang/blaze3d/pipeline/RenderTarget;") - @Definition(id = "unbindWrite", method = "Lcom/mojang/blaze3d/pipeline/RenderTarget;unbindWrite()V") - @Expression("this.outTarget.unbindWrite()") - @Inject(method = "process", at = @At(value = "MIXINEXTRAS:EXPRESSION")) - private void gtceu$copyInputDepthToOutput(float partialTicks, CallbackInfo ci) { - if (gtceu$copyDepthFrom != null) { - this.outTarget.copyDepthFrom(gtceu$copyDepthFrom); - } - } - - @Override - public void gtceu$copyDepthFrom(RenderTarget source) { - this.gtceu$copyDepthFrom = source; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java deleted file mode 100644 index 31ee02a9b84..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/PostPassExt.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gregtechceu.gtceu.core.util.extensions; - -import com.mojang.blaze3d.pipeline.RenderTarget; - -public interface PostPassExt { - - default void gtceu$setDepthCopySource(RenderTarget source) { - throw new AssertionError("Mixin didn't apply"); - } - - default void gtceu$setClearBeforeDraw(boolean clearBeforeDraw) { - throw new AssertionError("Mixin didn't apply"); - } - - default void gtceu$setWriteDepth(boolean writeDepth) { - throw new AssertionError("Mixin didn't apply"); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java b/src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java deleted file mode 100644 index 2a058f47261..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/util/extensions/RenderTargetExt.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.core.util.extensions; - -public interface RenderTargetExt { - - default void gtceu$setShouldClearDepth(boolean shouldClearDepth) { - throw new AssertionError("Mixin didn't apply"); - } - - default void gtceu$changeShouldClearDepth() { - throw new AssertionError("Mixin didn't apply"); - } -} 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 ca8965ea8ad..1120226e8f3 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unity.json @@ -68,16 +68,7 @@ "auxtargets": [ { "id": "filter", "name": "HighlightSampler" }, { "id": "minecraft:main", "name": "MainSampler" } - ], - - "copy_depth_from": "minecraft:main" - }, - { - "name": "blit", - "intarget": "final", - "outtarget": "minecraft:main", - - "copy_depth_from": "final" + ] } ] } 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 62491561c77..b383aad0e33 100644 --- a/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json +++ b/src/main/resources/assets/gtceu/shaders/post/bloom_unreal.json @@ -151,16 +151,7 @@ ], "uniforms": [ { "name": "BloomRadius", "values": [1.0] } - ], - - "copy_depth_from": "minecraft:main" - }, - { - "name": "blit", - "intarget": "final", - "outtarget": "minecraft:main", - - "copy_depth_from": "final" + ] } ] } diff --git a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh index 06775a3e668..93c5c8d2a18 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unity_composite.fsh @@ -13,10 +13,6 @@ out vec4 fragColor; void main() { vec4 bloom = BloomStrength * texture(DiffuseSampler, texCoord); -// if (bloom.a < 0.1) { -// fragColor = vec4(0.0); -// return; -// } vec4 highlight = texture(HighlightSampler, texCoord); vec4 background = texture(MainSampler, texCoord); @@ -26,6 +22,5 @@ void main() { float max = max(background.r, max(background.g, background.b)); float backgroundBrightness = (max + min) / 2.0; - // fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); - fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), background.a); + fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), bloom.a); } diff --git a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh index d25e7bc0562..be8b8279839 100644 --- a/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/unreal_composite.fsh @@ -39,8 +39,7 @@ vec3 jodieReinhard2Tonemap(const vec3 color) { float channelMax = max(max(max(mappedColor.r, mappedColor.g), mappedColor.b), 1.0); - // this is just the simplified/optimised math - // of the more human readable version below + // this is just the simplified/optimised math of the more human readable version linked above return ( (mappedLuma * mappedColor - mappedColor) - (channelMax * mappedLuma - mappedLuma) @@ -53,20 +52,15 @@ void main() { lerpBloomFactor(0.8) * texture(BlurTexture2, texCoord) + lerpBloomFactor(0.6) * texture(BlurTexture3, texCoord) + lerpBloomFactor(0.4) * texture(BlurTexture4, texCoord)); -// if (bloom.a < 0.1) { -// fragColor = vec4(0.0); -// return; -// } bloom.rgb = jodieReinhardTonemap(bloom.rgb); vec4 background = texture(DiffuseSampler, texCoord); vec4 highlight = texture(HighlightSampler, texCoord); - background.rgb = background.rgb * (1 - highlight.a) + highlight.a * highlight.rgb; + background.rgb = background.rgb * (1 - highlight.a) + highlight.rgb * highlight.a; float min = min(background.r, min(background.g, background.b)); float max = max(background.r, max(background.g, background.b)); float backgroundBrightness = (max + min) / 2.0; - // fragColor = bloom * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)); - fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), background.a); + fragColor = vec4(background.rgb + bloom.rgb * (MinBrightness + BaseBrightness + (1.0 - backgroundBrightness) * (MaxBrightness - MinBrightness)), bloom.a); } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index d1a42adac73..a1c6ab841e9 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -31,8 +31,6 @@ "client.bloom.GameRendererAccessor", "client.bloom.LevelRendererMixin", "client.bloom.PostChainAccessor", - "client.bloom.PostChainMixin", - "client.bloom.PostPassMixin", "client.bloom.normal.ForgeModelBlockRendererMixin", "client.bloom.normal.LevelRendererAccessor", "client.bloom.normal.ModelBlockRendererMixin", From 80c90b1e8bb237f51a8e69398c2fb29291c4a97c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 17:20:59 +0300 Subject: [PATCH 251/269] always filter fragments the shader isn't ever processed without that enabled so changing it doesn't actually do anything except slow down rendering --- .../gtceu/client/bloom/BloomUtil.java | 10 ---------- .../shaders/program/filter_bloom_color.fsh | 20 +++++++++---------- .../shaders/program/filter_bloom_color.json | 1 - 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 587377c3570..0ea81f98b89 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -245,9 +245,7 @@ public static void processPostEffect(float partialTicks, ProfilerFiller profiler profilerFiller.push("processPostEffect"); - BloomUtil.setFilterToggleUniform(true); BloomShaderManager.BLOOM_CHAIN.process(partialTicks); - BloomUtil.setFilterToggleUniform(false); mainTarget.bindWrite(false); @@ -311,14 +309,6 @@ public static void setupBloomShaderUniforms() { }); } - public static void setFilterToggleUniform(final boolean fragmentFilterEnabled) { - modifyBloomPostShaders((index, shader) -> { - if (shader.getName().contains("filter_bloom_color")) { - shader.safeGetUniform("EnableFilter").set(fragmentFilterEnabled ? 1 : 0); - } - }); - } - private static void modifyBloomPostShaders(IntObjectConsumer consumer) { // Forcefully insert config values to shader List passes = ((PostChainAccessor) BloomShaderManager.BLOOM_CHAIN).getPasses(); 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 c6ac93cce8f..78b9350554f 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 @@ -3,8 +3,8 @@ uniform sampler2D DiffuseSampler; uniform sampler2D DiffuseDepthSampler; uniform sampler2D MainDepthSampler; -uniform bool EnableFilter; +// 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 @@ -20,14 +20,14 @@ float linearizeDepth(float depth) { } void main() { - fragColor = texture(DiffuseSampler, texCoord); - if (EnableFilter) { - // 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) { - fragColor = vec4(0.0); - } + + // 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) { + fragColor = vec4(0.0); + } else { + fragColor = texture(DiffuseSampler, texCoord); } } diff --git a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json index 98a94f0be81..120f270d7ab 100644 --- a/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json +++ b/src/main/resources/assets/gtceu/shaders/program/filter_bloom_color.json @@ -17,7 +17,6 @@ "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": "EnableFilter", "type": "int", "count": 1, "values": [ 1 ] }, { "name": "DepthNear", "type": "float", "count": 1, "values": [ 0.05 ] }, { "name": "DepthFar", "type": "float", "count": 1, "values": [ 512.0 ] } ] From 97e194a1f06df8ca05d6749773f01a36133927bc Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sun, 3 May 2026 19:41:05 +0300 Subject: [PATCH 252/269] Simplify (vanilla) quad copying logic --- .../gtceu/client/bloom/BloomUtil.java | 172 ++---------------- .../normal/ForgeModelBlockRendererMixin.java | 39 ++-- .../bloom/normal/ModelBlockRendererMixin.java | 35 ++-- .../client/bloom/normal/QuadLighterMixin.java | 36 ++-- .../client/bloom/normal/RebuildTaskMixin.java | 35 ++-- .../normal/embeddium/BlockRendererMixin.java | 53 ++++-- .../gtceu/core/util/CapturedQuadData.java | 36 ---- .../gregtechceu/gtceu/utils/ScopedValue.java | 18 +- 8 files changed, 137 insertions(+), 287 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java index 0ea81f98b89..82cfc813071 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.client.bloom; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; @@ -11,6 +10,7 @@ import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; import com.gregtechceu.gtceu.core.mixins.client.bloom.normal.LevelRendererAccessor; import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.ScopedValue; import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; import net.minecraft.client.Camera; @@ -18,7 +18,6 @@ import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.Level; @@ -32,16 +31,15 @@ import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Getter; +import lombok.experimental.Accessors; import lombok.experimental.UtilityClass; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Matrix4f; import org.joml.Matrix4fc; -import org.lwjgl.opengl.GL11; import java.util.*; import java.util.concurrent.locks.ReadWriteLock; @@ -357,111 +355,26 @@ public static void invalidateSectionData(SectionPos sectionPos) { // region vanilla-only code paths for automagic block bloom - /// @implNote map values are {@link LinkedHashSet}s for iteration order stability - private static final ThreadLocal<@Nullable Long2ObjectMap<@Nullable Set>> quadCache_tl = new ThreadLocal<>(); - - private static @Nullable Long2ObjectMap<@Nullable Set> getThreadQuadCache() { - return quadCache_tl.get(); - } - - private static Long2ObjectMap<@Nullable Set> getOrCreateThreadQuadCache() { - var quadCache = getThreadQuadCache(); - if (quadCache == null) { - quadCache = new Long2ObjectOpenHashMap<>(); - quadCache_tl.set(quadCache); - } - return quadCache; - } - - public static boolean chunkSectionHasBloomQuads(long sectionPos) { - BLOOM_RENDER_LOCK.readLock().lock(); - try { - var quadCache = getThreadQuadCache(); - if (quadCache == null) return false; - - return quadCache.containsKey(sectionPos); - } finally { - BLOOM_RENDER_LOCK.readLock().unlock(); - } - } - - private static final ThreadLocal poseStack_tl = ThreadLocal.withInitial(PoseStack::new); - - public static void drawBlockBloomForChunk(long sectionPos, - Function vertexConsumerProvider) { - BLOOM_RENDER_LOCK.readLock().lock(); - try { - var quadCache = getThreadQuadCache(); - if (quadCache == null) { - return; - } - - Set quads = quadCache.remove(sectionPos); - if (quads == null || quads.isEmpty()) { - return; - } - if (quadCache.isEmpty()) { - // remove the thread local's value if this thread's map is empty so GC can work on it - quadCache_tl.remove(); - } - - VertexConsumer bloomVertexConsumer = null; - VertexConsumer cutoutVertexConsumer = null; - - PoseStack poseStack = poseStack_tl.get(); - for (QuadCacheEntry quad : quads) { - poseStack.pushPose(); - // push the transformation & normal matrices directly into poseStack.last() - quad.transformation.get(poseStack.last().pose()); - quad.transformation.normal(poseStack.last().normal()); - - if (quad.renderType == GTRenderTypes.bloom()) { - if (cutoutVertexConsumer == null) - cutoutVertexConsumer = vertexConsumerProvider.apply(RenderType.cutout()); - - // copy quads that are already on the bloom layer to cutout - cutoutVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, - quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); - } else { - if (bloomVertexConsumer == null) - bloomVertexConsumer = vertexConsumerProvider.apply(GTRenderTypes.bloom()); - - // copy everything else to bloom - bloomVertexConsumer.putBulkData(poseStack.last(), quad.quad, quad.brightness, - quad.tintG, quad.tintG, quad.tintB, quad.packedLights, quad.packedOverlay, true); - } - - poseStack.popPose(); - } - } finally { - BLOOM_RENDER_LOCK.readLock().unlock(); - } - } + @Accessors(fluent = true) + @Getter + @ApiStatus.Internal + private static final ThreadLocal>> bloomChunkContext = ThreadLocal + .withInitial(ScopedValue.Object::new); - /// Helper function for skipping bloom quads drawn with non-bloom render types + /// Helper function for copying bloom-enabled quads drawn with non-bloom render types @ApiStatus.Internal - public static void captureBloomQuad(BakedQuad quad, @Nullable RenderType renderType, BlockPos pos, - Matrix4fc transformation, int[] packedLights, int packedOverlay, - float[] brightness, float tintR, float tintG, float tintB) { + public static void copyBloomQuad(BakedQuad quad, int[] packedLights, @Nullable RenderType renderType, + Consumer drawConsumer) { if (renderType == null || renderType == GTRenderTypes.bloom() || renderType == GTRenderTypes.entityBloomBlockSheet()) { return; } if (TextureMetadataHelper.hasBloom(quad, packedLights)) { - QuadCacheEntry entry = new QuadCacheEntry(quad, renderType, transformation, - packedLights, packedOverlay, brightness, tintR, tintG, tintB); + Supplier currentVertexConsumer = bloomChunkContext().get().getValue(); + if (currentVertexConsumer == null) return; - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - Set sectionQuads = getOrCreateThreadQuadCache() - .computeIfAbsent(SectionPos.asLong(pos), $ -> new LinkedHashSet<>()); - if (!sectionQuads.add(entry)) { - GTCEu.LOGGER.warn("Duplicate quad {} on block [{}]???", entry, pos.toShortString()); - } - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } + drawConsumer.accept(currentVertexConsumer.get()); } } @@ -522,61 +435,4 @@ private boolean postDraw() { return this.isEmpty(); } } - - @ApiStatus.Internal - private record QuadCacheEntry(BakedQuad quad, @Nullable RenderType renderType, - Matrix4fc transformation, int[] packedLights, int packedOverlay, - float[] brightness, float tintR, float tintG, float tintB) { - - @Override - public String toString() { - int[][] unpackedLights = Arrays.stream(packedLights) - .mapToObj(packed -> new int[] { LightTexture.block(packed), LightTexture.sky(packed) }) - .toArray(int[][]::new); - - return "{ " + - "renderType=" + (renderType != null ? ((RenderStateShardAccessor) renderType).getName() : null) + - ", transformation=" + FormattingUtil.matrixToSingleLineString(transformation) + - ", lights=" + Arrays.deepToString(unpackedLights) + - ", packedOverlay=" + packedOverlay + - ", brightness=" + Arrays.toString(brightness) + - ", tint=[" + tintR + ", " + tintG + ", " + tintB + ']' + - " }"; - } - - @Override - public boolean equals(@Nullable Object o) { - if (o == null || getClass() != o.getClass()) return false; - - QuadCacheEntry that = (QuadCacheEntry) o; - return this.renderType == that.renderType && - this.packedOverlay() == that.packedOverlay && - Float.floatToIntBits(this.tintR) == Float.floatToIntBits(that.tintR) && - Float.floatToIntBits(this.tintG) == Float.floatToIntBits(that.tintG) && - Float.floatToIntBits(this.tintB) == Float.floatToIntBits(that.tintB) && - - this.transformation.equals(that.transformation) && - Arrays.equals(this.packedLights, that.packedLights) && - Arrays.equals(this.brightness, that.brightness) && - // quad is compared last because it has the slowest equals() - this.quad.equals(that.quad); - } - - @Override - public int hashCode() { - int result = this.quad.hashCode(); - result = 31 * result + Objects.hashCode(this.renderType); - result = 31 * result + this.transformation.hashCode(); - - result = 31 * result + Arrays.hashCode(this.packedLights); - result = 31 * result + this.packedOverlay; - - result = 31 * result + Arrays.hashCode(this.brightness); - result = 31 * result + Float.hashCode(this.tintR); - result = 31 * result + Float.hashCode(this.tintG); - result = 31 * result + Float.hashCode(this.tintB); - - return result; - } - } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java index a509ae13cc8..bb5905c06a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java @@ -1,42 +1,33 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; -import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.lighting.ForgeModelBlockRenderer; import net.minecraftforge.client.model.lighting.QuadLighter; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(value = ForgeModelBlockRenderer.class, remap = false) public class ForgeModelBlockRendererMixin { - @Inject(method = "render", - at = @At(value = "INVOKE", - target = "Lnet/minecraftforge/client/model/lighting/QuadLighter;setup(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V")) - private static void gtceu$setQuadLighterRenderType(VertexConsumer vertexConsumer, QuadLighter lighter, - BlockAndTintGetter level, BakedModel model, BlockState state, - BlockPos pos, PoseStack poseStack, boolean checkSides, - RandomSource rand, long seed, int packedOverlay, - ModelData modelData, RenderType renderType, - CallbackInfoReturnable cir, - @Local(name = "flatLighter") QuadLighter flatLighter) { - if (flatLighter != null) { - // this is always in the flatLighter init block - flatLighter.gtceu$setRenderType(renderType); - } else { - // and this _should_ always be outside of it - lighter.gtceu$setRenderType(renderType); - } + @Definition(id = "setup", + method = "Lnet/minecraftforge/client/model/lighting/QuadLighter;setup(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V") + // we don't really care about the args, but it's better to define them than not; less likely to break this way + @Definition(id = "level", local = @Local(type = BlockAndTintGetter.class, argsOnly = true)) + @Definition(id = "pos", local = @Local(type = BlockPos.class, argsOnly = true)) + @Definition(id = "state", local = @Local(type = BlockState.class, argsOnly = true)) + @Expression("@(?).setup(level, pos, state)") + @ModifyExpressionValue(method = "render", at = @At(value = "MIXINEXTRAS:EXPRESSION")) + private static QuadLighter gtceu$setQuadLighterRenderType(QuadLighter lighter, + @Local(argsOnly = true) RenderType renderType) { + lighter.gtceu$setRenderType(renderType); + return lighter; } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java index f9f4fc32ca4..a040ae386c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.bloom.BloomUtil; -import com.gregtechceu.gtceu.core.util.CapturedQuadData; +import com.gregtechceu.gtceu.utils.ScopedValue; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.ModelBlockRenderer; @@ -14,9 +14,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.data.ModelData; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.vertex.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -27,8 +27,8 @@ public class ModelBlockRendererMixin { @Unique - private static final ThreadLocal gtceu$currentRenderType_tl = ThreadLocal - .withInitial(CapturedQuadData::new); + private static final ThreadLocal> gtceu$currentRenderType = ThreadLocal + .withInitial(ScopedValue.Object::new); @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/minecraftforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", @@ -39,25 +39,30 @@ public class ModelBlockRendererMixin { RandomSource random, long seed, int packedOverlay, ModelData modelData, RenderType renderType, Operation original) { - try (var $ = gtceu$currentRenderType_tl.get().with(renderType, pos)) { + try (var $ = gtceu$currentRenderType.get().with(renderType)) { original.call(level, model, state, pos, poseStack, consumer, checkSides, random, seed, packedOverlay, modelData, renderType); } } - @WrapWithCondition(method = "putQuadData", + // 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", target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) - private boolean gtceu$copyBloomQuads$2(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] brightness, float red, float green, float blue, - int[] packedLights, int packedOverlay, boolean mulColor) { - if (!BloomShaderManager.isBloomActive()) return true; + private void gtceu$copyBloomQuads(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + original.call(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); - CapturedQuadData currentData = gtceu$currentRenderType_tl.get(); - if (!currentData.isSet()) return true; + if (!BloomShaderManager.isBloomActive()) return; - BloomUtil.captureBloomQuad(quad, currentData.renderType(), currentData.pos(), poseEntry.pose(), - packedLights, packedOverlay, brightness, red, green, blue); - return true; + RenderType renderType = gtceu$currentRenderType.get().getValue(); + if (renderType == null) return; + + BloomUtil.copyBloomQuad(quad, combinedLights, renderType, bloomVertexConsumer -> { + original.call(bloomVertexConsumer, pose, quad, colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + }); } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java index ab6facaf0db..8b6d77d6e30 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java @@ -6,15 +6,14 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.core.BlockPos; import net.minecraftforge.client.model.lighting.QuadLighter; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -22,23 +21,26 @@ @Mixin(value = QuadLighter.class, remap = false) public class QuadLighterMixin implements QuadLighterExt { - @Shadow - private BlockPos pos; @Unique private @Nullable RenderType gtceu$renderType; - @WrapWithCondition(method = "process", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", - remap = true)) - private boolean gtceu$copyBloomQuads(VertexConsumer instance, PoseStack.Pose poseEntry, BakedQuad quad, - float[] brightness, float red, float green, float blue, - int[] packedLights, int packedOverlay, boolean mulColor) { - if (!BloomShaderManager.isBloomActive()) return true; - - BloomUtil.captureBloomQuad(quad, this.gtceu$renderType, this.pos, poseEntry.pose(), - packedLights, packedOverlay, brightness, red, green, blue); - return true; + @WrapOperation(method = "process", + at = @At(value = "INVOKE", + target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", + remap = true)) + private void gtceu$copyBloomQuads(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, + float[] colorMuls, float red, float green, float blue, + int[] combinedLights, int combinedOverlay, boolean mulColor, + Operation original) { + original.call(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); + + if (this.gtceu$renderType == null) return; + if (!BloomShaderManager.isBloomActive()) return; + + BloomUtil.copyBloomQuad(quad, combinedLights, this.gtceu$renderType, bloomVertexConsumer -> { + original.call(bloomVertexConsumer, pose, quad, colorMuls, red, green, blue, + combinedLights, combinedOverlay, mulColor); + }); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java index badd4e711c0..7919cb206e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java @@ -2,15 +2,15 @@ import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; -import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.VertexConsumer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -19,6 +19,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Set; +import java.util.function.Supplier; @Mixin(targets = "net.minecraft.client.renderer.chunk.ChunkRenderDispatcher$RenderChunk$RebuildTask") public abstract class RebuildTaskMixin { @@ -27,24 +28,30 @@ public abstract class RebuildTaskMixin { @Final ChunkRenderDispatcher.RenderChunk this$1; - @SuppressWarnings("NameDoesntMatchTargetClass") @Inject(method = "compile", - at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", remap = false)) - private void gtceu$drawCachedBlockBloom(float x, float y, float z, ChunkBufferBuilderPack chunkBufferBuilders, + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;getBlockRenderer()Lnet/minecraft/client/renderer/block/BlockRenderDispatcher;")) + private void gtceu$initBloomContextData(float x, float y, float z, ChunkBufferBuilderPack builders, CallbackInfoReturnable cir, - @Local(ordinal = 0) BlockPos sectionOrigin, @Local Set usedRenderTypes) { if (!BloomShaderManager.isBloomActive()) return; - long sectionPos = SectionPos.asLong(sectionOrigin); - if (!BloomUtil.chunkSectionHasBloomQuads(sectionPos)) return; - - BloomUtil.drawBlockBloomForChunk(sectionPos, renderType -> { - BufferBuilder buffer = chunkBufferBuilders.builder(renderType); + Supplier provider = () -> { + BufferBuilder buffer = builders.builder(GTRenderTypes.bloom()); // no existing geometry on this layer - if (usedRenderTypes.add(renderType)) this$1.beginLayer(buffer); - + if (usedRenderTypes.add(GTRenderTypes.bloom())) this$1.beginLayer(buffer); return buffer; - }); + }; + // intentionally no try-with-resource statement; closed in 'gtceu$clearBloomContextData' + BloomUtil.bloomChunkContext().get().with(provider); + } + + @Inject(method = "compile", + at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", remap = false)) + private void gtceu$clearBloomContextData(float x, float y, float z, ChunkBufferBuilderPack builders, + CallbackInfoReturnable cir) { + if (!BloomShaderManager.isBloomActive()) return; + + BloomUtil.bloomChunkContext().get().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 c314fbc5c5a..f27be8e9cae 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 @@ -6,12 +6,15 @@ 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.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import me.jellysquid.mods.sodium.client.model.color.ColorProvider; +import me.jellysquid.mods.sodium.client.model.light.LightPipeline; import me.jellysquid.mods.sodium.client.model.light.data.QuadLightData; import me.jellysquid.mods.sodium.client.model.quad.BakedQuadView; import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildContext; @@ -21,21 +24,31 @@ import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; import org.embeddedt.embeddium.impl.render.chunk.compile.GlobalChunkBuildContext; 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 class BlockRendererMixin { +public abstract class BlockRendererMixin { + + @Shadow + protected abstract void writeGeometry(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, Material material, BakedQuadView quad, int[] colors, QuadLightData light); - @WrapOperation(method = "renderQuadList", + @Inject(method = "renderQuadList", at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)V")) - private void gtceu$copyBloomQuads(BlockRenderer instance, BlockRenderContext ctx, ChunkModelBuilder originalBuilder, - Vec3 offset, Material material, BakedQuadView quad, - int[] vertexColors, QuadLightData lightData, - Operation original, + target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer;writeGeometry(Lme/jellysquid/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderContext;Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/minecraft/world/phys/Vec3;Lme/jellysquid/mods/sodium/client/render/chunk/terrain/material/Material;Lme/jellysquid/mods/sodium/client/model/quad/BakedQuadView;[ILme/jellysquid/mods/sodium/client/model/light/data/QuadLightData;)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) { - original.call(instance, ctx, originalBuilder, offset, material, quad, vertexColors, lightData); - if (!BloomShaderManager.isBloomActive()) return; ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); @@ -44,25 +57,27 @@ public class BlockRendererMixin { bloomBuilderRef.set(bloomBuilder); // call the same method again, this time with the bloom chunk model builder - original.call(instance, ctx, bloomBuilder, offset, material, quad, vertexColors, lightData); + this.writeGeometry(ctx, bloomBuilder, offset, GTEmbeddiumCompat.BLOOM_MATERIAL, quad, vertexColors, lightData); } else { bloomBuilderRef.set(null); } } - @WrapOperation(method = "renderQuadList", + @Inject(method = "renderQuadList", at = @At(value = "INVOKE", - target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;addSprite(Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;)V")) - private void gtceu$copyBloomSpriteAdds(ChunkModelBuilder originalBuilder, TextureAtlasSprite sprite, - Operation original, + target = "Lme/jellysquid/mods/sodium/client/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) { - original.call(originalBuilder, sprite); - // 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) { - original.call(bloomBuilder, sprite); + bloomBuilder.addSprite(sprite); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java b/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java deleted file mode 100644 index 6c7cefd4db1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/util/CapturedQuadData.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.core.util; - -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; - -import lombok.Getter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.Nullable; - -@Accessors(fluent = true) -public class CapturedQuadData implements AutoCloseable { - - @Getter - private @Nullable RenderType renderType; - @Getter - private BlockPos pos; - - @Getter - private boolean isSet = false; - - public CapturedQuadData with(RenderType renderType, BlockPos pos) { - this.renderType = renderType; - this.pos = pos; - - this.isSet = true; - return this; - } - - @Override - public void close() { - this.renderType = null; - this.pos = null; - - this.isSet = false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java b/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java index 75c84344a17..9758bd3288f 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/ScopedValue.java @@ -1,7 +1,10 @@ package com.gregtechceu.gtceu.utils; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.Nullable; /** * "recreations" of Java 25 scoped values using {@link AutoCloseable AutoCloseables}. @@ -12,26 +15,33 @@ public abstract class ScopedValue implements AutoCloseable { * Scoped object value. Resets to {@code null} when exiting scope. * @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 T current; + private @Nullable T value; + + public Object() { + this(null); + } /** * Set {@code current} to {@code value} within this scope. * @return this */ - public Object with(T object) { - this.current = object; + public Object with(T value) { + this.value = value; return this; } @Override public void close() { - this.current = null; + this.value = this.initialValue; } } From f9bbbb1006ca9663a90dca0e5be3f3d57ef6388b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 6 May 2026 14:21:46 +0300 Subject: [PATCH 253/269] split rendering into a separate class from special effect registration & clean up the related mixins --- .../gregtechceu/gtceu/client/ClientProxy.java | 6 +- .../client/bloom/BloomEventListeners.java | 20 +- .../{BloomUtil.java => BloomHandler.java} | 239 ++--------- .../gtceu/client/bloom/BloomRenderer.java | 383 ++++++++++++++++++ .../gtceu/client/bloom/BloomSafeMode.java | 215 ---------- .../gtceu/client/bloom/IBloomEffect.java | 2 +- .../bloom/particle/GTBloomParticle.java | 4 +- .../machine/impl/FusionRingRender.java | 2 +- .../ForgeModelBlockRendererMixin.java | 2 +- .../{normal => }/LevelRendererAccessor.java | 2 +- .../{normal => }/ModelBlockRendererMixin.java | 9 +- .../bloom/{normal => }/QuadLighterMixin.java | 6 +- .../bloom/{normal => }/RebuildTaskMixin.java | 36 +- .../normal/embeddium/BlockRendererMixin.java | 5 +- .../bloom/safemode/LevelRendererMixin.java | 27 -- .../safemode/ModelBlockRendererMixin.java | 36 -- .../bloom/safemode/QuadLighterMixin.java | 36 -- .../embeddium/BlockRendererMixin.java | 30 +- .../embeddium/GTEmbeddiumCompat.java | 8 +- src/main/resources/gtceu.mixins.json | 13 +- 20 files changed, 488 insertions(+), 593 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/bloom/{BloomUtil.java => BloomHandler.java} (51%) create mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{normal => }/ForgeModelBlockRendererMixin.java (96%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{normal => }/LevelRendererAccessor.java (89%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{normal => }/ModelBlockRendererMixin.java (93%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{normal => }/QuadLighterMixin.java (90%) rename src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/{normal => }/RebuildTaskMixin.java (56%) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index 48254a09322..b3aa779e428 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.IGTTool; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.bloom.BloomHandler; import com.gregtechceu.gtceu.client.model.item.CustomItemRendererWrapperModel; import com.gregtechceu.gtceu.client.model.item.FacadeUnbakedModel; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; @@ -74,8 +74,6 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -import java.util.*; - public class ClientProxy extends CommonProxy { public static final BiMap CLIENT_ORE_VEINS = HashBiMap.create(); @@ -94,7 +92,7 @@ public static void init() { Layers.registerLayer(FluidRenderLayer::new, "bedrock_fluids"); CommonEventListener.registerCapes(new RegisterGTCapesEvent()); - BloomUtil.init(); + BloomHandler.init(); if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { GTEmbeddiumCompat.init(); } 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 373c5caf39c..02c6cbd9ca2 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -33,7 +33,7 @@ public class BloomEventListeners { public static void afterParticlesRendered(RenderLevelStageEvent event) { if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) return; - BloomUtil.renderBloom(event.getCamera(), event.getPoseStack(), event.getFrustum(), event.getProjectionMatrix(), + BloomRenderer.renderBloom(event.getCamera(), event.getPoseStack(), event.getFrustum(), event.getProjectionMatrix(), event.getPartialTick(), event.getLevelRenderer(), Minecraft.getInstance().getProfiler()); } @@ -53,7 +53,11 @@ public static void onClientTick(TickEvent.ClientTickEvent event) { @SubscribeEvent public static void onLevelUnload(LevelEvent.Unload event) { - BloomUtil.invalidateLevelData(event.getLevel()); + BloomHandler.invalidateLevelData(event.getLevel()); + + if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + BloomRenderer.SafeMode.invalidateLevelData(); + } } @SubscribeEvent @@ -64,10 +68,12 @@ public static void onChunkUnload(ChunkEvent.Unload event) { LevelAccessor level = chunk.getWorldForge(); if (level == null) return; + if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) return; + ChunkPos chunkPos = chunk.getPos(); int minSection = level.getMinSection(), maxSection = level.getMaxSection(); for (int y = minSection; y < maxSection; y++) { - BloomUtil.invalidateSectionData(SectionPos.of(chunkPos.x, y, chunkPos.z)); + BloomRenderer.SafeMode.invalidateSectionData(SectionPos.of(chunkPos.x, y, chunkPos.z)); } } @@ -77,17 +83,17 @@ public static void onChunkUnload(ChunkEvent.Unload event) { public static class ModBus { @SubscribeEvent - public void registerShaders(RegisterShadersEvent event) throws IOException { + public static void registerShaders(RegisterShadersEvent event) throws IOException { BloomShaderManager.onRegisterShaders(event); } @SubscribeEvent - public void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { - BloomUtil.AFTER_BLOOM_RENDER_STAGE = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); + public static void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { + BloomHandler.AFTER_BLOOM_RENDER_STAGE = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); } @SubscribeEvent - public void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { + public static void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { RenderType block, entity; if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME) || !BloomShaderManager.isBloomAvailable()) { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java similarity index 51% rename from src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java index 82cfc813071..eb061dc2539 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java @@ -1,63 +1,35 @@ package com.gregtechceu.gtceu.client.bloom; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.client.particle.GTParticle; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.core.config.GTEarlyConfig; -import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; -import com.gregtechceu.gtceu.core.mixins.client.RenderStateShardAccessor; -import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; -import com.gregtechceu.gtceu.core.mixins.client.bloom.normal.LevelRendererAccessor; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.gregtechceu.gtceu.utils.ScopedValue; -import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; - -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.core.SectionPos; -import net.minecraft.util.profiling.ProfilerFiller; + import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.RenderLevelStageEvent; -import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; -import com.mojang.blaze3d.platform.GlStateManager.DestFactor; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import lombok.Getter; -import lombok.experimental.Accessors; import lombok.experimental.UtilityClass; -import org.jetbrains.annotations.ApiStatus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; -import org.joml.Matrix4f; -import org.joml.Matrix4fc; import java.util.*; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.*; -import static com.gregtechceu.gtceu.client.bloom.BloomShaderManager.BLOOM_TARGET; +import static com.gregtechceu.gtceu.client.bloom.BloomRenderer.BLOOM_RENDER_LOCK; @UtilityClass -public class BloomUtil { +public class BloomHandler { public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM_RENDER_STAGE; static final Map<@Nullable IRenderSetup, BloomRenderList> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); - static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); - public static void init() {} /** @@ -176,163 +148,23 @@ public static BloomRenderTicket registerBloomRender(@Nullable IRenderSetup setup return ticket; } - @ApiStatus.Internal - public static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, - float partialTicks, LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { - if (!BloomShaderManager.isBloomActive()) return; - - Vec3 camPos = camera.getPosition(); - - profilerFiller.popPush("gtceu:bloom"); - BloomUtil.setupBloomShaderUniforms(); - - GTRenderTypes.bloom().setupRenderState(); - - renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); - - // safe mode disabled -> use deeper, faster hackery - if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { - ((LevelRendererAccessor) levelRenderer).invokeRenderChunkLayer(GTRenderTypes.bloom(), poseStack, - camPos.x, camPos.y, camPos.z, projectionMatrix); - - // have to re-setup here. so sad. very aw. - GTRenderTypes.bloom().setupRenderState(); - } - // safe mode enabled -> don't draw block bloom the 'normal' way; use BloomSafeMode.drawBlockBloom instead - else { - BloomSafeMode.drawBlockBloom(camera, poseStack, frustum, projectionMatrix, levelRenderer, profilerFiller); - } - - BloomUtil.processPostEffect(partialTicks, profilerFiller); - - // clear state. again. - GTRenderTypes.bloom().clearRenderState(); - - // profiler section is popped by popPush() in the calling function; don't pop it here - } - - 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 - - preDraw(); - if (!BLOOM_RENDERS.isEmpty()) { - EffectRenderContext context = EffectRenderContext.getInstance().update(camera, frustum, partialTicks); - - BLOOM_RENDER_LOCK.readLock().lock(); - try { - BLOOM_RENDERS.forEach((renderSetup, list) -> { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - list.draw(poseStack, buffer, context); - }); - } finally { - BLOOM_RENDER_LOCK.readLock().unlock(); - } - - postDraw(); - } - - profilerFiller.pop(); - } - - public static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) { - Minecraft minecraft = Minecraft.getInstance(); - RenderTarget mainTarget = minecraft.getMainRenderTarget(); - - profilerFiller.push("processPostEffect"); - - BloomShaderManager.BLOOM_CHAIN.process(partialTicks); - - mainTarget.bindWrite(false); - - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, - SourceFactor.ZERO, DestFactor.ONE); - - BLOOM_TARGET.blitToScreen(mainTarget.viewWidth, mainTarget.viewHeight, false); - BLOOM_TARGET.unbindRead(); - - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - - profilerFiller.pop(); - } - - static void preDraw() { - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { - if (!ticket.isValid()) continue; - BLOOM_RENDERS.computeIfAbsent(ticket.renderSetup, BloomRenderList::new).add(ticket); - } - SCHEDULED_BLOOM_RENDERS.clear(); - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } - - static void postDraw() { - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - BLOOM_RENDERS.values().removeIf(BloomRenderList::postDraw); - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } - - @ApiStatus.Internal - public 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); - } - } - - shader.safeGetUniform("BloomStrength").set(config.strength); - shader.safeGetUniform("BaseBrightness").set(config.baseBrightness); - shader.safeGetUniform("MinBrightness").set(config.minBrightness); - shader.safeGetUniform("MaxBrightness").set(config.maxBrightness); - }); - } - - private 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()); - } - } - /** * Invalidate tickets associated with given level. * * @param level the level that was unloaded */ - public static void invalidateLevelData(LevelAccessor level) { + static void invalidateLevelData(LevelAccessor level) { Objects.requireNonNull(level, "level == null"); BLOOM_RENDER_LOCK.readLock().lock(); try { - for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { + for (BloomRenderTicket ticket : BloomHandler.SCHEDULED_BLOOM_RENDERS) { if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { ticket.invalidate(); } } - for (var e : BLOOM_RENDERS.entrySet()) { - for (BloomRenderTicket ticket : e.getValue()) { + for (BloomRenderList list : BloomHandler.BLOOM_RENDERS.values()) { + for (BloomRenderTicket ticket : list) { if (ticket.isValid() && ticket.worldContext != null && ticket.worldContext.get() == level) { ticket.invalidate(); } @@ -341,55 +173,32 @@ public static void invalidateLevelData(LevelAccessor level) { } finally { BLOOM_RENDER_LOCK.readLock().unlock(); } - - if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { - BloomSafeMode.invalidateLevelData(); - } - } - - public static void invalidateSectionData(SectionPos sectionPos) { - if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { - BloomSafeMode.invalidateSectionData(sectionPos); - } } - // region vanilla-only code paths for automagic block bloom - - @Accessors(fluent = true) - @Getter - @ApiStatus.Internal - private static final ThreadLocal>> bloomChunkContext = ThreadLocal - .withInitial(ScopedValue.Object::new); - - /// Helper function for copying bloom-enabled quads drawn with non-bloom render types - @ApiStatus.Internal - public static void copyBloomQuad(BakedQuad quad, int[] packedLights, @Nullable RenderType renderType, - Consumer drawConsumer) { - if (renderType == null || renderType == GTRenderTypes.bloom() || - renderType == GTRenderTypes.entityBloomBlockSheet()) { - return; - } - - if (TextureMetadataHelper.hasBloom(quad, packedLights)) { - Supplier currentVertexConsumer = bloomChunkContext().get().getValue(); - if (currentVertexConsumer == null) return; + // region internals - drawConsumer.accept(currentVertexConsumer.get()); + static void initializeScheduledRenders() { + for (BloomRenderTicket ticket : SCHEDULED_BLOOM_RENDERS) { + if (!ticket.isValid()) continue; + BloomHandler.BLOOM_RENDERS.computeIfAbsent(ticket.renderSetup, BloomHandler.BloomRenderList::new).add(ticket); } + SCHEDULED_BLOOM_RENDERS.clear(); } - // endregion + static void removeInvalidatedRenders() { + BloomHandler.BLOOM_RENDERS.values().removeIf(BloomHandler.BloomRenderList::postDraw); + } - private static class BloomRenderList extends ArrayList { + static final class BloomRenderList extends ArrayList { private final @Nullable IRenderSetup renderSetup; - private BloomRenderList(@Nullable IRenderSetup renderSetup) { + BloomRenderList(@Nullable IRenderSetup renderSetup) { super(2); this.renderSetup = renderSetup; } - private void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) { + void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext context) { boolean initialized = false; poseStack.pushPose(); @@ -423,7 +232,7 @@ private void draw(PoseStack poseStack, BufferBuilder buffer, EffectRenderContext * * @return Whether this list should be removed from the tracking map. */ - private boolean postDraw() { + boolean postDraw() { if (this.isEmpty()) return true; boolean removedAny = this.removeIf(ticket -> { @@ -435,4 +244,6 @@ private boolean postDraw() { return this.isEmpty(); } } + + // endregion } diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java new file mode 100644 index 00000000000..a7f9c763f32 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java @@ -0,0 +1,383 @@ +package com.gregtechceu.gtceu.client.bloom; + +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; +import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; +import com.gregtechceu.gtceu.core.mixins.client.bloom.PostChainAccessor; +import com.gregtechceu.gtceu.core.mixins.client.bloom.LevelRendererAccessor; +import com.gregtechceu.gtceu.utils.ScopedValue; +import com.gregtechceu.gtceu.utils.function.IntObjectConsumer; +import com.mojang.blaze3d.pipeline.RenderCall; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.shaders.Uniform; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import lombok.Getter; +import lombok.experimental.Accessors; +import lombok.experimental.UtilityClass; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.core.SectionPos; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.ForgeHooksClient; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static com.gregtechceu.gtceu.client.bloom.BloomShaderManager.BLOOM_TARGET; + +/** + * The actual rendering logic for bloom + */ +@ApiStatus.Internal +@UtilityClass +public class BloomRenderer { + + static final ReadWriteLock BLOOM_RENDER_LOCK = new ReentrantReadWriteLock(); + + @Accessors(fluent = true) + @Getter + @ApiStatus.Internal + static final ThreadLocal>> bloomChunkContext = ThreadLocal + .withInitial(ScopedValue.Object::new); + + @ApiStatus.Internal + static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, 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); + + // safe mode disabled -> use deeper, faster hackery + if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + ((LevelRendererAccessor) levelRenderer).invokeRenderChunkLayer(GTRenderTypes.bloom(), poseStack, + camPos.x, camPos.y, camPos.z, projectionMatrix); + + // have to re-setup here. so sad. very aw. + GTRenderTypes.bloom().setupRenderState(); + } + // safe mode enabled -> don't draw block bloom the 'normal' way; use BloomSafeMode.drawBlockBloom instead + else { + SafeMode.drawBlockBloom(camera, poseStack, frustum, projectionMatrix, levelRenderer, profilerFiller); + } + + processPostEffect(partialTicks, profilerFiller); + + // clear state. again. + GTRenderTypes.bloom().clearRenderState(); + + // 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) { + profilerFiller.push("special"); + + // render state is set up & cleared in calling function + + + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + BloomHandler.initializeScheduledRenders(); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + if (!BloomHandler.BLOOM_RENDERS.isEmpty()) { + EffectRenderContext context = EffectRenderContext.getInstance().update(camera, frustum, partialTicks); + + BLOOM_RENDER_LOCK.readLock().lock(); + try { + BloomHandler.BLOOM_RENDERS.forEach((renderSetup, list) -> { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + list.draw(poseStack, buffer, context); + }); + } finally { + BLOOM_RENDER_LOCK.readLock().unlock(); + } + + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + BloomHandler.removeInvalidatedRenders(); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + } + + profilerFiller.pop(); + } + + static void processPostEffect(float partialTicks, ProfilerFiller profilerFiller) { + Minecraft minecraft = Minecraft.getInstance(); + RenderTarget mainTarget = minecraft.getMainRenderTarget(); + + profilerFiller.push("processPostEffect"); + + BloomShaderManager.BLOOM_CHAIN.process(partialTicks); + + mainTarget.bindWrite(false); + + RenderSystem.enableBlend(); + 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.unbindRead(); + + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + + profilerFiller.pop(); + } + + @ApiStatus.Internal + 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); + } + } + + shader.safeGetUniform("BloomStrength").set(config.strength); + shader.safeGetUniform("BaseBrightness").set(config.baseBrightness); + shader.safeGetUniform("MinBrightness").set(config.minBrightness); + shader.safeGetUniform("MaxBrightness").set(config.maxBrightness); + }); + } + + 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()); + } + } + + /// 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()) { + return; + } + + if (TextureMetadataHelper.hasBloom(quad, packedLights)) { + Supplier currentVertexConsumer = bloomChunkContext().get().getValue(); + if (currentVertexConsumer == null) return; + + drawConsumer.accept(currentVertexConsumer.get()); + } + } + + /** + * A 'safe mode' for bloom rendering that's less intrusive but slower than the normal implementation. + */ + @ApiStatus.Internal + @UtilityClass + public static class SafeMode { + + // it's most likely better to use ConcurrentHashMaps rather than synchronized Long2ObjectMaps for this + // even with the boxing overhead + public static Map BLOOM_BUFFERS = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); + public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); + + public static boolean isActive() { + return GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME); + } + + private static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, + LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { + Vec3 camPos = camera.getPosition(); + profilerFiller.push("safe_mode"); + + ShaderInstance shader = setupBlockShaderUniforms(poseStack, projectionMatrix); + Uniform chunkOffset = shader.CHUNK_OFFSET; + + BLOOM_RENDER_LOCK.readLock().lock(); + try { + for (var entry : BLOOM_BUFFERS.entrySet()) { + SectionPos sectionPos = entry.getKey(); + VertexBuffer buffer = entry.getValue(); + + // noinspection ConstantValue it just isn't annotated :)) + if (buffer.isInvalid() || buffer.getFormat() == null) { + // return early if buffer is invalid or has no vertex data bound + continue; + } + + if (chunkOffset != null) { + chunkOffset.set(sectionPos.minBlockX() - (float) camPos.x(), + sectionPos.minBlockY() - (float) camPos.y(), + sectionPos.minBlockZ() - (float) camPos.z()); + chunkOffset.upload(); + } + + buffer.bind(); + buffer.draw(); + } + } finally { + BLOOM_RENDER_LOCK.readLock().unlock(); + } + + if (chunkOffset != null) { + chunkOffset.set(0.0f, 0.0f, 0.0f); + } + shader.clear(); + VertexBuffer.unbind(); + + // pop the "safe_mode" profiler section before posting forge render stage event + profilerFiller.pop(); + + // noinspection UnstableApiUsage + ForgeHooksClient.dispatchRenderStage(BloomHandler.RenderStage.AFTER_BLOOM, levelRenderer, + poseStack, projectionMatrix, levelRenderer.getTicks(), camera, frustum); + } + + public static void finishBloomBuffer(SectionPos sectionPos, BufferBuilder builder) { + BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); + if (buffer == null) { + return; + } + + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + BLOOM_BUFFER_BUILDERS.remove(sectionPos, builder); + BLOOM_BUFFER_SORT_STATES.put(sectionPos, builder.getSortState()); + + RenderCall upload = () -> { + VertexBuffer vertexBuffer = BLOOM_BUFFERS.computeIfAbsent(sectionPos, + $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); + uploadBloomBuffer(buffer, vertexBuffer); + }; + if (RenderSystem.isOnRenderThread()) { + upload.execute(); + } else { + RenderSystem.recordRenderCall(upload); + } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + } + + public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, VertexBuffer buffer) { + if (!buffer.isInvalid()) { + buffer.bind(); + buffer.upload(builder); + VertexBuffer.unbind(); + } + } + + public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { + BufferBuilder builder = BLOOM_BUFFER_BUILDERS.computeIfAbsent(sectionPos, + $ -> new BufferBuilder(GTRenderTypes.bloom().bufferSize())); + if (!builder.building()) { + builder.begin(GTRenderTypes.bloom().mode(), GTRenderTypes.bloom().format()); + } + return builder; + } + + public static void bakeBloomChunkBuffers(SectionPos sectionPos, float camX, float camY, float camZ) { + if (!BloomShaderManager.isBloomActive()) return; + + BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(sectionPos); + if (builder == null || !builder.building()) { + return; + } + builder.setQuadSorting(VertexSorting.byDistance( + camX - sectionPos.minBlockX(), + camY - sectionPos.minBlockY(), + camZ - sectionPos.minBlockZ())); + + finishBloomBuffer(sectionPos, builder); + } + + /// @return the shader to use for drawing block bloom. + private static ShaderInstance setupBlockShaderUniforms(PoseStack poseStack, Matrix4f projectionMatrix) { + ShaderInstance shader = RenderSystem.getShader(); + assert shader != null; + + for (int i = 0; i < 12; ++i) { + int textureId = RenderSystem.getShaderTexture(i); + shader.setSampler("Sampler" + i, textureId); + } + if (shader.MODEL_VIEW_MATRIX != null) shader.MODEL_VIEW_MATRIX.set(poseStack.last().pose()); + if (shader.PROJECTION_MATRIX != null) shader.PROJECTION_MATRIX.set(projectionMatrix); + if (shader.COLOR_MODULATOR != null) shader.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); + if (shader.GLINT_ALPHA != null) shader.GLINT_ALPHA.set(RenderSystem.getShaderGlintAlpha()); + if (shader.FOG_START != null) shader.FOG_START.set(RenderSystem.getShaderFogStart()); + if (shader.FOG_END != null) shader.FOG_END.set(RenderSystem.getShaderFogEnd()); + if (shader.FOG_COLOR != null) shader.FOG_COLOR.set(RenderSystem.getShaderFogColor()); + if (shader.FOG_SHAPE != null) shader.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); + if (shader.TEXTURE_MATRIX != null) shader.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); + if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + + RenderSystem.setupShaderLights(shader); + shader.apply(); + + return shader; + } + + static void invalidateLevelData() { + BLOOM_RENDER_LOCK.writeLock().lock(); + try { + BLOOM_BUFFERS.clear(); + BLOOM_BUFFER_BUILDERS.clear(); + BLOOM_BUFFER_SORT_STATES.clear(); + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + } + + public static void invalidateSectionData(SectionPos sectionPos) { + BLOOM_RENDER_LOCK.writeLock().lock(); + + try { + BLOOM_BUFFER_BUILDERS.remove(sectionPos); + BLOOM_BUFFER_SORT_STATES.remove(sectionPos); + VertexBuffer buffer = BLOOM_BUFFERS.remove(sectionPos); + + if (buffer != null) { + if (!RenderSystem.isOnRenderThread()) { + RenderSystem.recordRenderCall(buffer::close); + } else { + buffer.close(); + } + } + } finally { + BLOOM_RENDER_LOCK.writeLock().unlock(); + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java deleted file mode 100644 index 7f49ff17e4e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomSafeMode.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.gregtechceu.gtceu.client.bloom; - -import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; -import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; - -import net.minecraft.client.Camera; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.core.SectionPos; -import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.ForgeHooksClient; - -import com.mojang.blaze3d.pipeline.RenderCall; -import com.mojang.blaze3d.shaders.Uniform; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; - -import static com.gregtechceu.gtceu.client.bloom.BloomUtil.*; - -/** - * A 'safe mode' for bloom rendering that's less intrusive but slower than the normal implementation. - */ -public class BloomSafeMode { - - // it's most likely better to use ConcurrentHashMaps rather than synchronized Long2ObjectMaps for this - // even with the boxing overhead - public static Map BLOOM_BUFFERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); - public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); - - @ApiStatus.Internal - public static ThreadLocal<@Nullable SectionPos> CURRENT_RENDERING_SECTION = new ThreadLocal<>(); - - public static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, - LevelRenderer levelRenderer, ProfilerFiller profilerFiller) { - Vec3 camPos = camera.getPosition(); - profilerFiller.push("safe_mode"); - - ShaderInstance shader = setupBlockShaderUniforms(poseStack, projectionMatrix); - Uniform chunkOffset = shader.CHUNK_OFFSET; - - BLOOM_RENDER_LOCK.readLock().lock(); - try { - for (var entry : BLOOM_BUFFERS.entrySet()) { - SectionPos sectionPos = entry.getKey(); - VertexBuffer buffer = entry.getValue(); - - // noinspection ConstantValue it just isn't annotated :)) - if (buffer.isInvalid() || buffer.getFormat() == null) { - // return early if buffer is invalid or has no vertex data bound - continue; - } - - if (chunkOffset != null) { - chunkOffset.set(sectionPos.minBlockX() - (float) camPos.x(), - sectionPos.minBlockY() - (float) camPos.y(), - sectionPos.minBlockZ() - (float) camPos.z()); - chunkOffset.upload(); - } - - buffer.bind(); - buffer.draw(); - } - } finally { - BLOOM_RENDER_LOCK.readLock().unlock(); - } - - if (chunkOffset != null) { - chunkOffset.set(0.0f, 0.0f, 0.0f); - } - shader.clear(); - VertexBuffer.unbind(); - - // pop the "safe_mode" profiler section before posting forge render stage event - profilerFiller.pop(); - - // noinspection UnstableApiUsage - ForgeHooksClient.dispatchRenderStage(AFTER_BLOOM_RENDER_STAGE, levelRenderer, poseStack, projectionMatrix, - levelRenderer.getTicks(), camera, frustum); - } - - public static void copyToBloomBuffer(BakedQuad quad, int[] combinedLights, Consumer draw) { - if (!BloomShaderManager.isBloomActive()) return; - - SectionPos sectionOrigin = CURRENT_RENDERING_SECTION.get(); - if (sectionOrigin != null && TextureMetadataHelper.hasBloom(quad, combinedLights)) { - draw.accept(getOrStartBloomBuffer(sectionOrigin)); - } - } - - public static void finishBloomBuffer(SectionPos sectionPos, BufferBuilder builder) { - BufferBuilder.RenderedBuffer buffer = builder.endOrDiscardIfEmpty(); - if (buffer == null) { - return; - } - - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - BLOOM_BUFFER_BUILDERS.remove(sectionPos, builder); - BLOOM_BUFFER_SORT_STATES.put(sectionPos, builder.getSortState()); - - RenderCall upload = () -> { - VertexBuffer vertexBuffer = BLOOM_BUFFERS.computeIfAbsent(sectionPos, - $ -> new VertexBuffer(VertexBuffer.Usage.STATIC)); - uploadBloomBuffer(buffer, vertexBuffer); - }; - if (RenderSystem.isOnRenderThread()) { - upload.execute(); - } else { - RenderSystem.recordRenderCall(upload); - } - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } - - public static void uploadBloomBuffer(BufferBuilder.RenderedBuffer builder, VertexBuffer buffer) { - if (!buffer.isInvalid()) { - buffer.bind(); - buffer.upload(builder); - VertexBuffer.unbind(); - } - } - - public static BufferBuilder getOrStartBloomBuffer(SectionPos sectionPos) { - BufferBuilder builder = BLOOM_BUFFER_BUILDERS.computeIfAbsent(sectionPos, - $ -> new BufferBuilder(GTRenderTypes.bloom().bufferSize())); - if (!builder.building()) { - builder.begin(GTRenderTypes.bloom().mode(), GTRenderTypes.bloom().format()); - } - return builder; - } - - public static void bakeBloomChunkBuffers(SectionPos sectionPos, Vec3 camPos) { - if (!BloomShaderManager.isBloomActive()) return; - - BufferBuilder builder = BLOOM_BUFFER_BUILDERS.get(sectionPos); - if (builder == null || !builder.building()) { - return; - } - builder.setQuadSorting(VertexSorting.byDistance( - (float) camPos.x() - sectionPos.minBlockX(), - (float) camPos.y() - sectionPos.minBlockY(), - (float) camPos.z() - sectionPos.minBlockZ())); - - finishBloomBuffer(sectionPos, builder); - } - - /// @return the shader to use for drawing block bloom. - private static ShaderInstance setupBlockShaderUniforms(PoseStack poseStack, Matrix4f projectionMatrix) { - ShaderInstance shader = RenderSystem.getShader(); - assert shader != null; - - for (int i = 0; i < 12; ++i) { - int textureId = RenderSystem.getShaderTexture(i); - shader.setSampler("Sampler" + i, textureId); - } - if (shader.MODEL_VIEW_MATRIX != null) shader.MODEL_VIEW_MATRIX.set(poseStack.last().pose()); - if (shader.PROJECTION_MATRIX != null) shader.PROJECTION_MATRIX.set(projectionMatrix); - if (shader.COLOR_MODULATOR != null) shader.COLOR_MODULATOR.set(RenderSystem.getShaderColor()); - if (shader.GLINT_ALPHA != null) shader.GLINT_ALPHA.set(RenderSystem.getShaderGlintAlpha()); - if (shader.FOG_START != null) shader.FOG_START.set(RenderSystem.getShaderFogStart()); - if (shader.FOG_END != null) shader.FOG_END.set(RenderSystem.getShaderFogEnd()); - if (shader.FOG_COLOR != null) shader.FOG_COLOR.set(RenderSystem.getShaderFogColor()); - if (shader.FOG_SHAPE != null) shader.FOG_SHAPE.set(RenderSystem.getShaderFogShape().getIndex()); - if (shader.TEXTURE_MATRIX != null) shader.TEXTURE_MATRIX.set(RenderSystem.getTextureMatrix()); - if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); - - RenderSystem.setupShaderLights(shader); - shader.apply(); - - return shader; - } - - static void invalidateLevelData() { - BLOOM_RENDER_LOCK.writeLock().lock(); - try { - BLOOM_BUFFERS.clear(); - BLOOM_BUFFER_BUILDERS.clear(); - BLOOM_BUFFER_SORT_STATES.clear(); - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } - - public static void invalidateSectionData(SectionPos sectionPos) { - BLOOM_RENDER_LOCK.writeLock().lock(); - - try { - BLOOM_BUFFER_BUILDERS.remove(sectionPos); - BLOOM_BUFFER_SORT_STATES.remove(sectionPos); - VertexBuffer buffer = BLOOM_BUFFERS.remove(sectionPos); - - if (buffer != null) { - if (!RenderSystem.isOnRenderThread()) { - RenderSystem.recordRenderCall(buffer::close); - } else { - buffer.close(); - } - } - } finally { - BLOOM_RENDER_LOCK.writeLock().unlock(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java index 7b65014843c..40d2bbfe998 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/IBloomEffect.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.vertex.PoseStack; /** - * Render callback interface for {@link BloomUtil#registerBloomRender(IRenderSetup, IBloomEffect, BlockEntity)}. + * Render callback interface for {@link BloomHandler#registerBloomRender(IRenderSetup, IBloomEffect, BlockEntity)}. */ @FunctionalInterface public interface IBloomEffect { diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java index b5c9ddb0afd..bee4f2ddf46 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/particle/GTBloomParticle.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.bloom.particle; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; +import com.gregtechceu.gtceu.client.bloom.BloomHandler; import com.gregtechceu.gtceu.client.bloom.IBloomEffect; import com.gregtechceu.gtceu.client.bloom.IRenderSetup; import com.gregtechceu.gtceu.client.particle.GTParticle; @@ -11,7 +11,7 @@ public abstract class GTBloomParticle extends GTParticle implements IBloomEffect public GTBloomParticle(double posX, double posY, double posZ) { super(posX, posY, posZ); - BloomUtil.registerBloomRender(getBloomRenderSetup(), this, this); + BloomHandler.registerBloomRender(getBloomRenderSetup(), this, this); } protected abstract @Nullable IRenderSetup getBloomRenderSetup(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java index 219e26e7d19..fce8e332633 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/FusionRingRender.java @@ -63,7 +63,7 @@ public void render(FusionReactorMachine machine, float partialTick, PoseStack po machine.getRegisteredBloomTicket().invalidate(); } if (!machine.getRegisteredBloomTicket().isValid() && BloomShaderManager.isBloomActive()) { - BloomRenderTicket ticket = BloomUtil.registerBloomRender(FusionBloomEffect.SETUP, + BloomRenderTicket ticket = BloomHandler.registerBloomRender(FusionBloomEffect.SETUP, new FusionBloomEffect(machine), machine); machine.setRegisteredBloomTicket(ticket); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java index bb5905c06a7..e0995818396 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ForgeModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ForgeModelBlockRendererMixin.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; +package com.gregtechceu.gtceu.core.mixins.client.bloom; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/LevelRendererAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererAccessor.java similarity index 89% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/LevelRendererAccessor.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererAccessor.java index ce5433f245f..04ffcfad5ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/LevelRendererAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/LevelRendererAccessor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; +package com.gregtechceu.gtceu.core.mixins.client.bloom; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java similarity index 93% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java index a040ae386c2..2e1e2c3df07 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/ModelBlockRendererMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/ModelBlockRendererMixin.java @@ -1,7 +1,7 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; +package com.gregtechceu.gtceu.core.mixins.client.bloom; +import com.gregtechceu.gtceu.client.bloom.BloomRenderer; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.utils.ScopedValue; import net.minecraft.client.renderer.RenderType; @@ -22,7 +22,6 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -@SuppressWarnings("SameReturnValue") @Mixin(ModelBlockRenderer.class) public class ModelBlockRendererMixin { @@ -58,9 +57,7 @@ public class ModelBlockRendererMixin { if (!BloomShaderManager.isBloomActive()) return; RenderType renderType = gtceu$currentRenderType.get().getValue(); - if (renderType == null) return; - - BloomUtil.copyBloomQuad(quad, combinedLights, renderType, bloomVertexConsumer -> { + BloomRenderer.copyBloomQuad(quad, combinedLights, renderType, bloomVertexConsumer -> { original.call(bloomVertexConsumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); }); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java similarity index 90% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java index 8b6d77d6e30..d634eb5a5df 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/QuadLighterMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/QuadLighterMixin.java @@ -1,7 +1,7 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; +package com.gregtechceu.gtceu.core.mixins.client.bloom; +import com.gregtechceu.gtceu.client.bloom.BloomRenderer; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.core.util.extensions.QuadLighterExt; import net.minecraft.client.renderer.RenderType; @@ -37,7 +37,7 @@ public class QuadLighterMixin implements QuadLighterExt { if (this.gtceu$renderType == null) return; if (!BloomShaderManager.isBloomActive()) return; - BloomUtil.copyBloomQuad(quad, combinedLights, this.gtceu$renderType, bloomVertexConsumer -> { + BloomRenderer.copyBloomQuad(quad, combinedLights, this.gtceu$renderType, bloomVertexConsumer -> { original.call(bloomVertexConsumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); }); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java similarity index 56% rename from src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java rename to src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java index 7919cb206e9..afb36585112 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/normal/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java @@ -1,9 +1,11 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.normal; +package com.gregtechceu.gtceu.core.mixins.client.bloom; +import com.gregtechceu.gtceu.client.bloom.BloomRenderer; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; -import com.gregtechceu.gtceu.client.bloom.BloomUtil; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.core.config.GTEarlyConfig; +import com.gregtechceu.gtceu.core.mixins.GTMixinPlugin; import net.minecraft.client.renderer.ChunkBufferBuilderPack; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; @@ -11,6 +13,8 @@ import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -31,27 +35,37 @@ public abstract class RebuildTaskMixin { @Inject(method = "compile", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getBlockRenderer()Lnet/minecraft/client/renderer/block/BlockRenderDispatcher;")) - private void gtceu$initBloomContextData(float x, float y, float z, ChunkBufferBuilderPack builders, + private void gtceu$initBloomContextData(float camX, float camY, float camZ, ChunkBufferBuilderPack builders, CallbackInfoReturnable cir, + @Local(ordinal = 0) BlockPos sectionOrigin, @Local Set usedRenderTypes) { if (!BloomShaderManager.isBloomActive()) return; Supplier provider = () -> { - BufferBuilder buffer = builders.builder(GTRenderTypes.bloom()); - // no existing geometry on this layer - if (usedRenderTypes.add(GTRenderTypes.bloom())) this$1.beginLayer(buffer); - return buffer; + if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + BufferBuilder buffer = builders.builder(GTRenderTypes.bloom()); + // no existing geometry on this layer + if (usedRenderTypes.add(GTRenderTypes.bloom())) this$1.beginLayer(buffer); + return buffer; + } else { + return BloomRenderer.SafeMode.getOrStartBloomBuffer(SectionPos.of(sectionOrigin)); + } }; // intentionally no try-with-resource statement; closed in 'gtceu$clearBloomContextData' - BloomUtil.bloomChunkContext().get().with(provider); + BloomRenderer.bloomChunkContext().get().with(provider); } @Inject(method = "compile", at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", remap = false)) - private void gtceu$clearBloomContextData(float x, float y, float z, ChunkBufferBuilderPack builders, - CallbackInfoReturnable cir) { + private void gtceu$clearBloomContextData(float camX, float camY, float camZ, ChunkBufferBuilderPack builders, + CallbackInfoReturnable cir, + @Local(ordinal = 0) BlockPos sectionOrigin) { if (!BloomShaderManager.isBloomActive()) return; - BloomUtil.bloomChunkContext().get().close(); + if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + BloomRenderer.SafeMode.bakeBloomChunkBuffers(SectionPos.of(sectionOrigin), camX, camY, camZ); + } + + BloomRenderer.bloomChunkContext().get().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 f27be8e9cae..a8234daa9ae 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 @@ -49,10 +49,9 @@ public abstract class BlockRendererMixin { @Local(name = "vertexColors") int[] vertexColors, @Local(name = "lightData") QuadLightData lightData, @Share("bloomBuilder") LocalRef bloomBuilderRef) { - if (!BloomShaderManager.isBloomActive()) return; - ChunkBuildContext chunkContext = GlobalChunkBuildContext.get(); - if (chunkContext != null && TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { + if (BloomShaderManager.isBloomActive() && chunkContext != null && + TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { var bloomBuilder = chunkContext.buffers.get(GTEmbeddiumCompat.BLOOM_RENDER_PASS); bloomBuilderRef.set(bloomBuilder); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java deleted file mode 100644 index ec543af4b4e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/LevelRendererMixin.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; - -import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; - -import net.minecraft.client.Camera; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.core.SectionPos; - -import com.llamalad7.mixinextras.sugar.Local; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LevelRenderer.class) -public class LevelRendererMixin { - - @Inject(method = "compileChunks", - at = @At(value = "INVOKE", - ordinal = 0, - target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;lightOnInSection(Lnet/minecraft/core/SectionPos;)Z")) - private void gtceu$compileBloomBuffers(Camera camera, CallbackInfo ci, - @Local SectionPos sectionPos) { - BloomSafeMode.CURRENT_RENDERING_SECTION.set(sectionPos); - BloomSafeMode.bakeBloomChunkBuffers(sectionPos, camera.getPosition()); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java deleted file mode 100644 index 2db36029365..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/ModelBlockRendererMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; - -import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; - -import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.model.BakedQuad; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -/** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.ModelBlockRendererMixin} - * - * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.ModelBlockRendererMixin - */ -@Mixin(ModelBlockRenderer.class) -public class ModelBlockRendererMixin { - - @WrapOperation(method = "putQuadData", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V")) - private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - original.call(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); - BloomSafeMode.copyToBloomBuffer(quad, combinedLights, vertexConsumer -> { - original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, combinedLights, - combinedOverlay, mulColor); - }); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java deleted file mode 100644 index de2aa0184a0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/safemode/QuadLighterMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode; - -import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; - -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraftforge.client.model.lighting.QuadLighter; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.*; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -/** - * Safe mode version of {@link com.gregtechceu.gtceu.core.mixins.client.bloom.normal.QuadLighterMixin} - * - * @see com.gregtechceu.gtceu.core.mixins.client.bloom.normal.QuadLighterMixin - */ -@Mixin(value = QuadLighter.class, remap = false) -public class QuadLighterMixin { - - @WrapOperation(method = "process", - at = @At(value = "INVOKE", - target = "Lcom/mojang/blaze3d/vertex/VertexConsumer;putBulkData(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/block/model/BakedQuad;[FFFF[IIZ)V", - remap = true)) - private void gtceu$copyToBloomBuffer(VertexConsumer consumer, PoseStack.Pose pose, BakedQuad quad, - float[] colorMuls, float red, float green, float blue, - int[] combinedLights, int combinedOverlay, boolean mulColor, - Operation original) { - original.call(consumer, pose, quad, colorMuls, red, green, blue, combinedLights, combinedOverlay, mulColor); - BloomSafeMode.copyToBloomBuffer(quad, combinedLights, vertexConsumer -> { - original.call(vertexConsumer, pose, quad, colorMuls, red, green, blue, combinedLights, - combinedOverlay, mulColor); - }); - } -} 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 aaeffe5057b..e16054d4669 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 @@ -1,9 +1,12 @@ package com.gregtechceu.gtceu.core.mixins.client.bloom.safemode.embeddium; -import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; +import com.gregtechceu.gtceu.client.bloom.BloomRenderer; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.util.TextureMetadataHelper; +import com.gregtechceu.gtceu.integration.embeddium.GTEmbeddiumCompat; +import com.mojang.blaze3d.vertex.VertexConsumer; +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildContext; import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -21,6 +24,7 @@ import me.jellysquid.mods.sodium.client.render.chunk.compile.pipeline.BlockRenderer; import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; +import org.embeddedt.embeddium.impl.render.chunk.compile.GlobalChunkBuildContext; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -38,17 +42,17 @@ public class BlockRendererMixin { @Inject(method = "writeGeometry", at = @At(value = "HEAD")) private void gtceu$copyBloomQuads$initLocals(BlockRenderContext ctx, ChunkModelBuilder builder, Vec3 offset, Material material, BakedQuadView quad, - int[] colors, QuadLightData light, + int[] colors, QuadLightData lightData, CallbackInfo ci, - @Share("bufferBuilder") LocalRef bufferBuilderRef) { + @Share("bloomBuffer") LocalRef bloomBufferRef) { // Check if quad is full brightness OR we have bloom enabled for the quad - if (!BloomShaderManager.isBloomActive() || !TextureMetadataHelper.hasBloom((BakedQuad) quad, light.lm)) { - bufferBuilderRef.set(null); - return; + if (BloomShaderManager.isBloomActive() && TextureMetadataHelper.hasBloom((BakedQuad) quad, lightData.lm)) { + SectionPos sectionPos = SectionPos.of(ctx.pos()); + bloomBufferRef.set(BloomRenderer.SafeMode.getOrStartBloomBuffer(sectionPos)); + } else { + bloomBufferRef.set(null); } - SectionPos sectionPos = SectionPos.of(ctx.pos()); - bufferBuilderRef.set(BloomSafeMode.getOrStartBloomBuffer(sectionPos)); } @Inject(method = "writeGeometry", @@ -61,15 +65,15 @@ public class BlockRendererMixin { CallbackInfo ci, @Local(name = "srcIndex") int srcIndex, @Local(name = "out") ChunkVertexEncoder.Vertex v, - @Share("bufferBuilder") LocalRef bufferBuilderRef) { - BufferBuilder bufferBuilder = bufferBuilderRef.get(); - // bufferBuilder is null if bloom isn't available or the quad's texture doesn't have bloom - if (bufferBuilder == null) return; + @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 + if (bloomBuffer == null) return; int normal = quad.getForgeNormal(srcIndex); if (normal == 0) normal = quad.getComputedFaceNormal(); - bufferBuilder.vertex(v.x, v.y, v.z) + bloomBuffer.vertex(v.x, v.y, v.z) .color(ColorARGB.toABGR(v.color)) .uv(v.u, v.v) .uv2(v.light) 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 fe0910c0fcf..f609c51914f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.integration.embeddium; -import com.gregtechceu.gtceu.client.bloom.BloomSafeMode; +import com.gregtechceu.gtceu.client.bloom.BloomRenderer; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; import com.gregtechceu.gtceu.core.config.GTEarlyConfig; @@ -34,13 +34,13 @@ public static void registerSafeModeChunkMeshAppender(ChunkMeshEvent event) { event.addMeshAppender(context -> { SectionPos sectionOrigin = context.sectionOrigin(); - if (!BloomSafeMode.BLOOM_BUFFER_BUILDERS.containsKey(sectionOrigin)) { + if (!BloomRenderer.SafeMode.BLOOM_BUFFER_BUILDERS.containsKey(sectionOrigin)) { return; } Vec3 camPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); - BloomSafeMode.CURRENT_RENDERING_SECTION.set(sectionOrigin); - BloomSafeMode.bakeBloomChunkBuffers(sectionOrigin, camPos); + BloomRenderer.SafeMode.bakeBloomChunkBuffers(sectionOrigin, + (float) camPos.x, (float) camPos.y, (float) camPos.z); }); } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index a1c6ab841e9..1389ff4c42c 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -31,19 +31,16 @@ "client.bloom.GameRendererAccessor", "client.bloom.LevelRendererMixin", "client.bloom.PostChainAccessor", - "client.bloom.normal.ForgeModelBlockRendererMixin", - "client.bloom.normal.LevelRendererAccessor", - "client.bloom.normal.ModelBlockRendererMixin", - "client.bloom.normal.QuadLighterMixin", - "client.bloom.normal.RebuildTaskMixin", + "client.bloom.ForgeModelBlockRendererMixin", + "client.bloom.LevelRendererAccessor", + "client.bloom.ModelBlockRendererMixin", + "client.bloom.QuadLighterMixin", + "client.bloom.RebuildTaskMixin", "client.bloom.normal.RenderTypeMixin", "client.bloom.normal.embeddium.BlockRendererMixin", "client.bloom.normal.embeddium.DefaultMaterialsMixin", "client.bloom.normal.embeddium.DefaultTerrainRenderPassesMixin", "client.bloom.normal.oculus.WorldRenderingPhaseMixin", - "client.bloom.safemode.LevelRendererMixin", - "client.bloom.safemode.ModelBlockRendererMixin", - "client.bloom.safemode.QuadLighterMixin", "client.bloom.safemode.embeddium.BlockRendererMixin", "dev.client.KeyboardHandlerMixin", "ftbchunks.FTBChunksClientMixin", From 4cc75f5f0b77ae6bc7d59a73571c04bda759762c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 6 May 2026 14:24:59 +0300 Subject: [PATCH 254/269] Clean uo the wacky event listener redirection --- .../client/bloom/BloomEventListeners.java | 18 +++--------------- .../gtceu/client/bloom/BloomHandler.java | 14 +++++++++++--- .../gtceu/client/bloom/BloomShaderManager.java | 8 +++++--- 3 files changed, 19 insertions(+), 21 deletions(-) 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 02c6cbd9ca2..7ba4223a770 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -11,9 +11,9 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.ForgeRenderTypes; import net.minecraftforge.client.event.RegisterNamedRenderTypesEvent; -import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.level.ChunkEvent; @@ -23,9 +23,7 @@ import lombok.experimental.UtilityClass; -import java.io.IOException; - -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) +@Mod.EventBusSubscriber(modid = GTCEu.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) @UtilityClass public class BloomEventListeners { @@ -78,20 +76,10 @@ public static void onChunkUnload(ChunkEvent.Unload event) { } // Merge into parent class in 1.21, event listener discovery is smarter there - @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + @Mod.EventBusSubscriber(modid = GTCEu.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) @UtilityClass public static class ModBus { - @SubscribeEvent - public static void registerShaders(RegisterShadersEvent event) throws IOException { - BloomShaderManager.onRegisterShaders(event); - } - - @SubscribeEvent - public static void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { - BloomHandler.AFTER_BLOOM_RENDER_STAGE = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); - } - @SubscribeEvent public static void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { RenderType block, entity; diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java index eb061dc2539..abc8688f4b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomHandler.java @@ -25,13 +25,21 @@ @UtilityClass public class BloomHandler { - public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM_RENDER_STAGE; + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + @UtilityClass + public static class RenderStage { + + public static RenderLevelStageEvent.@UnknownNullability Stage AFTER_BLOOM; + + @SubscribeEvent + public static void registerLevelRenderStages(RenderLevelStageEvent.RegisterStageEvent event) { + AFTER_BLOOM = event.register(GTCEu.id("after_bloom"), GTRenderTypes.bloom()); + } + } static final Map<@Nullable IRenderSetup, BloomRenderList> BLOOM_RENDERS = new Object2ObjectOpenHashMap<>(); static final List SCHEDULED_BLOOM_RENDERS = new ArrayList<>(); - public static void init() {} - /** * Register a custom bloom render callback for subsequent world render. The render call persists until the * {@code blockEntity} is invalidated, or the world associated with {@code blockEntity} or the ticket is diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index 81974187edd..f5767c129b3 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -11,7 +11,6 @@ import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RegisterShadersEvent; import net.minecraftforge.event.TickEvent; @@ -19,13 +18,16 @@ import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import lombok.Getter; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import java.io.IOException; -@OnlyIn(Dist.CLIENT) +@Mod.EventBusSubscriber(modid = GTCEu.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +@UtilityClass public class BloomShaderManager { public static @UnknownNullability PostChain BLOOM_CHAIN = null; @@ -36,7 +38,7 @@ public class BloomShaderManager { @Getter private static @Nullable ShaderInstance rendertypeEntityBloomShader; - @ApiStatus.Internal + @SubscribeEvent public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { event.registerShader(new ShaderInstance(event.getResourceProvider(), GTCEu.id("rendertype_bloom"), DefaultVertexFormat.BLOCK), From 3c937fb30eee81778d97a59820f3bf33f51dbfe9 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 6 May 2026 14:25:19 +0300 Subject: [PATCH 255/269] BloomAlgorithm -> BloomType --- .../gtceu/client/bloom/BloomShaderManager.java | 9 +++++---- .../client/bloom/{BloomAlgorithm.java => BloomType.java} | 2 +- .../java/com/gregtechceu/gtceu/config/ConfigHolder.java | 8 ++++---- 3 files changed, 10 insertions(+), 9 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/bloom/{BloomAlgorithm.java => BloomType.java} (88%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java index f5767c129b3..f03c607fe71 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomShaderManager.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.core.config.GTEarlyConfig; import com.gregtechceu.gtceu.core.mixins.client.bloom.GameRendererAccessor; +import lombok.experimental.UtilityClass; import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.PostChain; @@ -60,7 +61,7 @@ public static boolean initPostShaders() { ResourceLocation id = null; - switch (ConfigHolder.INSTANCE.client.bloom.bloomType) { + switch (ConfigHolder.INSTANCE.client.bloom.type) { case UNITY -> id = GTCEu.id("shaders/post/bloom_unity.json"); case UNREAL -> id = GTCEu.id("shaders/post/bloom_unreal.json"); case DISABLED -> { @@ -69,8 +70,8 @@ public static boolean initPostShaders() { // skip adding a default branch in favor of the if statement below } if (id == null) { - GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.bloom.bloomType); - ConfigHolder.INSTANCE.client.bloom.bloomType = BloomAlgorithm.DISABLED; + GTCEu.LOGGER.error("Invalid bloom style {}", ConfigHolder.INSTANCE.client.bloom.type); + ConfigHolder.INSTANCE.client.bloom.type = BloomType.DISABLED; return false; } @@ -101,7 +102,7 @@ private static void deinitPostShaders() { public static boolean isBloomActive() { return BLOOM_CHAIN != null && BLOOM_TARGET != null && - ConfigHolder.INSTANCE.client.bloom.bloomType != BloomAlgorithm.DISABLED && isBloomAvailable(); + ConfigHolder.INSTANCE.client.bloom.type != BloomType.DISABLED && isBloomAvailable(); } @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomType.java similarity index 88% rename from src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java rename to src/main/java/com/gregtechceu/gtceu/client/bloom/BloomType.java index 369637488c6..9ede642bcbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomAlgorithm.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomType.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.bloom; -public enum BloomAlgorithm { +public enum BloomType { /** * Unity Bloom (rescale) diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index b2929c5ec3b..865638cacdb 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.client.bloom.BloomAlgorithm; +import com.gregtechceu.gtceu.client.bloom.BloomType; import com.gregtechceu.gtceu.client.bloom.BloomShaderManager; import net.minecraft.commands.Commands; @@ -849,9 +849,9 @@ public static class BloomOptions { "UNREAL - Unreal-like Bloom (gaussian blur)", "DISABLED - No bloom", "Default: UNREAL" }) - @Configurable.ValueUpdateCallback(method = "onBloomTypeOptionChange") + @Configurable.ValueUpdateCallback(method = "typeOptionChanged") // @Configurable.Validator(BloomEventListeners.BloomTypeUpdateCallback.class) // for Configuration 3.x - public BloomAlgorithm bloomType = BloomAlgorithm.UNREAL; + public BloomType type = BloomType.UNREAL; @Configurable @Configurable.Comment({ "Whether or not to add bloom to emissive textures", "Default: true" }) @@ -897,7 +897,7 @@ public static class BloomOptions { // used by bloomType field's value update callback @SuppressWarnings("unused") - private void onBloomTypeOptionChange(BloomAlgorithm bloomType, IValidationHandler validationHandler) { + private void typeOptionChanged(BloomType newType, IValidationHandler validationHandler) { if (!BloomShaderManager.initPostShaders()) { // failed to load post shaders From 47d6fdbd47f4246a0506f88139d3995150ee0f2e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 6 May 2026 14:27:37 +0300 Subject: [PATCH 256/269] util function for checking if bloom safe mode is enabled --- .../gtceu/client/bloom/BloomEventListeners.java | 13 ++++++------- .../gtceu/client/bloom/BloomRenderer.java | 6 +++--- .../gtceu/core/config/GTEarlyConfig.java | 14 ++++++++------ .../core/mixins/client/bloom/RebuildTaskMixin.java | 5 +++-- .../integration/embeddium/GTEmbeddiumCompat.java | 2 +- 5 files changed, 21 insertions(+), 19 deletions(-) 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 7ba4223a770..eaee5dfb982 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomEventListeners.java @@ -53,7 +53,7 @@ public static void onClientTick(TickEvent.ClientTickEvent event) { public static void onLevelUnload(LevelEvent.Unload event) { BloomHandler.invalidateLevelData(event.getLevel()); - if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + if (BloomRenderer.SafeMode.enabled()) { BloomRenderer.SafeMode.invalidateLevelData(); } } @@ -66,7 +66,7 @@ public static void onChunkUnload(ChunkEvent.Unload event) { LevelAccessor level = chunk.getWorldForge(); if (level == null) return; - if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) return; + if (!BloomRenderer.SafeMode.enabled()) return; ChunkPos chunkPos = chunk.getPos(); int minSection = level.getMinSection(), maxSection = level.getMaxSection(); @@ -83,14 +83,13 @@ public static class ModBus { @SubscribeEvent public static void registerNamedRenderTypes(RegisterNamedRenderTypesEvent event) { RenderType block, entity; - if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME) || - !BloomShaderManager.isBloomAvailable()) { + if (!BloomRenderer.SafeMode.enabled() && BloomShaderManager.isBloomAvailable()) { + block = GTRenderTypes.bloom(); + entity = GTRenderTypes.entityBloomBlockSheet(); + } else { // if safe mode is enabled, register the named render type as a copy of forge's 'cutout' block = RenderType.cutoutMipped(); entity = ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get(); - } else { - block = GTRenderTypes.bloom(); - entity = GTRenderTypes.entityBloomBlockSheet(); } event.register("bloom", block, entity); } 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 a7f9c763f32..35859132259 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/bloom/BloomRenderer.java @@ -71,7 +71,7 @@ static void renderBloom(Camera camera, PoseStack poseStack, Frustum frustum, Mat renderSpecialBloom(camera, poseStack, frustum, partialTicks, profilerFiller); // safe mode disabled -> use deeper, faster hackery - if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + if (!BloomRenderer.SafeMode.enabled()) { ((LevelRendererAccessor) levelRenderer).invokeRenderChunkLayer(GTRenderTypes.bloom(), poseStack, camPos.x, camPos.y, camPos.z, projectionMatrix); @@ -213,8 +213,8 @@ public static class SafeMode { public static Map BLOOM_BUFFER_BUILDERS = new ConcurrentHashMap<>(); public static Map BLOOM_BUFFER_SORT_STATES = new ConcurrentHashMap<>(); - public static boolean isActive() { - return GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME); + public static boolean enabled() { + return GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE); } private static void drawBlockBloom(Camera camera, PoseStack poseStack, Frustum frustum, Matrix4f projectionMatrix, diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java index d0228a8a700..0e0f9abbdcf 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java +++ b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java @@ -2,7 +2,6 @@ import net.minecraftforge.fml.loading.FMLLoader; -import com.google.common.collect.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; @@ -17,7 +16,7 @@ */ public class GTEarlyConfig { - public static final String SAFE_MODE_CONFIG_NAME = "client.bloom.safe_mode."; + public static final String SAFE_MODE = "client.bloom.safe_mode."; private static final Logger LOGGER = LogManager.getLogger("GTEarlyConfig"); @@ -29,16 +28,15 @@ private GTEarlyConfig(File file) { // Defines the default rules which can be configured by the user or other mods. // You must manually add a rule for any new mixins not covered by an existing package rule. - final String safeModeConfig = "client.bloom.safe_mode"; // no trailing dot - Option option = addMixinRule(safeModeConfig, false); + Option option = addMixinRule(SAFE_MODE, false); option.addComment( "Whether to use a 'safe mode' for bloom rendering", "NOTE: considerably slower than the normal logic, but likely fixes compatibility issues with other mods.", "Requires restarting the client to take effect."); - addDelegateRule("client.bloom.safemode", safeModeConfig, false); - addDelegateRule("client.bloom.normal", safeModeConfig, true); + addDelegateRule("client.bloom.safemode", SAFE_MODE, false); + addDelegateRule("client.bloom.normal", SAFE_MODE, true); // hidden rules for dev-only mixins addHiddenRule("dev", !FMLLoader.isProduction()); @@ -115,6 +113,8 @@ private void enableIfModPresent(String configName, String... ids) { * @throws IllegalStateException If a rule with that name already exists */ private Option addMixinRule(String configName, boolean enabled) { + if (configName.endsWith(".")) configName = configName.substring(0, configName.length() - 2); + Option option = new Option(configName, enabled, false); if (this.options.putIfAbsent(configName, option) != null) { throw new IllegalStateException("Mixin rule already defined: " + configName); @@ -147,6 +147,8 @@ private Option addHiddenRule(String configName, boolean enabled) { * @throws IllegalArgumentException If a rule named {@code delegateName} doesn't already exist */ private Option addDelegateRule(String configName, String delegateName, boolean invert) { + if (delegateName.endsWith(".")) delegateName = delegateName.substring(0, delegateName.length() - 2); + Option delegateOption = this.options.get(delegateName); if (delegateOption == null) { throw new IllegalArgumentException("Delegate rule not defined: " + delegateName); diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java index afb36585112..c56c2c1ff5d 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/client/bloom/RebuildTaskMixin.java @@ -42,12 +42,13 @@ public abstract class RebuildTaskMixin { if (!BloomShaderManager.isBloomActive()) return; Supplier provider = () -> { - if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + if (!BloomRenderer.SafeMode.enabled()) { BufferBuilder buffer = builders.builder(GTRenderTypes.bloom()); // no existing geometry on this layer if (usedRenderTypes.add(GTRenderTypes.bloom())) this$1.beginLayer(buffer); return buffer; } else { + // safe mode path return BloomRenderer.SafeMode.getOrStartBloomBuffer(SectionPos.of(sectionOrigin)); } }; @@ -62,7 +63,7 @@ public abstract class RebuildTaskMixin { @Local(ordinal = 0) BlockPos sectionOrigin) { if (!BloomShaderManager.isBloomActive()) return; - if (GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) { + if (BloomRenderer.SafeMode.enabled()) { BloomRenderer.SafeMode.bakeBloomChunkBuffers(SectionPos.of(sectionOrigin), camX, camY, camZ); } 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 f609c51914f..c02092d4f46 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/embeddium/GTEmbeddiumCompat.java @@ -29,7 +29,7 @@ public static void init() { @SubscribeEvent public static void registerSafeModeChunkMeshAppender(ChunkMeshEvent event) { - if (!GTMixinPlugin.isOptionEnabled(GTEarlyConfig.SAFE_MODE_CONFIG_NAME)) return; + if (!BloomRenderer.SafeMode.enabled()) return; if (!BloomShaderManager.isBloomActive()) return; event.addMeshAppender(context -> { From 8088cd3ff505e63e231b145a3c0ac01d9c5d89ca Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 12:05:50 +0300 Subject: [PATCH 257/269] Fix small bugs that caused huge issues --- .../java/com/gregtechceu/gtceu/client/ClientProxy.java | 1 - .../com/gregtechceu/gtceu/core/config/GTEarlyConfig.java | 4 ++-- .../assets/gtceu/shaders/program/down_sampling.fsh | 9 ++++----- .../assets/gtceu/shaders/program/up_sampling.fsh | 2 +- .../assets/gtceu/shaders/program/up_sampling.json | 2 +- .../textures/block/lamps/light_gray_bloom.png.mcmeta | 2 +- .../gtceu/textures/block/lamps/light_gray_on.png.mcmeta | 2 +- 7 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index b3aa779e428..7cec8289a4e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -92,7 +92,6 @@ public static void init() { Layers.registerLayer(FluidRenderLayer::new, "bedrock_fluids"); CommonEventListener.registerCapes(new RegisterGTCapesEvent()); - BloomHandler.init(); if (GTCEu.Mods.isSodiumEmbeddiumLoaded()) { GTEmbeddiumCompat.init(); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java index 0e0f9abbdcf..bbf13645eac 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java +++ b/src/main/java/com/gregtechceu/gtceu/core/config/GTEarlyConfig.java @@ -113,7 +113,7 @@ private void enableIfModPresent(String configName, String... ids) { * @throws IllegalStateException If a rule with that name already exists */ private Option addMixinRule(String configName, boolean enabled) { - if (configName.endsWith(".")) configName = configName.substring(0, configName.length() - 2); + if (configName.endsWith(".")) configName = configName.substring(0, configName.length() - 1); Option option = new Option(configName, enabled, false); if (this.options.putIfAbsent(configName, option) != null) { @@ -147,7 +147,7 @@ private Option addHiddenRule(String configName, boolean enabled) { * @throws IllegalArgumentException If a rule named {@code delegateName} doesn't already exist */ private Option addDelegateRule(String configName, String delegateName, boolean invert) { - if (delegateName.endsWith(".")) delegateName = delegateName.substring(0, delegateName.length() - 2); + if (delegateName.endsWith(".")) delegateName = delegateName.substring(0, delegateName.length() - 1); Option delegateOption = this.options.get(delegateName); if (delegateOption == null) { diff --git a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh index fb54613cac8..c025a3ee686 100644 --- a/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/down_sampling.fsh @@ -20,12 +20,11 @@ vec2 outTexelInv = vec2(-outTexel.x, outTexel.y); vec4 average(vec4 center, vec4 left, vec4 right, vec4 up, vec4 down, bool accountCenterColor) { float totalAlpha = abs(center.a - left.a) + abs(center.a - right.a) + abs(center.a - up.a) + abs(center.a - down.a); - totalAlpha = clamp(totalAlpha, 0.0, 1.0); vec3 totalColor = (left.rgb * left.a) - + (right.rgb * right.a) - + (up.rgb * up.a) - + (down.rgb * down.a) - + (center.rgb * center.a * accountCenterColor); + + (right.rgb * right.a) + + (up.rgb * up.a) + + (down.rgb * down.a) + + (center.rgb * center.a * float(accountCenterColor)); return vec4(totalColor, totalAlpha); } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh index 6dbba0e2b47..5a8df90ad0e 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.fsh @@ -19,7 +19,7 @@ vec4 average(vec4 center, vec4 left, vec4 right, vec4 up, vec4 down, bool accoun + (right.rgb * right.a) + (up.rgb * up.a) + (down.rgb * down.a) - + (center.rgb * center.a * accountCenterColor); + + (center.rgb * center.a * float(accountCenterColor)); return vec4(totalColor, totalAlpha); } diff --git a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json index c1556b68b9e..1ada000f1e3 100644 --- a/src/main/resources/assets/gtceu/shaders/program/up_sampling.json +++ b/src/main/resources/assets/gtceu/shaders/program/up_sampling.json @@ -6,7 +6,7 @@ "srcalpha": "zero", "dstalpha": "one" }, - "vertex": "gtceu:blit_copy_depth", + "vertex": "blit", "fragment": "gtceu:up_sampling", "attributes": [ "Position" ], "samplers": [ diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta index 756b9920894..52d15b67196 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta @@ -1,6 +1,6 @@ { "gtceu": { - "connection_texture": "gtceu:block/lamps/light_gray_ctm_emissive", + "connection_texture": "gtceu:block/lamps/light_gray_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta index 6bb38120805..f8cdf3acb09 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta @@ -1,6 +1,6 @@ { "gtceu": { - "connection_texture": "gtceu:block/lamps/light_gray_ctm", + "connection_texture": "gtceu:block/lamps/light_gray_on_ctm", "bloom": false } } \ No newline at end of file From 98e3f09f6860b92880e56e055165a19c4b67197d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 13:57:56 +0300 Subject: [PATCH 258/269] Fix CTM not working when embeddium isn't installed because of a rounding error. --- .../gtceu/client/util/quad/CTMHelper.java | 75 ++++++++++--------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index e6d4c3aa0be..60d8c9c61ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -27,19 +27,6 @@ public class CTMHelper { - public static Vector2f[] findMinMaxUVs(Vector2f[] uvs) { - float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE, maxU = Float.MIN_VALUE, maxV = Float.MIN_VALUE; - - for (int i = 0; i < 4; i++) { - Vector2f uv = uvs[i]; - minU = Math.min(minU, uv.x()); - minV = Math.min(minV, uv.y()); - maxU = Math.max(maxU, uv.x()); - maxV = Math.max(maxV, uv.y()); - } - return new Vector2f[] { new Vector2f(minU, minV), new Vector2f(maxU, maxV) }; - } - public static List buildCTMQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, List quads, Direction cullFace) { CTMCache ctmCache = CTMCache.getInstance(); @@ -92,23 +79,14 @@ public static List buildCTMQuads(CTMCache cachedConnections, List 0.5f ? 0.5f : 0.0f, - minVInterp = maxUV.y > 0.5f ? 0.5f : 0.0f; - float maxUInterp = maxUV.x > 0.5f ? 1.0f : 0.5f, - maxVInterp = maxUV.y > 0.5f ? 1.0f : 0.5f; - - normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[0]); - normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[1]); - normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[2]); - normalize(minUInterp, minVInterp, maxUInterp, maxVInterp, uvs[3]); - } - // these are only used within the below methods, but are stored here as consts to reduce allocations // because they can be reused infinitely. DO NOT USE OUTSIDE subsect()/transformUVs()!! // filled in first copyUv() calls private static final ThreadLocal uvs = ThreadLocal.withInitial(() -> new Vector2f[4]); + private static final ThreadLocal uvExtremes = ThreadLocal.withInitial(() -> { + 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(() -> { @@ -145,16 +123,20 @@ private static void transformUVs(MutableQuadView quad, ISubmap submap) { // cache UVs Vector2f[] uvs = CTMHelper.uvs.get(); + + Vector2f maxUV = CTMHelper.uvExtremes.get()[0]; + maxUV.set(Float.MIN_VALUE, Float.MIN_VALUE); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); + maxUV.max(uvs[i]); } // scale the quadrants' UVs to the full block range - Vector2f[] minMaxUVs = findMinMaxUVs(uvs); - growQuadrantUVs(uvs, minMaxUVs[1]); + normalizeQuadrantUVs(uvs, maxUV); // recompute min & max UVs - minMaxUVs = findMinMaxUVs(uvs); - Vector2f minUV = minMaxUVs[0], maxUV = minMaxUVs[1]; + Vector2f[] uvExtremes = getUVExtremes(uvs); + Vector2f minUV = uvExtremes[0]; + maxUV = uvExtremes[1]; float width = maxUV.x - minUV.x; float height = maxUV.y - minUV.y; @@ -167,10 +149,10 @@ private static void transformUVs(MutableQuadView quad, ISubmap submap) { float maxU = minU + (width * submap.getWidth()); float maxV = minV + (height * submap.getHeight()); - quad.uv(0, uvs[0].x == minUV.x ? minU : maxU, uvs[0].y == minUV.y ? minV : maxV); - quad.uv(1, uvs[1].x == minUV.x ? minU : maxU, uvs[1].y == minUV.y ? minV : maxV); - quad.uv(2, uvs[2].x == minUV.x ? minU : maxU, uvs[2].y == minUV.y ? minV : maxV); - quad.uv(3, uvs[3].x == minUV.x ? minU : maxU, uvs[3].y == minUV.y ? minV : maxV); + quad.uv(0, uvs[0].x <= minUV.x ? minU : maxU, uvs[0].y <= minUV.y ? minV : maxV); + quad.uv(1, uvs[1].x <= minUV.x ? minU : maxU, uvs[1].y <= minUV.y ? minV : maxV); + quad.uv(2, uvs[2].x <= minUV.x ? minU : maxU, uvs[2].y <= minUV.y ? minV : maxV); + quad.uv(3, uvs[3].x <= minUV.x ? minU : maxU, uvs[3].y <= minUV.y ? minV : maxV); } // TODO simplify, this is quite long @@ -254,10 +236,29 @@ public static MutableQuadView subsect(final MutableQuadView quad, ISubmap submap return quad; } - /// scale {@code value} to a 0-1 range component-wise based on {@code min} and {@code max} - private static Vector2f normalize(float minU, float minV, float maxU, float maxV, Vector2f value) { - value.set(normalize(value.x, minU, maxU), normalize(value.y, minV, maxV)); - return value; + public static Vector2f[] getUVExtremes(Vector2f[] uvs) { + Vector2f[] uvExtremes = CTMHelper.uvExtremes.get(); + uvExtremes[0].set(Float.MAX_VALUE, Float.MAX_VALUE); + uvExtremes[1].set(Float.MIN_VALUE, Float.MIN_VALUE); + + for (int i = 0; i < 4; i++) { + Vector2f vertexUV = uvs[i]; + uvExtremes[0].min(vertexUV); + uvExtremes[1].max(vertexUV); + } + return uvExtremes; + } + + private static void normalizeQuadrantUVs(Vector2f[] uvs, Vector2f maxUV) { + float minU = maxUV.x() - 0.5f > Mth.EPSILON ? 0.5f : 0.0f, + minV = maxUV.y() - 0.5f > Mth.EPSILON ? 0.5f : 0.0f; + float maxU = maxUV.x() - 0.5f > Mth.EPSILON ? 1.0f : 0.5f, + maxV = maxUV.y() - 0.5f > Mth.EPSILON ? 1.0f : 0.5f; + + for (int i = 0; i < 4; i++) { + // scale u,v to a 0-1 range + uvs[i].set(normalize(uvs[i].x, minU, maxU), normalize(uvs[i].y, minV, maxV)); + } } /// scale {@code delta} to a 0-1 range based on {@code min} and {@code max} From 5141557bae8500238442d3b0e61e11e1fd1ad29e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 13:59:05 +0300 Subject: [PATCH 259/269] Remove quad caching; it didn't really do much and has the possibility of breaking things --- .../gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index 7c2af228f87..e0250f6e71c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -16,14 +16,11 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import static com.gregtechceu.gtceu.client.model.GTModelProperties.*; public class CTMBakedModel extends BakedModelWrapper { - private final Map>> sideCache = new EnumMap<>(Direction.class); - public CTMBakedModel(T parent) { super(parent); } @@ -48,9 +45,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction CTMCache ctmCache = CTMCache.getInstance(); ctmCache.fillSubmapCache(level, pos, state, side); - return this.sideCache.computeIfAbsent(side, $ -> new ConcurrentHashMap<>()) - .computeIfAbsent(ctmCache, cache -> CTMHelper.buildCTMQuads(cache, - super.getQuads(state, side, rand, parentModelData, renderType), side)); + return CTMHelper.buildCTMQuads(ctmCache, super.getQuads(state, side, rand, parentModelData, renderType), side); } @Override From bf63e04e15cfa1f3fffdfad98aa8afb4c0cc1d38 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 14:01:09 +0300 Subject: [PATCH 260/269] Add debake method to MutableQuadView --- .../client/model/quad/MutableQuadView.java | 16 ++++++++++++ .../gtceu/client/util/TextureHelper.java | 18 +++++++++++++ .../gtceu/client/util/quad/CTMHelper.java | 26 +------------------ 3 files changed, 35 insertions(+), 25 deletions(-) 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 ff414ce72a4..828720357f5 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 @@ -81,6 +81,12 @@ 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 @@ -238,6 +244,16 @@ public MutableQuadView spriteBake(@Nullable TextureAtlasSprite sprite, int bakeF return this; } + /** + * Normalizes this quad's u,v coordinates based on the given sprite. + * Can handle UV rotation, interpolation, etc. + * Control this behavior by passing additive combinations of the BAKE_ flags defined in this interface. + */ + public MutableQuadView spriteUnbake(@Nullable TextureAtlasSprite sprite, int bakeFlags) { + TextureHelper.unbakeSprite(this, sprite, bakeFlags); + return this; + } + /** * Accept vanilla lightmap values. * Input values will override lightmap values computed from world state if input values are higher. 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 faf745ffae9..facecba1cfb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/TextureHelper.java @@ -144,6 +144,10 @@ public static void unbakeSprite(MutableQuadView quad, @Nullable TextureAtlasSpri // 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) { + // Cycles texture coordinates so that vertex 0's UVs are the smallest + derotateUV(quad); + } } /** @@ -161,6 +165,20 @@ public static void deInterpolate(MutableQuadView q, TextureAtlasSprite sprite) { } } + private static void derotateUV(MutableQuadView quad) { + int minIndex = 0; + float minU = Float.MAX_VALUE, minV = Float.MAX_VALUE; + + for (int i = 0; i < 4; i++) { + if (quad.u(i) <= minU && quad.v(i) <= minV) { + minIndex = i; + minU = quad.u(i); + minV = quad.v(i); + } + } + applyModifier(quad, ROTATIONS[minIndex]); + } + @FunctionalInterface public interface VertexModifier { diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index 60d8c9c61ba..76d2cb483b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.client.model.ctm.Submap; import com.gregtechceu.gtceu.client.model.quad.MeshBuilder; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; -import com.gregtechceu.gtceu.client.util.TextureHelper; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -59,10 +58,9 @@ public static List buildCTMQuads(CTMCache cachedConnections, List buildCTMQuads(CTMCache cachedConnections, List Date: Thu, 7 May 2026 14:02:20 +0300 Subject: [PATCH 261/269] more checks; clearer names --- .../gtceu/client/model/ctm/CTMCache.java | 4 ---- .../gtceu/client/util/quad/CTMHelper.java | 16 +++++++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java index 72b71e536b7..7da2d4a602f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMCache.java @@ -154,10 +154,6 @@ public Vector2ic[][] getCachedSubmapIndices() { return this.submapCache; } - public static boolean isDefaultTexture(int id) { - return (id == 16 || id == 17 || id == 18 || id == 19); - } - public static boolean isDefaultTexture(Vector2ic id) { return id.x() >= 4 && id.y() >= 4; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java index 76d2cb483b0..884bd4c164d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java @@ -50,19 +50,19 @@ public static List buildCTMQuads(CTMCache cachedConnections, List buildCTMQuads(CTMCache cachedConnections, List Date: Thu, 7 May 2026 14:02:58 +0300 Subject: [PATCH 262/269] client.util.quad.CTMHelper -> client.model.ctm.CTMMeshBuilder --- .../gtceu/client/model/ctm/CTMBakedModel.java | 4 +--- .../ctm/CTMMeshBuilder.java} | 19 ++++++++----------- .../client/model/machine/MachineModel.java | 4 ++-- 3 files changed, 11 insertions(+), 16 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/{util/quad/CTMHelper.java => model/ctm/CTMMeshBuilder.java} (95%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index e0250f6e71c..5646ecffabb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.client.util.quad.CTMHelper; - import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -45,7 +43,7 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction CTMCache ctmCache = CTMCache.getInstance(); ctmCache.fillSubmapCache(level, pos, state, side); - return CTMHelper.buildCTMQuads(ctmCache, super.getQuads(state, side, rand, parentModelData, renderType), side); + return CTMMeshBuilder.buildCTMQuads(ctmCache, super.getQuads(state, side, rand, parentModelData, renderType), side); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java similarity index 95% rename from src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java rename to src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java index 884bd4c164d..00422b495d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/util/quad/CTMHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMMeshBuilder.java @@ -1,8 +1,5 @@ -package com.gregtechceu.gtceu.client.util.quad; +package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.client.model.ctm.CTMCache; -import com.gregtechceu.gtceu.client.model.ctm.ISubmap; -import com.gregtechceu.gtceu.client.model.ctm.Submap; import com.gregtechceu.gtceu.client.model.quad.MeshBuilder; import com.gregtechceu.gtceu.client.model.quad.MutableQuadView; @@ -24,7 +21,7 @@ import static com.gregtechceu.gtceu.client.model.quad.MutableQuadView.*; import static com.gregtechceu.gtceu.client.util.ModelEventHelper.*; -public class CTMHelper { +public class CTMMeshBuilder { public static List buildCTMQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, List quads, Direction cullFace) { @@ -98,9 +95,9 @@ private static void normalizeQuadrantUVs(MutableQuadView quad, ISubmap submap) { submap = submap.unitScale(); // cache UVs - Vector2f[] uvs = CTMHelper.uvs.get(); + Vector2f[] uvs = CTMMeshBuilder.uvs.get(); - Vector2f maxUV = CTMHelper.uvExtremes.get()[0]; + Vector2f maxUV = CTMMeshBuilder.uvExtremes.get()[0]; maxUV.set(Float.MIN_VALUE, Float.MIN_VALUE); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); @@ -137,9 +134,9 @@ public static MutableQuadView subsect(final MutableQuadView quad, ISubmap submap // nominalFace should never be null here; MutableQuadView.fromVanilla updates it assert normal != null; - Vector2f[] xy = CTMHelper.xy.get(); - Vector2f[] newXy = CTMHelper.newXy.get(); - Vector3f position = CTMHelper.position.get(); + 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); @@ -215,7 +212,7 @@ public static MutableQuadView subsect(final MutableQuadView quad, ISubmap submap } public static Vector2f[] getUVExtremes(Vector2f[] uvs) { - Vector2f[] uvExtremes = CTMHelper.uvExtremes.get(); + Vector2f[] uvExtremes = CTMMeshBuilder.uvExtremes.get(); uvExtremes[0].set(Float.MAX_VALUE, Float.MAX_VALUE); uvExtremes[1].set(Float.MIN_VALUE, Float.MIN_VALUE); 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 c69f80e0e4d..278a4b77a1c 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 @@ -15,7 +15,7 @@ import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.util.RenderUtil; -import com.gregtechceu.gtceu.client.util.quad.CTMHelper; +import com.gregtechceu.gtceu.client.model.ctm.CTMMeshBuilder; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.utils.GTUtil; @@ -320,7 +320,7 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl // we have to recalculate CTM ourselves. // this is the slowest part by a long shot because the LDLib quad logic isn't very optimized. if (level != null && pos != null && blockState != null && side != null) { - return CTMHelper.buildCTMQuads(level, pos, blockState, quads, side); + return CTMMeshBuilder.buildCTMQuads(level, pos, blockState, quads, side); } return quads; } From 65943aebf2b8c87d61abc66e0729957b6086ff2c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 17:31:33 +0300 Subject: [PATCH 263/269] Rename CTMCache -> TextureConnections --- .../gtceu/client/model/ctm/CTMBakedModel.java | 6 +++--- .../gtceu/client/model/ctm/CTMMeshBuilder.java | 16 +++++++--------- .../gtceu/client/model/ctm/ConnectionCheck.java | 2 +- .../{CTMCache.java => TextureConnections.java} | 13 +++++++------ 4 files changed, 18 insertions(+), 19 deletions(-) rename src/main/java/com/gregtechceu/gtceu/client/model/ctm/{CTMCache.java => TextureConnections.java} (96%) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index 5646ecffabb..57cb8fb77b4 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -41,9 +41,9 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction return super.getQuads(state, side, rand, parentModelData, renderType); } - CTMCache ctmCache = CTMCache.getInstance(); - ctmCache.fillSubmapCache(level, pos, state, side); - return CTMMeshBuilder.buildCTMQuads(ctmCache, super.getQuads(state, side, rand, parentModelData, renderType), side); + TextureConnections connections = TextureConnections.getInstance(); + connections.fillSubmapCache(level, pos, state, side); + return CTMMeshBuilder.buildCTMQuads(connections, super.getQuads(state, side, rand, parentModelData, renderType), side); } @Override 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 00422b495d5..2172ce558f3 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 @@ -25,15 +25,13 @@ public class CTMMeshBuilder { public static List buildCTMQuads(BlockAndTintGetter level, BlockPos pos, BlockState state, List quads, Direction cullFace) { - CTMCache ctmCache = CTMCache.getInstance(); - if (cullFace != null) { - ctmCache.fillSubmapCache(level, pos, state, cullFace); - } + TextureConnections connections = TextureConnections.getInstance(); + connections.fillSubmapCache(level, pos, state, cullFace); - return buildCTMQuads(ctmCache, quads, cullFace); + return buildCTMQuads(connections, quads, cullFace); } - public static List buildCTMQuads(CTMCache cachedConnections, List base, Direction cullFace) { + public static List buildCTMQuads(TextureConnections connections, List base, Direction cullFace) { List result = new LinkedList<>(); MeshBuilder meshBuilder = MeshBuilder.getInstance(); var emitter = meshBuilder.getEmitter(); @@ -47,11 +45,11 @@ public static List buildCTMQuads(CTMCache cachedConnections, List buildCTMQuads(CTMCache cachedConnections, List Date: Thu, 7 May 2026 17:32:52 +0300 Subject: [PATCH 264/269] More util methods --- .../gtceu/client/model/ctm/CTMMeshBuilder.java | 6 ++---- .../gtceu/client/model/ctm/TextureConnections.java | 12 ++++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) 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 2172ce558f3..22fca72f6a7 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 @@ -45,11 +45,9 @@ public static List buildCTMQuads(TextureConnections connections, List continue; } - Vector2ic[][] submapIndices = connections.getCachedSubmapIndices(); - for (int xQuadrant = 0; xQuadrant < 2; xQuadrant++) { for (int yQuadrant = 0; yQuadrant < 2; yQuadrant++) { - boolean defaultTexture = TextureConnections.isDefaultTexture(submapIndices[xQuadrant][yQuadrant]); + boolean defaultTexture = connections.isDefaultTexture(xQuadrant, yQuadrant); TextureAtlasSprite ctmSprite = defaultTexture ? originalSprite : connectionSprite; emitter.fromVanilla(originalQuad, cullFace); @@ -57,7 +55,7 @@ public static List buildCTMQuads(TextureConnections connections, List // slice quad into the current quadrant subsect(emitter, Submap.X2[xQuadrant][yQuadrant]); - normalizeQuadrantUVs(emitter, TextureConnections.getSubmapFor(submapIndices[xQuadrant][yQuadrant])); + normalizeQuadrantUVs(emitter, connections.getSubmapFor(xQuadrant, yQuadrant)); emitter.spriteBake(ctmSprite, BAKE_NORMALIZED); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java index 6252ca06870..64c2e2a0912 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java @@ -155,10 +155,22 @@ public Vector2ic[][] getCachedSubmapIndices() { return this.submapCache; } + public Vector2ic getSubmapCoordinatesFor(int quadrantX, int quadrantY) { + return this.submapCache[quadrantX][quadrantY]; + } + + public boolean isDefaultTexture(int quadrantX, int quadrantY) { + return isDefaultTexture(getSubmapCoordinatesFor(quadrantX, quadrantY)); + } + public static boolean isDefaultTexture(Vector2ic id) { return id.x() >= 4 && id.y() >= 4; } + public ISubmap getSubmapFor(int quadrantX, int quadrantY) { + return getSubmapFor(getSubmapCoordinatesFor(quadrantX, quadrantY)); + } + public static ISubmap getSubmapFor(Vector2ic coordinates) { if (isDefaultTexture(coordinates)) { return Submap.X2[coordinates.x() % 4][coordinates.y() % 4]; From a11439a35765cc173c401f58a51c03d858a2cf3b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 17:37:45 +0300 Subject: [PATCH 265/269] make ConnectionCheck a static utility class; we don't allow using custom state comparators so having instances of it around did nothing except waste RAM. --- .../client/model/ctm/ConnectionCheck.java | 54 ++++--------------- .../model/ctm/OctagonalOrientation.java | 11 ++-- .../client/model/ctm/TextureConnections.java | 14 +---- 3 files changed, 14 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java index 276814c9001..7a13f8e8f22 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java @@ -17,44 +17,22 @@ */ package com.gregtechceu.gtceu.client.model.ctm; -import com.gregtechceu.gtceu.client.model.ctm.TextureConnections.StateComparisonCallback; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import com.mojang.serialization.Codec; -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.Accessors; +import lombok.experimental.UtilityClass; import org.jetbrains.annotations.Nullable; /** * Sourced from ConnectedTexturesMod. + * "https://github.com/Chisel-Team/ConnectedTexturesMod/blob/19a58b080ff2d4fec4fd44ffdb426fc078ce853d/src/main/java/team/chisel/ctm/client/newctm/ConnectionCheck.java">ConnectedTexturesMod + * with considerable simplification. */ -@NoArgsConstructor -@AllArgsConstructor -@Accessors(fluent = true, chain = true) +@UtilityClass public class ConnectionCheck { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( - Codec.BOOL.optionalFieldOf("ignore_states", false).forGetter(ConnectionCheck::ignoreStates)) - .apply(instance, ignoredStates -> new ConnectionCheck().ignoreStates(ignoredStates))); - - @Getter - @Setter - protected boolean ignoreStates; - - @Getter - @Setter - protected StateComparisonCallback stateComparator = StateComparisonCallback.DEFAULT; - /** * A simple check for if the given block can connect to the given direction on the given side. * @@ -66,7 +44,7 @@ public class ConnectionCheck { * This is not the direction to check in. * @return True if the given block can connect to the given location on the given side. */ - public final boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, + public static boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, BlockPos connection, Direction dir) { BlockState state = getConnectionState(level, current, currentState, dir, connection, level.getBlockState(connection)); @@ -84,8 +62,7 @@ public final boolean isConnected(BlockAndTintGetter level, BlockPos current, Blo * @param state The state to check against for connection. * @return True if the given block can connect to the given location on the given side. */ - @SuppressWarnings({ "unused", "null" }) - public boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, BlockPos connection, + public static boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, BlockPos connection, Direction dir, BlockState state) { BlockState connectionState = getConnectionState(level, connection, level.getBlockState(connection), dir, current, currentState); @@ -93,24 +70,11 @@ public boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockStat BlockState obscuring = getConnectionState(level, obscuringPos, level.getBlockState(obscuringPos), dir, current, currentState); - boolean ret = stateComparator(state, connectionState, dir); - - // check that we aren't already connected outwards from this side - ret &= !stateComparator(state, obscuring, dir); - - return ret; - } - - public boolean stateComparator(BlockState from, BlockState to, Direction dir) { - return stateComparator.connects(this, from, to, dir); - } - - public BlockState getConnectionState(BlockAndTintGetter level, BlockPos pos, @Nullable Direction side, - BlockPos connection, BlockState connectionState) { - return getConnectionState(level, pos, level.getBlockState(pos), side, connection, connectionState); + // check that we are connected AND aren't already connected outwards from this side + return state == connectionState && state != obscuring; } - public BlockState getConnectionState(BlockAndTintGetter level, BlockPos pos, BlockState state, + public static BlockState getConnectionState(BlockAndTintGetter level, BlockPos pos, BlockState state, @Nullable Direction side, BlockPos connection, BlockState connectionState) { if (side != null) { return state.getAppearance(level, pos, side, connectionState, connection); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java index eae8c487e6f..ca8c0b4d925 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/OctagonalOrientation.java @@ -115,22 +115,19 @@ private void buildCaches() { /** * Finds if this block is connected for the given side in this OctagonalOrientation. * - * @param ctm The ConnectionCheck instance to use for logic. * @param level The level the block is in. * @param pos The position of your block. * @param state The state of your block. * @param side The side of the current face. * @return True if the block is connected in the given OctagonalOrientation, false otherwise. */ - public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, - Direction side) { - return ctm.isConnected(level, pos, state, applyConnection(pos, side), side); + public boolean isConnected(BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side) { + return ConnectionCheck.isConnected(level, pos, state, applyConnection(pos, side), side); } /** * Finds if this block is connected for the given side in this OctagonalOrientation. * - * @param ctm The ConnectionCheck instance to use for logic. * @param level The level the block is in. * @param pos The position of your block. * @param state The state of your block. @@ -138,9 +135,9 @@ public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockP * @param connectionState The state to check for connection with. * @return True if the block is connected in the given OctagonalOrientation, false otherwise. */ - public boolean isConnected(ConnectionCheck ctm, BlockAndTintGetter level, BlockPos pos, BlockState state, + public boolean isConnected(BlockAndTintGetter level, BlockPos pos, BlockState state, Direction side, BlockState connectionState) { - return ctm.isConnected(level, pos, state, applyConnection(pos, side), side, connectionState); + return ConnectionCheck.isConnected(level, pos, state, applyConnection(pos, side), side, connectionState); } /** diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java index 64c2e2a0912..1e717a3bb3c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/TextureConnections.java @@ -88,16 +88,6 @@ @Accessors(fluent = true, chain = true) public class TextureConnections { - @FunctionalInterface - public interface StateComparisonCallback { - - StateComparisonCallback DEFAULT = (connectionCheck, from, to, dir) -> { - return connectionCheck.ignoreStates() ? from.getBlock() == to.getBlock() : from == to; - }; - - boolean connects(ConnectionCheck instance, BlockState from, BlockState to, Direction dir); - } - /** Hardcoded offset values for the different submap indices */ // store the full table(s) to reduce non-required allocations protected static final Vector2ic[][] submapOffsets = { @@ -111,8 +101,6 @@ public interface StateComparisonCallback { { new Vector2i(5, 4), new Vector2i(5, 5), }, }; - public ConnectionCheck connectionCheck = new ConnectionCheck(); - // spotless:off // Mapping the different corner indices to their respective dirs protected static final OctagonalOrientation[][][] submapMap = { @@ -203,7 +191,7 @@ public void buildConnectionMap(BlockAndTintGetter world, BlockPos pos, BlockStat // Note: We can't cache the state that we are checking about connection for as we want to ensure that // we can take into account the side of the block we want to know the "state" of as if the block is // a facade of some sort it might return different results based on where it is being queried from - setConnectedState(dir, dir.isConnected(this.connectionCheck, world, pos, state, side)); + setConnectedState(dir, dir.isConnected(world, pos, state, side)); } } From 79bf7e228845c367b6534427fd8dcea0a0bfc3ba Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 17:38:03 +0300 Subject: [PATCH 266/269] Remove extra `@Nullable` IntelliJ didn't like --- src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java index d0cf73b0cd1..b1722d9620b 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/ArrayHelpers.java @@ -20,8 +20,8 @@ public class ArrayHelpers { * @return a copy of the specified array object, deeply copying multidimensional arrays, or null if the object is * null */ - @Contract(value = "!null -> !null; null -> null", pure = true) - public static @Nullable T @Nullable [] deepCopy(@Nullable T @Nullable [] array) { + @Contract(value = "!null -> !null; _ -> null", pure = true) + public static T @Nullable [] deepCopy(T @Nullable [] array) { if (array == null) { return null; } From 4d16858dd865f54c7eb0396aec9dad7fe89d6d60 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 18:10:10 +0300 Subject: [PATCH 267/269] rename functions --- .../gtceu/client/model/ctm/CTMMeshBuilder.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) 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 22fca72f6a7..53e3d11b8c7 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.Vector2ic; import org.joml.Vector3f; import java.util.LinkedList; @@ -55,7 +54,7 @@ public static List buildCTMQuads(TextureConnections connections, List // slice quad into the current quadrant subsect(emitter, Submap.X2[xQuadrant][yQuadrant]); - normalizeQuadrantUVs(emitter, connections.getSubmapFor(xQuadrant, yQuadrant)); + remapUVs(emitter, connections.getSubmapFor(xQuadrant, yQuadrant)); emitter.spriteBake(ctmSprite, BAKE_NORMALIZED); @@ -87,20 +86,20 @@ public static List buildCTMQuads(TextureConnections connections, List return new Vector2f[] { new Vector2f(), new Vector2f(), new Vector2f(), new Vector2f() }; }); - private static void normalizeQuadrantUVs(MutableQuadView quad, ISubmap submap) { + private static void remapUVs(MutableQuadView quad, ISubmap submap) { submap = submap.unitScale(); - // cache UVs - Vector2f[] uvs = CTMMeshBuilder.uvs.get(); - Vector2f maxUV = CTMMeshBuilder.uvExtremes.get()[0]; maxUV.set(Float.MIN_VALUE, Float.MIN_VALUE); + + // cache UVs + Vector2f[] uvs = CTMMeshBuilder.uvs.get(); for (int i = 0; i < 4; i++) { uvs[i] = quad.copyUv(i, uvs[i]); maxUV.max(uvs[i]); } - // scale the quadrants' UVs to the full block range - normalizeQuadrantUVs(uvs, maxUV); + // scale the quadrants' UVs to the quadrant's area + scaleUVCoordinatesToQuadrant(uvs, maxUV); // recompute min & max UVs Vector2f[] uvExtremes = getUVExtremes(uvs); @@ -220,7 +219,7 @@ public static Vector2f[] getUVExtremes(Vector2f[] uvs) { return uvExtremes; } - private static void normalizeQuadrantUVs(Vector2f[] uvs, Vector2f maxUV) { + private static void scaleUVCoordinatesToQuadrant(Vector2f[] uvs, Vector2f maxUV) { float minU = maxUV.x() - 0.5f > Mth.EPSILON ? 0.5f : 0.0f, minV = maxUV.y() - 0.5f > Mth.EPSILON ? 0.5f : 0.0f; float maxU = maxUV.x() - 0.5f > Mth.EPSILON ? 1.0f : 0.5f, From dbbfa56bae7e0bd7b8483dd45c9b0880625cdd75 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 18:10:59 +0300 Subject: [PATCH 268/269] Spotless --- .../gtceu/client/model/ctm/CTMBakedModel.java | 3 ++- .../gtceu/client/model/ctm/CTMMeshBuilder.java | 3 ++- .../gtceu/client/model/ctm/ConnectionCheck.java | 10 ++++++---- .../gtceu/client/model/machine/MachineModel.java | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java index 57cb8fb77b4..9cf0d70302a 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/CTMBakedModel.java @@ -43,7 +43,8 @@ public List getQuads(@Nullable BlockState state, @Nullable Direction TextureConnections connections = TextureConnections.getInstance(); connections.fillSubmapCache(level, pos, state, side); - return CTMMeshBuilder.buildCTMQuads(connections, super.getQuads(state, side, rand, parentModelData, renderType), side); + return CTMMeshBuilder.buildCTMQuads(connections, super.getQuads(state, side, rand, parentModelData, renderType), + side); } @Override 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 53e3d11b8c7..cf0f19c3656 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 @@ -30,7 +30,8 @@ public static List buildCTMQuads(BlockAndTintGetter level, BlockPos p return buildCTMQuads(connections, quads, cullFace); } - public static List buildCTMQuads(TextureConnections connections, List base, Direction cullFace) { + public static List buildCTMQuads(TextureConnections connections, List base, + Direction cullFace) { List result = new LinkedList<>(); MeshBuilder meshBuilder = MeshBuilder.getInstance(); var emitter = meshBuilder.getEmitter(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java index 7a13f8e8f22..33724843038 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/ctm/ConnectionCheck.java @@ -45,7 +45,7 @@ public class ConnectionCheck { * @return True if the given block can connect to the given location on the given side. */ public static boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, - BlockPos connection, Direction dir) { + BlockPos connection, Direction dir) { BlockState state = getConnectionState(level, current, currentState, dir, connection, level.getBlockState(connection)); return isConnected(level, current, currentState, connection, dir, state); @@ -62,8 +62,9 @@ public static boolean isConnected(BlockAndTintGetter level, BlockPos current, Bl * @param state The state to check against for connection. * @return True if the given block can connect to the given location on the given side. */ - public static boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, BlockPos connection, - Direction dir, BlockState state) { + public static boolean isConnected(BlockAndTintGetter level, BlockPos current, BlockState currentState, + BlockPos connection, + Direction dir, BlockState state) { BlockState connectionState = getConnectionState(level, connection, level.getBlockState(connection), dir, current, currentState); BlockPos obscuringPos = connection.relative(dir); @@ -75,7 +76,8 @@ public static boolean isConnected(BlockAndTintGetter level, BlockPos current, Bl } public static BlockState getConnectionState(BlockAndTintGetter level, BlockPos pos, BlockState state, - @Nullable Direction side, BlockPos connection, BlockState connectionState) { + @Nullable Direction side, BlockPos connection, + BlockState connectionState) { if (side != null) { return state.getAppearance(level, pos, side, connectionState, connection); } 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 278a4b77a1c..e580ab23c2d 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 @@ -10,12 +10,12 @@ import com.gregtechceu.gtceu.client.model.GTModelProperties; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; +import com.gregtechceu.gtceu.client.model.ctm.CTMMeshBuilder; import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartBakedModel; import com.gregtechceu.gtceu.client.model.quad.StaticFaceBakery; import com.gregtechceu.gtceu.client.renderer.cover.ICoverableRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.client.util.RenderUtil; -import com.gregtechceu.gtceu.client.model.ctm.CTMMeshBuilder; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.utils.GTUtil; From e71eafdca593c0f74365799027c65676be18f89b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 7 May 2026 18:21:14 +0300 Subject: [PATCH 269/269] Fix light gray lamps' connections --- .../gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta | 2 +- .../assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta index 756b9920894..52d15b67196 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_bloom.png.mcmeta @@ -1,6 +1,6 @@ { "gtceu": { - "connection_texture": "gtceu:block/lamps/light_gray_ctm_emissive", + "connection_texture": "gtceu:block/lamps/light_gray_bloom_ctm", "bloom": true } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta index 6bb38120805..f8cdf3acb09 100644 --- a/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/block/lamps/light_gray_on.png.mcmeta @@ -1,6 +1,6 @@ { "gtceu": { - "connection_texture": "gtceu:block/lamps/light_gray_ctm", + "connection_texture": "gtceu:block/lamps/light_gray_on_ctm", "bloom": false } } \ No newline at end of file