Skip to content

Commit

Permalink
Use ShipMountedToData when rendering entities
Browse files Browse the repository at this point in the history
  • Loading branch information
StewStrong committed Dec 24, 2023
1 parent d9d9a3e commit b9cf9be
Showing 1 changed file with 46 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3d;
import org.joml.Vector3dc;
import org.joml.primitives.AABBd;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.valkyrienskies.core.api.ships.ClientShip;
import org.valkyrienskies.core.api.ships.properties.ShipTransform;
import org.valkyrienskies.mod.common.VSGameUtilsKt;
import org.valkyrienskies.mod.common.entity.ShipMountedToData;
import org.valkyrienskies.mod.common.entity.handling.VSEntityManager;
import org.valkyrienskies.mod.common.util.VectorConversionsMCKt;

Expand All @@ -32,27 +37,49 @@ <T extends Entity> void render(
final T entity, final double x, final double y, final double z, final float rotationYaw,
final float partialTicks, final PoseStack matrixStack,
final MultiBufferSource buffer, final int packedLight, final CallbackInfo ci,
final EntityRenderer<T> entityRenderer) {
final EntityRenderer<T> entityRenderer
) {
final ShipMountedToData shipMountedToData = VSGameUtilsKt.getShipMountedToData(entity, partialTicks);

final ClientShip ship =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level, entity.blockPosition());
if (ship != null) {
// Remove the earlier applied translation
matrixStack.popPose();
matrixStack.pushPose();
if (shipMountedToData != null) {
final ShipTransform renderTransform = ((ClientShip) shipMountedToData.getShipMountedTo()).getRenderTransform();

VSEntityManager.INSTANCE.getHandler(entity)
.applyRenderTransform(ship, entity, entityRenderer, x, y, z,
rotationYaw, partialTicks, matrixStack,
buffer, packedLight);
} else if (entity.isPassenger()) {
final ClientShip vehicleShip =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level,
entity.getVehicle().blockPosition());
// If the entity is a passenger and that vehicle is in ship space
if (vehicleShip != null) {
VSEntityManager.INSTANCE.getHandler(entity.getVehicle())
.applyRenderOnMountedEntity(vehicleShip, entity.getVehicle(), entity, partialTicks, matrixStack);
final Vec3 entityPosition = entity.getPosition(partialTicks);
final Vector3dc transformed = renderTransform.getShipToWorld().transformPosition(shipMountedToData.getMountPosInShip(), new Vector3d());

final double camX = x - entityPosition.x;
final double camY = y - entityPosition.y;
final double camZ = z - entityPosition.z;

final Vec3 offset = entityRenderer.getRenderOffset(entity, partialTicks);
final Vector3dc scale = renderTransform.getShipToWorldScaling();

matrixStack.translate(transformed.x() + camX, transformed.y() + camY, transformed.z() + camZ);
matrixStack.mulPose(VectorConversionsMCKt.toMinecraft(renderTransform.getShipToWorldRotation()));
matrixStack.scale((float) scale.x(), (float) scale.y(), (float) scale.z());
matrixStack.translate(offset.x, offset.y, offset.z);
} else {
final ClientShip ship =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level, entity.blockPosition());
if (ship != null) {
// Remove the earlier applied translation
matrixStack.popPose();
matrixStack.pushPose();

VSEntityManager.INSTANCE.getHandler(entity)
.applyRenderTransform(ship, entity, entityRenderer, x, y, z,
rotationYaw, partialTicks, matrixStack,
buffer, packedLight);
} else if (entity.isPassenger()) {
final ClientShip vehicleShip =
(ClientShip) VSGameUtilsKt.getShipObjectManagingPos(entity.level,
entity.getVehicle().blockPosition());
// If the entity is a passenger and that vehicle is in ship space
if (vehicleShip != null) {
VSEntityManager.INSTANCE.getHandler(entity.getVehicle())
.applyRenderOnMountedEntity(vehicleShip, entity.getVehicle(), entity, partialTicks,
matrixStack);
}
}
}
}
Expand Down

0 comments on commit b9cf9be

Please sign in to comment.