diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayerUtil.java b/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayerUtil.java index b230e769..1539a9ea 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayerUtil.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/RenderLayerUtil.java @@ -1,14 +1,38 @@ package com.minelittlepony.unicopia.client.render; import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; + +import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; +import net.minecraft.client.render.VertexConsumerProvider.Immediate; +import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.Identifier; public interface RenderLayerUtil { + Identifier SHADOW_TEXTURE = new Identifier("textures/misc/shadow.png"); + static Optional getTexture(RenderLayer layer) { if (layer instanceof RenderLayer.MultiPhase multiphase) { return multiphase.getPhases().texture.getId(); } return Optional.empty(); } + + static void createUnionBuffer(Consumer action, VertexConsumerProvider vertices, Function overlayFunction) { + Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEffectVertexConsumers(); + action.accept(layer -> { + Identifier texture = RenderLayerUtil.getTexture(layer).orElse(null); + + if (texture == null || texture.equals(SHADOW_TEXTURE) || texture.equals(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE)) { + return vertices.getBuffer(layer); + } + return VertexConsumers.union( + vertices.getBuffer(layer), + immediate.getBuffer(overlayFunction.apply(texture)) + ); + }); + immediate.draw(); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java index 2d813635..ac9c3cdb 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java @@ -1,8 +1,6 @@ package com.minelittlepony.unicopia.client.render; import java.util.Optional; - -import com.minelittlepony.client.util.render.RenderLayerUtil; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; @@ -14,6 +12,7 @@ import com.minelittlepony.unicopia.entity.ItemImpl; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.duck.LavaAffine; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.util.ColorHelper; import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; @@ -24,14 +23,13 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.*; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.Identifier; -import net.minecraft.util.math.*; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; public class WorldRenderDelegate { public static final WorldRenderDelegate INSTANCE = new WorldRenderDelegate(); private static final Optional RED_SKY_COLOR = Optional.of(new Vec3d(1, 0, 0)); - private static final Identifier SHADOW_TEXTURE = new Identifier("textures/misc/shadow.png"); private final EntityReplacementManager disguiseLookup = new EntityReplacementManager(); private final EntityDisguiseRenderer disguiseRenderer = new EntityDisguiseRenderer(this); @@ -72,23 +70,10 @@ public class WorldRenderDelegate { if (MinecraftClient.getInstance().getResourceManager().getResource(frostingTexture).isPresent()) { recurseFrosting = true; - - Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEffectVertexConsumers(); - - client.getEntityRenderDispatcher().render(entity, x, y, z, yaw, tickDelta, matrices, layer -> { - - Identifier texture = RenderLayerUtil.getTexture(layer).orElse(null); - - if (texture == null || texture.equals(SHADOW_TEXTURE)) { - return vertices.getBuffer(layer); - } - return VertexConsumers.union( - vertices.getBuffer(layer), - immediate.getBuffer(RenderLayers.getEntityTranslucent(frostingTexture)) - ); - }, light); + RenderLayerUtil.createUnionBuffer(c -> { + client.getEntityRenderDispatcher().render(entity, x, y, z, yaw, tickDelta, matrices, c, light); + }, vertices, texture -> RenderLayers.getEntityTranslucent(frostingTexture)); recurseFrosting = false; - immediate.draw(); return true; } } @@ -146,16 +131,9 @@ public class WorldRenderDelegate { if (!recurseMinion && pony instanceof Creature creature && creature.isMinion()) { try { recurseMinion = true; - client.getEntityRenderDispatcher().render(creature.asEntity(), x, y, z, yaw, tickDelta, matrices, layer -> { - return RenderLayerUtil.getTexture(layer) - .filter(texture -> texture != PlayerScreenHandler.BLOCK_ATLAS_TEXTURE) - .map(texture -> { - return VertexConsumers.union( - vertices.getBuffer(layer), - vertices.getBuffer(RenderLayers.getMagicColored(texture, creature.isDiscorded() ? 0xCCFF0000 : 0xCC0000FF)) - ); - }).orElseGet(() -> vertices.getBuffer(layer)); - }, light); + RenderLayerUtil.createUnionBuffer(c -> { + client.getEntityRenderDispatcher().render(creature.asEntity(), x, y, z, yaw, tickDelta, matrices, c, light); + }, vertices, texture -> RenderLayers.getMagicColored(texture, creature.isDiscorded() ? 0x33FF0000 : ColorHelper.getRainbowColor(creature.asEntity(), 25, 1) )); // 0x8800AA00 return true; } catch (Throwable t) { Unicopia.LOGGER.error("Error whilst rendering minion", t); diff --git a/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java b/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java index 3e69ecc6..4db63857 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java +++ b/src/main/java/com/minelittlepony/unicopia/util/ColorHelper.java @@ -2,9 +2,25 @@ package com.minelittlepony.unicopia.util; import com.minelittlepony.common.util.Color; +import net.minecraft.entity.Entity; +import net.minecraft.entity.passive.SheepEntity; +import net.minecraft.util.DyeColor; import net.minecraft.util.math.MathHelper; public interface ColorHelper { + static int getRainbowColor(Entity entity, int speed, float tickDelta) { + int n = entity.age / speed + entity.getId(); + int o = DyeColor.values().length; + int p = n % o; + int q = (n + 1) % o; + float r = (entity.age % speed + tickDelta) / 25.0f; + float[] fs = SheepEntity.getRgbColor(DyeColor.byId(p)); + float[] gs = SheepEntity.getRgbColor(DyeColor.byId(q)); + float s = fs[0] * (1.0f - r) + gs[0] * r; + float t = fs[1] * (1.0f - r) + gs[1] * r; + float u = fs[2] * (1.0f - r) + gs[2] * r; + return Color.argbToHex(1, s, t, u); + } static float[] changeSaturation(float red, float green, float blue, float intensity) { float avg = (red + green + blue) / 3F;