Skip to content

Commit 35c139c

Browse files
author
AzureZhen
committed
Lead Render
1 parent de286be commit 35c139c

File tree

2 files changed

+153
-0
lines changed

2 files changed

+153
-0
lines changed

src/main/java/software/bernie/geckolib3/renderers/geo/GeoEntityRenderer.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,31 @@
99
import com.mojang.blaze3d.systems.RenderSystem;
1010
import com.mojang.blaze3d.vertex.PoseStack;
1111
import com.mojang.blaze3d.vertex.VertexConsumer;
12+
import com.mojang.math.Matrix4f;
1213
import com.mojang.math.Vector3f;
1314

1415
import net.minecraft.ChatFormatting;
1516
import net.minecraft.client.Minecraft;
17+
import net.minecraft.client.renderer.LightTexture;
1618
import net.minecraft.client.renderer.MultiBufferSource;
1719
import net.minecraft.client.renderer.RenderType;
1820
import net.minecraft.client.renderer.entity.EntityRenderer;
1921
import net.minecraft.client.renderer.entity.EntityRendererProvider;
2022
import net.minecraft.client.renderer.texture.OverlayTexture;
23+
import net.minecraft.core.BlockPos;
2124
import net.minecraft.core.Direction;
2225
import net.minecraft.resources.ResourceLocation;
2326
import net.minecraft.util.Mth;
27+
import net.minecraft.world.entity.Entity;
2428
import net.minecraft.world.entity.EquipmentSlot;
2529
import net.minecraft.world.entity.LivingEntity;
30+
import net.minecraft.world.entity.Mob;
2631
import net.minecraft.world.entity.Pose;
2732
import net.minecraft.world.entity.player.Player;
2833
import net.minecraft.world.entity.player.PlayerModelPart;
2934
import net.minecraft.world.item.ItemStack;
35+
import net.minecraft.world.level.LightLayer;
36+
import net.minecraft.world.phys.Vec3;
3037
import net.minecraftforge.fml.ModList;
3138
import software.bernie.geckolib3.compat.PatchouliCompat;
3239
import software.bernie.geckolib3.core.engine.Animator;
@@ -141,6 +148,12 @@ packedLightIn, getPackedOverlay(entity, 0), (float) renderColor.getRed() / 255f,
141148
f7, netHeadYaw, headPitch);
142149
}
143150
}
151+
if (entity instanceof Mob) {
152+
Entity leashHolder = ((Mob) entity).getLeashHolder();
153+
if (leashHolder != null) {
154+
this.renderLeash(entity, partialTicks, stack, bufferIn, leashHolder);
155+
}
156+
}
144157
if (ModList.get().isLoaded("patchouli")) {
145158
PatchouliCompat.patchouliLoaded(stack);
146159
}
@@ -267,4 +280,67 @@ public ResourceLocation getTextureLocation(T instance) {
267280
public final boolean addLayer(GeoLayerRenderer<T> layer) {
268281
return this.layerRenderers.add(layer);
269282
}
283+
284+
private <E extends Entity> void renderLeash(T entity, float partialTicks, PoseStack poseStack,
285+
MultiBufferSource buffer, E leashHolder) {
286+
poseStack.pushPose();
287+
Vec3 vec3 = leashHolder.getRopeHoldPosition(partialTicks);
288+
double d0 = (double) (Mth.lerp(partialTicks, entity.yBodyRot, entity.yBodyRotO) * ((float) Math.PI / 180F))
289+
+ (Math.PI / 2D);
290+
Vec3 vec31 = entity.getLeashOffset();
291+
double d1 = Math.cos(d0) * vec31.z + Math.sin(d0) * vec31.x;
292+
double d2 = Math.sin(d0) * vec31.z - Math.cos(d0) * vec31.x;
293+
double d3 = Mth.lerp(partialTicks, entity.xo, entity.getX()) + d1;
294+
double d4 = Mth.lerp(partialTicks, entity.yo, entity.getY()) + vec31.y;
295+
double d5 = Mth.lerp(partialTicks, entity.zo, entity.getZ()) + d2;
296+
poseStack.translate(d1, vec31.y, d2);
297+
float f = (float) (vec3.x - d3);
298+
float f1 = (float) (vec3.y - d4);
299+
float f2 = (float) (vec3.z - d5);
300+
VertexConsumer vertexconsumer = buffer.getBuffer(RenderType.leash());
301+
Matrix4f matrix4f = poseStack.last().pose();
302+
float f4 = Mth.fastInvSqrt(f * f + f2 * f2) * 0.025F / 2.0F;
303+
float f5 = f2 * f4;
304+
float f6 = f * f4;
305+
BlockPos blockpos = new BlockPos(entity.getEyePosition(partialTicks));
306+
BlockPos blockpos1 = new BlockPos(leashHolder.getEyePosition(partialTicks));
307+
int i = this.getBlockLightLevel(entity, blockpos);
308+
int j = this.getLeashHolderBlockLightLevel(leashHolder, blockpos1);
309+
int k = entity.level.getBrightness(LightLayer.SKY, blockpos);
310+
int l = entity.level.getBrightness(LightLayer.SKY, blockpos1);
311+
312+
for (int i1 = 0; i1 <= 24; ++i1) {
313+
addVertexPair(vertexconsumer, matrix4f, f, f1, f2, i, j, k, l, 0.025F, 0.025F, f5, f6, i1, false);
314+
}
315+
316+
for (int j1 = 24; j1 >= 0; --j1) {
317+
addVertexPair(vertexconsumer, matrix4f, f, f1, f2, i, j, k, l, 0.025F, 0.0F, f5, f6, j1, true);
318+
}
319+
320+
poseStack.popPose();
321+
}
322+
323+
private int getLeashHolderBlockLightLevel(Entity leashHolder, BlockPos pos) {
324+
return leashHolder.isOnFire() ? 15 : leashHolder.level.getBrightness(LightLayer.BLOCK, pos);
325+
}
326+
327+
private static void addVertexPair(VertexConsumer vertexConsumer, Matrix4f matrix, float xDiff, float yDiff,
328+
float zDiff, int entityLightLevel, int holderLightLevel, int entitySkyLight, int holderSkyLight,
329+
float p_174317_, float p_174318_, float p_174319_, float p_174320_, int p_174321_, boolean p_174322_) {
330+
float f = (float) p_174321_ / 24.0F;
331+
int i = (int) Mth.lerp(f, (float) entityLightLevel, (float) holderLightLevel);
332+
int j = (int) Mth.lerp(f, (float) entitySkyLight, (float) holderSkyLight);
333+
int k = LightTexture.pack(i, j);
334+
float f1 = p_174321_ % 2 == (p_174322_ ? 1 : 0) ? 0.7F : 1.0F;
335+
float f2 = 0.5F * f1;
336+
float f3 = 0.4F * f1;
337+
float f4 = 0.3F * f1;
338+
float f5 = xDiff * f;
339+
float f6 = yDiff > 0.0F ? yDiff * f * f : yDiff - yDiff * (1.0F - f) * (1.0F - f);
340+
float f7 = zDiff * f;
341+
vertexConsumer.vertex(matrix, f5 - p_174319_, f6 + p_174318_, f7 + p_174320_).color(f2, f3, f4, 1.0F).uv2(k)
342+
.endVertex();
343+
vertexConsumer.vertex(matrix, f5 + p_174319_, f6 + p_174317_ - p_174318_, f7 - p_174320_)
344+
.color(f2, f3, f4, 1.0F).uv2(k).endVertex();
345+
}
270346
}

src/main/java/software/bernie/geckolib3/renderers/geo/GeoReplacedEntityRenderer.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,30 @@
1212
import com.jozufozu.flywheel.util.AnimationTickHolder;
1313
import com.mojang.blaze3d.systems.RenderSystem;
1414
import com.mojang.blaze3d.vertex.PoseStack;
15+
import com.mojang.blaze3d.vertex.VertexConsumer;
16+
import com.mojang.math.Matrix4f;
1517
import com.mojang.math.Vector3f;
1618

1719
import net.minecraft.ChatFormatting;
1820
import net.minecraft.client.Minecraft;
21+
import net.minecraft.client.renderer.LightTexture;
1922
import net.minecraft.client.renderer.MultiBufferSource;
2023
import net.minecraft.client.renderer.RenderType;
2124
import net.minecraft.client.renderer.entity.EntityRenderer;
2225
import net.minecraft.client.renderer.entity.EntityRendererProvider;
2326
import net.minecraft.client.renderer.texture.OverlayTexture;
27+
import net.minecraft.core.BlockPos;
2428
import net.minecraft.core.Direction;
2529
import net.minecraft.resources.ResourceLocation;
2630
import net.minecraft.util.Mth;
31+
import net.minecraft.world.entity.Entity;
2732
import net.minecraft.world.entity.LivingEntity;
33+
import net.minecraft.world.entity.Mob;
2834
import net.minecraft.world.entity.Pose;
2935
import net.minecraft.world.entity.player.Player;
3036
import net.minecraft.world.entity.player.PlayerModelPart;
37+
import net.minecraft.world.level.LightLayer;
38+
import net.minecraft.world.phys.Vec3;
3139
import net.minecraftforge.fml.ModList;
3240
import software.bernie.geckolib3.compat.PatchouliCompat;
3341
import software.bernie.geckolib3.core.engine.Animator;
@@ -143,6 +151,12 @@ packedLightIn, getPackedOverlay(entity, this.getOverlayProgress(entity, partialT
143151
f7, f2, f6);
144152
}
145153
}
154+
if (entity instanceof Mob) {
155+
Entity leashHolder = ((Mob) entity).getLeashHolder();
156+
if (leashHolder != null) {
157+
this.renderLeash(entity, partialTicks, stack, bufferIn, leashHolder);
158+
}
159+
}
146160
if (ModList.get().isLoaded("patchouli")) {
147161
PatchouliCompat.patchouliLoaded(stack);
148162
}
@@ -261,4 +275,67 @@ protected float handleRotationFloat(LivingEntity livingBase, float partialTicks)
261275
public final boolean addLayer(GeoLayerRenderer<E> layer) {
262276
return this.layerRenderers.add(layer);
263277
}
278+
279+
private <T extends Entity> void renderLeash(E entity, float partialTicks, PoseStack poseStack,
280+
MultiBufferSource buffer, T leashHolder) {
281+
poseStack.pushPose();
282+
Vec3 vec3 = leashHolder.getRopeHoldPosition(partialTicks);
283+
double d0 = (double) (Mth.lerp(partialTicks, ((Mob) entity).yBodyRot, ((Mob) entity).yBodyRotO)
284+
* ((float) Math.PI / 180F)) + (Math.PI / 2D);
285+
Vec3 vec31 = ((Mob) entity).getLeashOffset();
286+
double d1 = Math.cos(d0) * vec31.z + Math.sin(d0) * vec31.x;
287+
double d2 = Math.sin(d0) * vec31.z - Math.cos(d0) * vec31.x;
288+
double d3 = Mth.lerp(partialTicks, ((Mob) entity).xo, ((Mob) entity).getX()) + d1;
289+
double d4 = Mth.lerp(partialTicks, ((Mob) entity).yo, ((Mob) entity).getY()) + vec31.y;
290+
double d5 = Mth.lerp(partialTicks, ((Mob) entity).zo, ((Mob) entity).getZ()) + d2;
291+
poseStack.translate(d1, vec31.y, d2);
292+
float f = (float) (vec3.x - d3);
293+
float f1 = (float) (vec3.y - d4);
294+
float f2 = (float) (vec3.z - d5);
295+
VertexConsumer vertexconsumer = buffer.getBuffer(RenderType.leash());
296+
Matrix4f matrix4f = poseStack.last().pose();
297+
float f4 = Mth.fastInvSqrt(f * f + f2 * f2) * 0.025F / 2.0F;
298+
float f5 = f2 * f4;
299+
float f6 = f * f4;
300+
BlockPos blockpos = new BlockPos(((Mob) entity).getEyePosition(partialTicks));
301+
BlockPos blockpos1 = new BlockPos(leashHolder.getEyePosition(partialTicks));
302+
int i = this.getBlockLightLevel(entity, blockpos);
303+
int j = this.getLeashHolderBlockLightLevel(leashHolder, blockpos1);
304+
int k = ((Mob) entity).level.getBrightness(LightLayer.SKY, blockpos);
305+
int l = ((Mob) entity).level.getBrightness(LightLayer.SKY, blockpos1);
306+
307+
for (int i1 = 0; i1 <= 24; ++i1) {
308+
addVertexPair(vertexconsumer, matrix4f, f, f1, f2, i, j, k, l, 0.025F, 0.025F, f5, f6, i1, false);
309+
}
310+
311+
for (int j1 = 24; j1 >= 0; --j1) {
312+
addVertexPair(vertexconsumer, matrix4f, f, f1, f2, i, j, k, l, 0.025F, 0.0F, f5, f6, j1, true);
313+
}
314+
315+
poseStack.popPose();
316+
}
317+
318+
private int getLeashHolderBlockLightLevel(Entity leashHolder, BlockPos pos) {
319+
return leashHolder.isOnFire() ? 15 : leashHolder.level.getBrightness(LightLayer.BLOCK, pos);
320+
}
321+
322+
private static void addVertexPair(VertexConsumer vertexConsumer, Matrix4f matrix, float xDiff, float yDiff,
323+
float zDiff, int entityLightLevel, int holderLightLevel, int entitySkyLight, int holderSkyLight,
324+
float p_174317_, float p_174318_, float p_174319_, float p_174320_, int p_174321_, boolean p_174322_) {
325+
float f = (float) p_174321_ / 24.0F;
326+
int i = (int) Mth.lerp(f, (float) entityLightLevel, (float) holderLightLevel);
327+
int j = (int) Mth.lerp(f, (float) entitySkyLight, (float) holderSkyLight);
328+
int k = LightTexture.pack(i, j);
329+
float f1 = p_174321_ % 2 == (p_174322_ ? 1 : 0) ? 0.7F : 1.0F;
330+
float f2 = 0.5F * f1;
331+
float f3 = 0.4F * f1;
332+
float f4 = 0.3F * f1;
333+
float f5 = xDiff * f;
334+
float f6 = yDiff > 0.0F ? yDiff * f * f : yDiff - yDiff * (1.0F - f) * (1.0F - f);
335+
float f7 = zDiff * f;
336+
vertexConsumer.vertex(matrix, f5 - p_174319_, f6 + p_174318_, f7 + p_174320_).color(f2, f3, f4, 1.0F).uv2(k)
337+
.endVertex();
338+
vertexConsumer.vertex(matrix, f5 + p_174319_, f6 + p_174317_ - p_174318_, f7 - p_174320_)
339+
.color(f2, f3, f4, 1.0F).uv2(k).endVertex();
340+
}
264341
}

0 commit comments

Comments
 (0)