From caf0175155f95837aa9496c2c08c59cc390ec122 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 8 Aug 2021 18:36:56 +0200 Subject: [PATCH] Added bat wings --- .../unicopia/client/URenderers.java | 4 + .../render/AccessoryFeatureRenderer.java | 3 +- .../render/BatWingsFeatureRenderer.java | 65 +++++++++++++ .../render/IcarusWingsFeatureRenderer.java | 27 ++++++ .../client/render/WingsFeatureRenderer.java | 89 +++++++++--------- .../unicopia/textures/models/wings/bat.png | Bin 0 -> 655 bytes 6 files changed, 141 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/client/render/BatWingsFeatureRenderer.java create mode 100644 src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java create mode 100644 src/main/resources/assets/unicopia/textures/models/wings/bat.png diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index 8b80c4d3..b6e2a59b 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -14,9 +14,11 @@ import com.minelittlepony.unicopia.client.particle.RunesParticle; import com.minelittlepony.unicopia.client.particle.SphereParticle; import com.minelittlepony.unicopia.client.render.AccessoryFeatureRenderer; import com.minelittlepony.unicopia.client.render.AmuletFeatureRenderer; +import com.minelittlepony.unicopia.client.render.BatWingsFeatureRenderer; import com.minelittlepony.unicopia.client.render.BraceletFeatureRenderer; import com.minelittlepony.unicopia.client.render.CastSpellEntityRenderer; import com.minelittlepony.unicopia.client.render.FloatingArtefactEntityRenderer; +import com.minelittlepony.unicopia.client.render.IcarusWingsFeatureRenderer; import com.minelittlepony.unicopia.client.render.WingsFeatureRenderer; import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.GemstoneItem; @@ -59,6 +61,8 @@ public interface URenderers { AccessoryFeatureRenderer.register(BraceletFeatureRenderer::new); AccessoryFeatureRenderer.register(AmuletFeatureRenderer::new); AccessoryFeatureRenderer.register(WingsFeatureRenderer::new); + AccessoryFeatureRenderer.register(IcarusWingsFeatureRenderer::new); + AccessoryFeatureRenderer.register(BatWingsFeatureRenderer::new); EntityRendererRegistry.INSTANCE.register(UEntities.THROWN_ITEM, FlyingItemEntityRenderer::new); EntityRendererRegistry.INSTANCE.register(UEntities.FLOATING_ARTEFACT, FloatingArtefactEntityRenderer::new); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java index 1d8dbf49..5def2769 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java @@ -2,7 +2,6 @@ package com.minelittlepony.unicopia.client.render; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.feature.FeatureRenderer; @@ -26,7 +25,7 @@ public class AccessoryFeatureRenderer< @SuppressWarnings("unchecked") public AccessoryFeatureRenderer(FeatureRendererContext context) { super(context); - features = REGISTRY.stream().map(f -> ((FeatureFactory)f).create(context)).collect(Collectors.toList()); + features = REGISTRY.stream().map(f -> ((FeatureFactory)f).create(context)).toList(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/BatWingsFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/BatWingsFeatureRenderer.java new file mode 100644 index 00000000..eafd9cb8 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/render/BatWingsFeatureRenderer.java @@ -0,0 +1,65 @@ +package com.minelittlepony.unicopia.client.render; + +import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.client.model.Dilation; +import net.minecraft.client.model.ModelPartBuilder; +import net.minecraft.client.model.ModelPartData; +import net.minecraft.client.model.ModelTransform; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.Identifier; + +public class BatWingsFeatureRenderer extends WingsFeatureRenderer { + + private static final Identifier TEXTURE = new Identifier("unicopia", "textures/models/wings/bat.png"); + + public BatWingsFeatureRenderer(FeatureRendererContext> context) { + super(context); + } + + @Override + protected void createWing(String name, ModelPartData parent, Dilation dilation, int k) { + ModelPartData base = parent.addChild(name, + ModelPartBuilder.create().cuboid(0, 0, 0, 2, 10, 2, dilation), + ModelTransform.pivot(k * 2, 2, 2 + k * 0.5F)); + + for (int i = 0; i < FEATHER_COUNT; i++) { + int texX = (i % 2) * 8; + int baseLength = 23; + int featherLength = i < 7 ? baseLength - (i % 4 * 2) : baseLength - (i * 2); + ModelPartData wing = base.addChild("feather_" + i, + ModelPartBuilder.create() + .uv(8 + texX, 0) + .cuboid(-k * (i % 2) / 90F, 0, 0, 0.02F, featherLength * 0.8F, 4, dilation), + ModelTransform.pivot(-i * k / 9F, 7, 0) + ); + + wing.addChild("secondary", ModelPartBuilder.create() + .uv(8 + texX, 0) + .cuboid(-k * (i % 2) / 90F, 0, 0, 0.02F, featherLength, 4, dilation), + ModelTransform.rotation(0.2F, 0, 0) + ); + if (i < 5) { + wing.addChild("tertiary", ModelPartBuilder.create() + .uv(8 + texX, 0) + .cuboid(-k * (i % 2) / 90F, 0, 0, 0.02F, featherLength - 1, 4, dilation), + ModelTransform.rotation(-0.2F, 0, 0) + ); + } + } + } + + @Override + protected boolean canRender(E entity) { + return entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getSpecies() == Race.BAT; + } + + @Override + protected Identifier getTexture(E entity) { + return TEXTURE; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java new file mode 100644 index 00000000..9f827eab --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java @@ -0,0 +1,27 @@ +package com.minelittlepony.unicopia.client.render; + +import com.minelittlepony.unicopia.item.UItems; + +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Identifier; + +public class IcarusWingsFeatureRenderer extends WingsFeatureRenderer { + private static final Identifier ICARUS_WINGS = new Identifier("unicopia", "textures/models/wings/icarus.png"); + private static final Identifier ICARUS_WINGS_CORRUPTED = new Identifier("unicopia", "textures/models/wings/icarus_corrupted.png"); + + public IcarusWingsFeatureRenderer(FeatureRendererContext> context) { + super(context); + } + + @Override + protected boolean canRender(E entity) { + return !super.canRender(entity) && UItems.PEGASUS_AMULET.isApplicable(entity); + } + + @Override + protected Identifier getTexture(E entity) { + return entity.world.getDimension().isUltrawarm() ? ICARUS_WINGS_CORRUPTED : ICARUS_WINGS; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java index f02d327e..836a4d30 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WingsFeatureRenderer.java @@ -1,7 +1,6 @@ package com.minelittlepony.unicopia.client.render; import com.minelittlepony.unicopia.entity.player.Pony; -import com.minelittlepony.unicopia.item.UItems; import net.minecraft.client.model.Dilation; import net.minecraft.client.model.Model; @@ -25,8 +24,8 @@ import net.minecraft.util.Identifier; public class WingsFeatureRenderer implements AccessoryFeatureRenderer.Feature { - private static final Identifier ICARUS_WINGS = new Identifier("unicopia", "textures/models/wings/icarus.png"); - private static final Identifier ICARUS_WINGS_CORRUPTED = new Identifier("unicopia", "textures/models/wings/icarus_corrupted.png"); + protected static final int FEATHER_COUNT = 8; + private static final Identifier PEGASUS_WINGS = new Identifier("unicopia", "textures/models/wings/pegasus.png"); private final WingsModel model; @@ -35,17 +34,13 @@ public class WingsFeatureRenderer implements AccessoryFe public WingsFeatureRenderer(FeatureRendererContext> context) { this.context = context; - this.model = new WingsModel(WingsModel.getData(Dilation.NONE).createModel()); + this.model = new WingsModel(createModel(Dilation.NONE).createModel()); } @Override public void render(MatrixStack matrices, VertexConsumerProvider renderContext, int lightUv, E entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { - - boolean pegasus = (entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getSpecies().canInteractWithClouds()); - boolean icarus = UItems.PEGASUS_AMULET.isApplicable(entity); - - if (icarus || pegasus) { - Identifier texture = pegasus ? PEGASUS_WINGS : entity.world.getDimension().isUltrawarm() ? ICARUS_WINGS_CORRUPTED : ICARUS_WINGS; + if (canRender(entity)) { + Identifier texture = getTexture(entity); VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getEntityTranslucent(texture), false, false); model.setAngles(entity, context.getModel()); @@ -53,32 +48,54 @@ public class WingsFeatureRenderer implements AccessoryFe } } - static class WingsModel extends Model { + protected boolean canRender(E entity) { + return entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getSpecies().canInteractWithClouds(); + } + protected Identifier getTexture(E entity) { + return PEGASUS_WINGS; + } + + private TexturedModelData createModel(Dilation dilation) { + ModelData data = new ModelData(); + createWing("left_wing", data.getRoot(), dilation, -1); + createWing("right_wing", data.getRoot(), dilation, 1); + return TexturedModelData.of(data, 24, 23); + } + + protected void createWing(String name, ModelPartData parent, Dilation dilation, int k) { + ModelPartData base = parent.addChild(name, + ModelPartBuilder.create().cuboid(0, 0, 0, 2, 10, 2, dilation), + ModelTransform.pivot(k * 2, 2, 2 + k * 0.5F)); + + for (int i = 0; i < FEATHER_COUNT; i++) { + int texX = (i % 2) * 8; + int featherLength = 21 - i * 2; + base.addChild("feather_" + i, + ModelPartBuilder.create() + .uv(8 + texX, 0) + .cuboid(-k * (i % 2) / 90F, 0, 0, 2, featherLength, 2, dilation), + ModelTransform.pivot(0, 9, 0)); + } + } + + private static class WingsModel extends Model { private final ModelPart root; - private final Wing[] wings; + + private final Wing leftWing; + private final Wing rightWing; public WingsModel(ModelPart tree) { super(RenderLayer::getEntityTranslucent); root = tree; - wings = new Wing[] { - new Wing(tree.getChild("left_wing"), -1), - new Wing(tree.getChild("right_wing"), 1) - }; - } - - static TexturedModelData getData(Dilation dilation) { - ModelData data = new ModelData(); - Wing.getData("left_wing", data.getRoot(), dilation, -1); - Wing.getData("right_wing", data.getRoot(), dilation, 1); - return TexturedModelData.of(data, 24, 23); + leftWing = new Wing(tree.getChild("left_wing"), -1); + rightWing = new Wing(tree.getChild("right_wing"), 1); } public void setAngles(LivingEntity entity, BipedEntityModel biped) { root.copyTransform(biped.body); - for (Wing wing : wings) { - wing.setAngles(entity); - } + leftWing.setAngles(entity); + rightWing.setAngles(entity); } @Override @@ -89,7 +106,7 @@ public class WingsFeatureRenderer implements AccessoryFe static class Wing { final ModelPart base; - final ModelPart[] feathers = new ModelPart[8]; + final ModelPart[] feathers = new ModelPart[FEATHER_COUNT]; final int k; @@ -101,24 +118,6 @@ public class WingsFeatureRenderer implements AccessoryFe } } - static void getData(String name, ModelPartData parent, Dilation dilation, int k) { - ModelPartData base = parent.addChild(name, - ModelPartBuilder.create().cuboid(0, 0, 0, 2, 10, 2, dilation), - ModelTransform.pivot(k * 2, 2, 2 + k * 0.5F)); - - int featherCount = 8; - - for (int i = 0; i < featherCount; i++) { - int texX = (i % 2) * 8; - int featherLength = 21 - i * 2; - base.addChild("feather_" + i, - ModelPartBuilder.create() - .uv(8 + texX, 0) - .cuboid(-k * (i % 2) / 90F, 0, 0, 2, featherLength, 2, dilation), - ModelTransform.pivot(0, 9, 0)); - } - } - void setAngles(LivingEntity entity) { float spreadAmount = entity instanceof PlayerEntity ? Pony.of((PlayerEntity)entity).getMotion().getWingAngle() : 0; diff --git a/src/main/resources/assets/unicopia/textures/models/wings/bat.png b/src/main/resources/assets/unicopia/textures/models/wings/bat.png new file mode 100644 index 0000000000000000000000000000000000000000..ff221f1420683d90c4d2d58ff060d82e86996bb2 GIT binary patch literal 655 zcmV;A0&x9_P)mfSQfWi~!jmcOTD} zY|M;O3hs`Xz1f~lCs$QOWPrFk?v98cBEvDj14LD+wG#dT9DeSO#zXIYT#CqWQq{Ae zDrPpm*IMblPZgC?$jMFtN+~0Q$S~dmJSxc*)>?;c+(km}j_$LICaLPksP{gCWg)04 z+qO;gw$^a>abGjHA~MPjkW$Ljht}HE*nf#5g4W#m2ofiLnW8YvS?#AY=!v8O@URMx(af1{Cb|&;5CEh|3L;0zj`dtq;Xr}&jQ{6bD9E+ zziV_>NCwXpOhMNISAXE8DSd-0121sAhHHIWY`MW9$GmCx%^p3p1vV27Zq!@hWrOtq p+izG7GA+D33;Xq){~h^n_!rfXQ;-Q1UV#7r002ovPDHLkV1lEmF#7-i literal 0 HcmV?d00001