优化开火火焰的渲染方法

This commit is contained in:
Atsuishio 2025-04-23 15:28:15 +08:00 committed by Light_Quanta
parent 6285838dd7
commit 9d4064587f
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
5 changed files with 42 additions and 37 deletions

View file

@ -1,7 +1,9 @@
package com.atsuishio.superbwarfare.client; package com.atsuishio.superbwarfare.client;
import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.ClientEventHandler;
import com.atsuishio.superbwarfare.item.gun.data.GunData; import com.atsuishio.superbwarfare.item.gun.data.GunData;
import com.atsuishio.superbwarfare.item.gun.data.value.AttachmentType;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -17,6 +19,7 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import org.joml.Matrix3f;
import software.bernie.geckolib.animation.AnimationProcessor; import software.bernie.geckolib.animation.AnimationProcessor;
import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.cache.object.GeoBone;
import software.bernie.geckolib.util.RenderUtil; import software.bernie.geckolib.util.RenderUtil;
@ -36,15 +39,7 @@ public class AnimationHelper {
} }
public static void renderPartOverBoneR(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) { public static void renderPartOverBoneR(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) {
setupModelFromBone(model, bone); renderPartOverBone(model, bone, stack, buffer, packedLightIn, packedOverlayIn);
model.render(stack, buffer, packedLightIn, packedOverlayIn);
}
public static void setupModelFromBoneR(ModelPart model, GeoBone bone) {
model.setPos(bone.getPivotX(), bone.getPivotY(), bone.getPivotZ());
model.xRot = 0.0f;
model.yRot = 0.0f;
model.zRot = 0.0f;
} }
public static void renderPartOverBone2(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) { public static void renderPartOverBone2(ModelPart model, GeoBone bone, PoseStack stack, VertexConsumer buffer, int packedLightIn, int packedOverlayIn) {
@ -96,6 +91,40 @@ public class AnimationHelper {
} }
} }
public static void handleShootFlare(String name, PoseStack stack, ItemStack itemStack, GeoBone bone, MultiBufferSource buffer, int packedLightIn, double x, double y, double z, double size) {
if (name.equals("flare") && ClientEventHandler.firePosTimer > 0 && ClientEventHandler.firePosTimer < 0.5 && GunData.from(itemStack).attachment.get(AttachmentType.BARREL) != 2) {
bone.setScaleX((float) (size + 0.8 * size * (Math.random() - 0.5)));
bone.setScaleY((float) (size + 0.8 * size * (Math.random() - 0.5)));
bone.setRotZ((float) (0.5 * (Math.random() - 0.5)));
stack.pushPose();
stack.translate(x, y, -z);
RenderUtil.translateMatrixToBone(stack, bone);
RenderUtil.translateToPivotPoint(stack, bone);
RenderUtil.rotateMatrixAroundBone(stack, bone);
RenderUtil.scaleMatrixForBone(stack, bone);
RenderUtil.translateAwayFromPivotPoint(stack, bone);
PoseStack.Pose pose = stack.last();
Matrix3f normal = pose.normal();
VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.eyes(Mod.loc("textures/particle/flare.png")));
vertex(vertexConsumer, pose, normal, packedLightIn, 0.0F, 0, 0, 1);
vertex(vertexConsumer, pose, normal, packedLightIn, 1.0F, 0, 1, 1);
vertex(vertexConsumer, pose, normal, packedLightIn, 1.0F, 1, 1, 0);
vertex(vertexConsumer, pose, normal, packedLightIn, 0.0F, 1, 0, 0);
stack.popPose();
}
}
private static void vertex(VertexConsumer pConsumer, PoseStack.Pose pPose, Matrix3f pNormal, int pLightmapUV, float pX, float pY, int pU, int pV) {
pConsumer.addVertex(pPose, pX - 0.5F, pY - 0.5F, 0.0F)
.setColor(255, 255, 255, 255)
.setUv((float) pU, (float) pV)
.setOverlay(OverlayTexture.NO_OVERLAY)
.setLight(pLightmapUV)
.setNormal(pPose, 0.0F, 1.0F, 0.0F);
}
public static void renderArms( public static void renderArms(
Minecraft mc, Minecraft mc,
LocalPlayer player, LocalPlayer player,

View file

@ -78,6 +78,7 @@ public class AK12ItemRenderer extends GeoItemRenderer<AK12Item> {
var player = mc.player; var player = mc.player;
if (player != null) { if (player != null) {
ItemStack itemStack = player.getMainHandItem(); ItemStack itemStack = player.getMainHandItem();
if (!(itemStack.getItem() instanceof GunItem)) return; if (!(itemStack.getItem() instanceof GunItem)) return;
var data = GunData.from(itemStack); var data = GunData.from(itemStack);
@ -104,19 +105,8 @@ public class AK12ItemRenderer extends GeoItemRenderer<AK12Item> {
bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom); bone.setHidden(ClientEventHandler.zoomPos > 0.7 && ClientEventHandler.zoom);
} }
if (name.equals("flare")) {
if (GunData.from(itemStack).attachment.get(AttachmentType.BARREL) == 1) { AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, -0.012, 0.02, 1.25229375, 0.3);
bone.setPosZ(2.25f);
}
if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunData.from(itemStack).attachment.get(AttachmentType.BARREL) == 2) {
bone.setHidden(true);
} else {
bone.setHidden(false);
bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5)));
bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5)));
bone.setRotZ((float) (0.5 * (Math.random() - 0.5)));
}
}
ItemModelHelper.handleGunAttachments(bone, itemStack, name); ItemModelHelper.handleGunAttachments(bone, itemStack, name);
} }

View file

@ -16534,21 +16534,7 @@
{ {
"name": "flare", "name": "flare",
"parent": "0", "parent": "0",
"pivot": [0.52734, 1.86914, -20.03672], "pivot": [0.52734, 1.86914, -20.03672]
"cubes": [
{
"origin": [-2.47266, -1.1375, -20.03672],
"size": [6, 6.01328, 0],
"uv": {
"north": {"uv": [124.75, 46.375], "uv_size": [-3.25, 3.375]},
"east": {"uv": [0, 0], "uv_size": [0, 8]},
"south": {"uv": [78.375, 1.125], "uv_size": [48.25, 42.125]},
"west": {"uv": [0, 0], "uv_size": [0, 8]},
"up": {"uv": [8, 0], "uv_size": [-8, 0]},
"down": {"uv": [8, 0], "uv_size": [-8, 0]}
}
}
]
}, },
{ {
"name": "Righthand", "name": "Righthand",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB