From d8383121e35978cba1f325fc920f53a1b608a28c Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 23:21:16 +0200 Subject: [PATCH] *Cubozoa* Model --- .../entity/model/CubozoaEntityModel.java | 132 +++++++++++------- .../RendererEntityCubozoa.java | 9 +- .../registry/EndEntitiesRenders.java | 41 ++++-- 3 files changed, 118 insertions(+), 64 deletions(-) rename src/main/java/ru/betterend/entity/{render => model}/RendererEntityCubozoa.java (84%) diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 91f0abda..b01a5b9c 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -2,46 +2,66 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.CubozoaEntity; public class CubozoaEntityModel extends BlockBenchModel { - private final ModelPart model; - private final ModelPart main_cube_r1; - private final ModelPart tentacle_center_1; - private final ModelPart tentacle_1; - private final ModelPart tentacle_center_2; - private final ModelPart tentacle_2; - private final ModelPart tentacle_center_3; - private final ModelPart tentacle_3; - private final ModelPart tentacle_center_4; - private final ModelPart tentacle_4; - private float scaleY; - private float scaleXZ; + private final static int TENTACLE_COUNT = 4; - public CubozoaEntityModel() { - super(RenderType::entityTranslucent); - - texWidth = 48; - texHeight = 48; - - model = new ModelPart(this); + private final ModelPart model; + private final ModelPart[] tentacle_center; + private final ModelPart[] tentacle; + private float scaleY; + private float scaleXZ; + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 17) + .addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), PartPose.offset(0.0F, 24.0F, 0.0F)); + /*model = new ModelPart(this); model.setPos(0.0F, 24.0F, 0.0F); - model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); + model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);*/ - main_cube_r1 = new ModelPart(this); + bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F)); + + /*main_cube_r1 = new ModelPart(this); main_cube_r1.setPos(0.0F, -14.0F, 0.0F); model.addChild(main_cube_r1); setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); - main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); + main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);*/ + float[] angles = {0, (float)Math.PI/-2, (float)Math.PI, (float)Math.PI/2}; - tentacle_center_1 = new ModelPart(this); + for (int i=1; i<=TENTACLE_COUNT; i++){ + PartDefinition tentaclePart = bodyPart + .addOrReplaceChild("tentacle_center_"+i, + CubeListBuilder.create(), + PartPose.offsetAndRotation( + 0.0F, 0.0F, 0.0F, + 0.0F, -1.5708F, 0.0F + ) + ); + + tentaclePart.addOrReplaceChild("tentacle_"+i, CubeListBuilder.create() + .texOffs(16, 17) + .addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F), + PartPose.offset(0.0F, -7.0F, 4.5F)); + } + /*tentacle_center_1 = new ModelPart(this); tentacle_center_1.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_1); - tentacle_1 = new ModelPart(this); tentacle_1.setPos(0.0F, -7.0F, 4.5F); @@ -52,7 +72,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_2.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_2); setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); - tentacle_2 = new ModelPart(this); tentacle_2.setPos(0.0F, -7.0F, 4.5F); @@ -63,7 +82,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_3.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_3); setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); - tentacle_3 = new ModelPart(this); tentacle_3.setPos(0.0F, -7.0F, 4.5F); @@ -74,31 +92,47 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_4.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_4); setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); - + tentacle_4 = new ModelPart(this); tentacle_4.setPos(0.0F, -7.0F, 4.5F); tentacle_center_4.addChild(tentacle_4); - tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - } - - @Override - public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float sin = Mth.sin(animationProgress * 0.13F); - scaleY = sin * 0.1F + 0.9F; - scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - - tentacle_1.xRot = sin * 0.15F; - tentacle_2.xRot = sin * 0.15F; - tentacle_3.xRot = sin * 0.15F; - tentacle_4.xRot = sin * 0.15F; - } + tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F);*/ - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { - matrices.pushPose(); - matrices.scale(scaleXZ, scaleY, scaleXZ); - model.render(matrices, vertices, light, overlay); - matrices.popPose(); - } + /* texWidth = 48; + texHeight = 48; */ + return LayerDefinition.create(modelData, 48, 48); + } + + public CubozoaEntityModel(ModelPart modelPart) { + super(RenderType::entityTranslucent); + + tentacle = new ModelPart[TENTACLE_COUNT]; + tentacle_center = new ModelPart[TENTACLE_COUNT]; + + model = modelPart.getChild(PartNames.BODY); + for (int i=1; i<=TENTACLE_COUNT; i++){ + tentacle_center[i] = model.getChild("tentacle_center_"+i); + tentacle[i] = tentacle_center[i].getChild("tentacle_"+i); + } + } + + @Override + public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + float sin = Mth.sin(animationProgress * 0.13F); + scaleY = sin * 0.1F + 0.9F; + scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; + + for (int i=1; i<=TENTACLE_COUNT; i++){ + tentacle[i].xRot = sin * 0.15f; + } + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + matrices.pushPose(); + matrices.scale(scaleXZ, scaleY, scaleXZ); + model.render(matrices, vertices, light, overlay); + matrices.popPose(); + } } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java similarity index 84% rename from src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java rename to src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java index 5b6b78fe..27500043 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java @@ -1,11 +1,11 @@ -package ru.betterend.entity.render; +package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -13,13 +13,14 @@ import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityCubozoa extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; private static final RenderType[] GLOW = new RenderType[2]; - public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); + public RendererEntityCubozoa(EntityRendererProvider.Context ctx) { + super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 30384554..d1e59f53 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -2,11 +2,16 @@ package ru.betterend.registry; import java.util.function.Function; +import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; +import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; -import ru.betterend.entity.render.RendererEntityCubozoa; +import ru.betterend.BetterEnd; +import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.entity.model.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; @@ -14,19 +19,33 @@ import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { + public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); public static void register() { - register(EndEntities.DRAGONFLY, RendererEntityDragonfly::new); - register(EndEntities.END_SLIME, RendererEntityEndSlime::new); - register(EndEntities.END_FISH, RendererEntityEndFish::new); - register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); - register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); - register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); + register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); + register(EndEntities.END_SLIME, RendererEntityEndSlime.class); + register(EndEntities.END_FISH, RendererEntityEndFish.class); + register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker.class); + register(EndEntities.CUBOZOA, RendererEntityCubozoa.class); + register(EndEntities.SILK_MOTH, SilkMothEntityRenderer.class); + + EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, CubozoaEntityModel::getTexturedModelData); } - - private static void register(EntityType type, Function> render) { - EntityRendererRegistry.INSTANCE.register(type, (entityRenderDispatcher, context) -> { - return render.apply(entityRenderDispatcher); + + private static void register(EntityType type, Class> renderer) { + EntityRendererRegistry.INSTANCE.register(type, (context) -> { + MobRenderer render = null; + try { + render = renderer.getConstructor(context.getClass()).newInstance(context); + } + catch (Exception e) { + e.printStackTrace(); + } + return render; }); } + + private static ModelLayerLocation registerMain(String id){ + return new ModelLayerLocation(new ResourceLocation(BetterEnd.MOD_ID, id), "main"); + } }