From aa88fb70f1eb106a22c877c2d2b92cf3721cdb99 Mon Sep 17 00:00:00 2001 From: shartte Date: Tue, 13 Oct 2020 12:48:30 +0200 Subject: [PATCH] Fixes #4687: Translucent rendering inside of chunk baking is currently unsupported, hence we switch to a fixed baked model for the facade outline. (#4750) --- .../render/cablebus/CableBusBakedModel.java | 5 +- .../client/render/cablebus/CableBusModel.java | 15 ++++- .../client/render/cablebus/FacadeBuilder.java | 43 +++++++++++-- .../crafting/MolecularAssemblerRenderer.java | 3 +- .../models/part/cable_facade.json | 39 ------------ .../models/part/translucent_facade.json | 58 ++++++++++++++++++ .../textures/part/translucent_facade.png | Bin 0 -> 126 bytes 7 files changed, 114 insertions(+), 49 deletions(-) delete mode 100644 src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/translucent_facade.json create mode 100644 src/main/resources/assets/appliedenergistics2/textures/part/translucent_facade.png diff --git a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java index 011fd6c34..c8a5e14ce 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusBakedModel.java @@ -142,6 +142,7 @@ public class CableBusBakedModel implements IBakedModel { } } } + this.facadeBuilder.buildFacadeQuads(layer, renderState, rand, quads, this.partModels::get); return quads; @@ -327,12 +328,12 @@ public class CableBusBakedModel implements IBakedModel { @Override public boolean isGui3d() { - return false; + return false; // This model is never used in an UI } @Override public boolean isSideLit() { - return false;// TODO + return false; // This model is never used in an UI } @Override diff --git a/src/main/java/appeng/client/render/cablebus/CableBusModel.java b/src/main/java/appeng/client/render/cablebus/CableBusModel.java index 77ffad447..30869e812 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusModel.java @@ -18,7 +18,9 @@ package appeng.client.render.cablebus; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; @@ -37,6 +39,7 @@ import net.minecraftforge.client.model.IModelConfiguration; import appeng.api.util.AEColor; import appeng.client.render.BasicUnbakedModel; import appeng.core.AELog; +import appeng.core.AppEng; import appeng.core.features.registries.PartModels; /** @@ -44,6 +47,8 @@ import appeng.core.features.registries.PartModels; */ public class CableBusModel implements BasicUnbakedModel { + public static final ResourceLocation TRANSLUCENT_FACADE_MODEL = AppEng.makeId("part/translucent_facade"); + private final PartModels partModels; public CableBusModel(PartModels partModels) { @@ -53,7 +58,9 @@ public class CableBusModel implements BasicUnbakedModel { @Override public Collection getModelDependencies() { partModels.setInitialized(true); - return partModels.getModels(); + List models = new ArrayList<>(partModels.getModels()); + models.add(TRANSLUCENT_FACADE_MODEL); + return models; } @Override @@ -68,7 +75,11 @@ public class CableBusModel implements BasicUnbakedModel { Map partModels = this.loadPartModels(bakery, spriteGetter, modelTransform); CableBuilder cableBuilder = new CableBuilder(spriteGetter); - FacadeBuilder facadeBuilder = new FacadeBuilder(); + + IBakedModel translucentFacadeModel = bakery.getBakedModel(TRANSLUCENT_FACADE_MODEL, modelTransform, + spriteGetter); + + FacadeBuilder facadeBuilder = new FacadeBuilder(translucentFacadeModel); // This should normally not be used, but we *have* to provide a particle texture // or otherwise damage models will diff --git a/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java b/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java index c3f39aaec..19d03f88f 100644 --- a/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java +++ b/src/main/java/appeng/client/render/cablebus/FacadeBuilder.java @@ -20,6 +20,7 @@ package appeng.client.render.cablebus; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -29,6 +30,8 @@ import java.util.function.Function; import javax.annotation.Nullable; +import com.google.common.collect.ImmutableList; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockRendererDispatcher; @@ -88,6 +91,9 @@ public class FacadeBuilder { new AxisAlignedBB(0.0, 0.0, 0.0, THIN_THICKNESS, 1.0, 1.0), new AxisAlignedBB(1.0 - THIN_THICKNESS, 0.0, 0.0, 1.0, 1.0, 1.0) }; + // Pre-rotated transparent facade quads + private final Map> transparentFacadeQuads; + private final ThreadLocal pipelines = ThreadLocal.withInitial(() -> BakedPipeline.builder() // Clamper is responsible for clamping the vertex to the bounds specified. .addElement("clamper", QuadClamper.FACTORY) @@ -104,6 +110,29 @@ public class FacadeBuilder { ); private final ThreadLocal collectors = ThreadLocal.withInitial(Quad::new); + public FacadeBuilder() { + // This constructor is used for item models where transparent facades are not a + // concern + this.transparentFacadeQuads = new EnumMap<>(Direction.class); + for (Direction facing : Direction.values()) { + this.transparentFacadeQuads.put(facing, Collections.emptyList()); + } + } + + public FacadeBuilder(IBakedModel transparentFacadeModel) { + // Pre-rotate the transparent facade model to all possible sides so that we can + // add it quicker later + List partQuads = transparentFacadeModel.getQuads(null, null, new Random(), EmptyModelData.INSTANCE); + this.transparentFacadeQuads = new EnumMap<>(Direction.class); + + for (Direction facing : Direction.values()) { + // Rotate quads accordingly + QuadRotator rotator = new QuadRotator(); + List rotated = rotator.rotateQuads(partQuads, facing, Direction.UP); + this.transparentFacadeQuads.put(facing, ImmutableList.copyOf(rotated)); + } + } + public void buildFacadeQuads(RenderType layer, CableBusRenderState renderState, Random rand, List quads, Function modelLookup) { BakedPipeline pipeline = this.pipelines.get(); @@ -130,14 +159,20 @@ public class FacadeBuilder { Direction.UP)); } } - // If we are forcing transparency and this isn't the Translucent layer. - if (transparent && layer != RenderType.getTranslucent()) { + + // When we're forcing transparent facades, add a "border" model that indicates + // where the facade is, + // But otherwise skip the rest. + if (transparent) { + if (layer != RenderType.getCutout()) { + quads.addAll(transparentFacadeQuads.get(side)); + } continue; } BlockState blockState = facadeRenderState.getSourceBlock(); // If we aren't forcing transparency let the block decide if it should render. - if (!transparent && layer != null) { + if (layer != null) { if (!RenderTypeLookup.canRenderInLayer(blockState, layer)) { continue; } @@ -198,7 +233,7 @@ public class FacadeBuilder { List modelQuads = new ArrayList<>(); // If we are forcing transparent facades, fake the render layer, and grab all // quads. - if (transparent || layer == null) { + if (layer == null) { for (RenderType forcedLayer : RenderType.getBlockRenderTypes()) { // Check if the block renders on the layer we want to force. if (RenderTypeLookup.canRenderInLayer(blockState, forcedLayer)) { diff --git a/src/main/java/appeng/tile/crafting/MolecularAssemblerRenderer.java b/src/main/java/appeng/tile/crafting/MolecularAssemblerRenderer.java index 9701b542a..da38f9886 100644 --- a/src/main/java/appeng/tile/crafting/MolecularAssemblerRenderer.java +++ b/src/main/java/appeng/tile/crafting/MolecularAssemblerRenderer.java @@ -55,8 +55,7 @@ import appeng.core.AppEng; @OnlyIn(Dist.CLIENT) public class MolecularAssemblerRenderer extends TileEntityRenderer { - public static final ResourceLocation LIGHTS_MODEL = new ResourceLocation(AppEng.MOD_ID, - "block/molecular_assembler_lights"); + public static final ResourceLocation LIGHTS_MODEL = AppEng.makeId("block/molecular_assembler_lights"); private static final RenderType MC_161917_RENDERTYPE_FIX = createRenderType(); diff --git a/src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json b/src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json deleted file mode 100644 index 426ac0d71..000000000 --- a/src/main/resources/assets/appliedenergistics2/models/part/cable_facade.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "textures": { - "0": "appliedenergistics2:part/cable_anchor", - "particle": "appliedenergistics2:part/cable_anchor" - }, - "elements": [ - { - "name": "Element", - "from": [7.0, 7.0, 1.0], - "to": [9.0, 9.0, 6.0], - "faces": { - "north": { - "texture": "#0", - "uv": [0.0, 0.0, 2.0, 2.0] - }, - "east": { - "texture": "#0", - "uv": [0.0, 0.0, 5.0, 2.0] - }, - "south": { - "texture": "#0", - "uv": [0.0, 0.0, 2.0, 2.0] - }, - "west": { - "texture": "#0", - "uv": [0.0, 0.0, 5.0, 2.0] - }, - "up": { - "texture": "#0", - "uv": [0.0, 0.0, 2.0, 5.0] - }, - "down": { - "texture": "#0", - "uv": [0.0, 0.0, 2.0, 5.0] - } - } - } - ] -} diff --git a/src/main/resources/assets/appliedenergistics2/models/part/translucent_facade.json b/src/main/resources/assets/appliedenergistics2/models/part/translucent_facade.json new file mode 100644 index 000000000..def4557b6 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/translucent_facade.json @@ -0,0 +1,58 @@ +{ + "textures": { + "facade": "appliedenergistics2:part/translucent_facade" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 0.25, 0.25], + "faces": { + "north": { "uv": [0, 15.75, 16, 16], "texture": "#facade" }, + "east": { "uv": [15.75, 15.75, 16, 16], "texture": "#facade" }, + "south": { "uv": [0, 15.75, 16, 16], "texture": "#facade" }, + "west": { "uv": [0, 15.75, 1, 16], "texture": "#facade" }, + "up": { "uv": [0, 0, 16, 1], "texture": "#facade" }, + "down": { "uv": [0, 15.75, 16, 16], "texture": "#facade" } + } + }, + { + "from": [0, 15.75, 0], + "to": [16, 16, 0.25], + "rotation": { "angle": 0, "axis": "y", "origin": [8, 23, 8] }, + "faces": { + "north": { "uv": [0, 0, 16, 1], "texture": "#facade" }, + "east": { "uv": [15.75, 0, 16, 1], "texture": "#facade" }, + "south": { "uv": [0, 0, 16, 1], "texture": "#facade" }, + "west": { "uv": [0, 0, 1, 1], "texture": "#facade" }, + "up": { "uv": [0, 0, 16, 1], "texture": "#facade" }, + "down": { "uv": [0, 15.75, 16, 16], "texture": "#facade" } + } + }, + { + "from": [0, 0.25, 0], + "to": [0.25, 15.75, 0.25], + "rotation": { "angle": 0, "axis": "y", "origin": [8, 23, 8] }, + "faces": { + "north": { "uv": [15.75, 1, 16, 15.75], "texture": "#facade" }, + "east": { "uv": [15.75, 1, 16, 15.75], "texture": "#facade" }, + "south": { "uv": [0, 1, 1, 15.75], "texture": "#facade" }, + "west": { "uv": [0, 1, 1, 15.75], "texture": "#facade" }, + "up": { "uv": [0, 0, 1, 1], "texture": "#facade" }, + "down": { "uv": [0, 15.75, 1, 16], "texture": "#facade" } + } + }, + { + "from": [15.75, 0.25, 0], + "to": [16, 15.75, 0.25], + "rotation": { "angle": 0, "axis": "y", "origin": [23, 23, 8] }, + "faces": { + "north": { "uv": [0, 1, 1, 15.75], "texture": "#facade" }, + "east": { "uv": [15.75, 1, 16, 15.75], "texture": "#facade" }, + "south": { "uv": [15.75, 1, 16, 15.75], "texture": "#facade" }, + "west": { "uv": [0, 1, 1, 15.75], "texture": "#facade" }, + "up": { "uv": [15.75, 0, 16, 1], "texture": "#facade" }, + "down": { "uv": [15.75, 15.75, 16, 16], "texture": "#facade" } + } + } + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/textures/part/translucent_facade.png b/src/main/resources/assets/appliedenergistics2/textures/part/translucent_facade.png new file mode 100644 index 0000000000000000000000000000000000000000..33b2e2f9ca9907c159c1b3b4b8d80d6f5558d47a GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7I14-?iy0X7ltGxWVyS%@ z0|SGBr;B5V#p&cf|NsB5XX9evW@ct~PEJ-