diff --git a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java index 73993ce..877accc 100644 --- a/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java +++ b/common/src/main/java/com/xtracr/realcamera/RealCameraCore.java @@ -27,27 +27,27 @@ public class RealCameraCore { private static float pitch, yaw, roll; public static float getPitch(float f) { - if (currentTarget.bindRotation()) return pitch; + if (currentTarget.bindRotation) return pitch; return f; } public static float getYaw(float f) { - if (currentTarget.bindRotation()) return yaw; + if (currentTarget.bindRotation) return yaw; return f; } public static float getRoll(float f) { if (config().isClassic()) return f + config().getClassicRoll(); - if (currentTarget.bindRotation()) return roll; + if (currentTarget.bindRotation) return roll; return f; } public static Vec3d getPos(Vec3d vec3d) { - return new Vec3d(currentTarget.bindX() ? pos.getX() : vec3d.getX(), currentTarget.bindY() ? pos.getY() : vec3d.getY(), currentTarget.bindZ() ? pos.getZ() : vec3d.getZ()); + return new Vec3d(currentTarget.bindX ? pos.getX() : vec3d.getX(), currentTarget.bindY ? pos.getY() : vec3d.getY(), currentTarget.bindZ ? pos.getZ() : vec3d.getZ()); } public static Vec3d getCameraPos(Vec3d vec3d) { - return new Vec3d(currentTarget.bindX() ? cameraPos.getX() : vec3d.getX(), currentTarget.bindY() ? cameraPos.getY() : vec3d.getY(), currentTarget.bindZ() ? cameraPos.getZ() : vec3d.getZ()); + return new Vec3d(currentTarget.bindX ? cameraPos.getX() : vec3d.getX(), currentTarget.bindY ? cameraPos.getY() : vec3d.getY(), currentTarget.bindZ ? cameraPos.getZ() : vec3d.getZ()); } public static void setCameraPos(Vec3d vec3d) { @@ -62,28 +62,10 @@ public static boolean isActive() { return active; } - public static void renderEntity(VertexConsumerProvider vertexConsumers) { - Matrix3f normalMatrix = new Matrix3f().rotate(RotationAxis.POSITIVE_Z.rotationDegrees(roll)) - .rotate(RotationAxis.POSITIVE_X.rotationDegrees(pitch)) - .rotate(RotationAxis.POSITIVE_Y.rotationDegrees(yaw + 180.0f)) - .transpose().invert(); - Matrix4f positionMatrix = new Matrix4f(normalMatrix).translate((float) -pos.getX(), (float) -pos.getY(), (float) -pos.getZ()); - BiFunction function = (renderLayer, vertices) -> { - double depth = currentTarget.disablingDepth(); - int count = vertices.length; - VertexRecorder.Vertex[] quad = new VertexRecorder.Vertex[count]; - for (int i = 0; i < count; i++) quad[i] = vertices[i].transform(positionMatrix, normalMatrix); - for (VertexRecorder.Vertex vertex : quad) if (vertex.z() < -depth) return quad; - return null; - }; - recorder.drawByAnother(vertexConsumers, renderLayer -> true, function); - } - - public static void computeCamera(MinecraftClient client, float tickDelta) { - // GameRenderer.renderWorld + public static void updateModel(MinecraftClient client, float tickDelta) { recorder.clear(); - Entity entity = client.getCameraEntity(); // WorldRenderer.render + Entity entity = client.getCameraEntity(); EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher(); dispatcher.configure(client.world, client.gameRenderer.getCamera(), client.targetedEntity); if (entity.age == 0) { @@ -98,11 +80,30 @@ public static void computeCamera(MinecraftClient client, float tickDelta) { MathHelper.lerp(tickDelta, entity.prevYaw, entity.getYaw()), tickDelta, new MatrixStack(), recorder, dispatcher.getLight(entity, tickDelta)); recorder.buildLastRecord(); + } + + public static void renderCameraEntity(VertexConsumerProvider vertexConsumers) { + Matrix3f normalMatrix = new Matrix3f().rotate(RotationAxis.POSITIVE_Z.rotationDegrees(roll)) + .rotate(RotationAxis.POSITIVE_X.rotationDegrees(pitch)) + .rotate(RotationAxis.POSITIVE_Y.rotationDegrees(yaw + 180.0f)) + .transpose().invert(); + Matrix4f positionMatrix = new Matrix4f(normalMatrix).translate((float) -pos.getX(), (float) -pos.getY(), (float) -pos.getZ()); + BiFunction function = (renderLayer, vertices) -> { + double depth = currentTarget.disablingDepth; + int count = vertices.length; + VertexRecorder.Vertex[] quad = new VertexRecorder.Vertex[count]; + for (int i = 0; i < count; i++) quad[i] = vertices[i].transform(positionMatrix, normalMatrix); + for (VertexRecorder.Vertex vertex : quad) if (vertex.z() < -depth) return quad; + return null; + }; + recorder.drawByAnother(vertexConsumers, renderLayer -> true, function); + } + public static void computeCamera() { currentTarget = new BindingTarget(); Matrix3f normal = new Matrix3f(); for (BindingTarget target : config().getTargetList()) { - if (!recorder.setCurrent(renderLayer -> renderLayer.toString().contains(target.textureId()))) continue; + if (!recorder.setCurrent(renderLayer -> renderLayer.toString().contains(target.textureId))) continue; try { pos = recorder.getTargetPosAndRot(target, normal); currentTarget = target; diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindingTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindingTarget.java index 4646a3b..e608632 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindingTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindingTarget.java @@ -9,12 +9,12 @@ public class BindingTarget { createDefaultTarget("skin_head", "minecraft:skins/", 5, false), createDefaultTarget("minecraft_head_2", "minecraft:textures/entity/player/", 0, true), createDefaultTarget("skin_head_2", "minecraft:skins/", 0, true)); - private final String name, textureId; - private final int priority; - private final float forwardU, forwardV, upwardU, upwardV, posU, posV, disablingDepth; - private final boolean bindX, bindY, bindZ, bindRotation; - protected double scale, offsetX, offsetY, offsetZ; - protected float pitch, yaw, roll; + public final String name, textureId; + public final int priority; + public final float forwardU, forwardV, upwardU, upwardV, posU, posV, disablingDepth; + public final boolean bindX, bindY, bindZ, bindRotation; + public double scale, offsetX, offsetY, offsetZ; + public float pitch, yaw, roll; public BindingTarget() { this(null, null, 0, 0, 0, 0, 0, 0, 0, 0.2f, false, true, false, false, 1, 0, 0, 0, 0, 0, 0); @@ -52,70 +52,6 @@ public boolean isEmpty() { return name == null; } - public String name() { - return name; - } - - public String textureId() { - return textureId; - } - - public int priority() { - return priority; - } - - public float forwardU() { - return forwardU; - } - - public float forwardV() { - return forwardV; - } - - public float upwardU() { - return upwardU; - } - - public float upwardV() { - return upwardV; - } - - public float posU() { - return posU; - } - - public float posV() { - return posV; - } - - public float disablingDepth() { - return disablingDepth; - } - - public boolean bindX() { - return bindX; - } - - public boolean bindY() { - return bindY; - } - - public boolean bindZ() { - return bindZ; - } - - public boolean bindRotation() { - return bindRotation; - } - - public double scale() { - return scale; - } - - public void setScale(double scale) { - this.scale = scale; - } - public double offsetX() { return offsetX * scale; } diff --git a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java index 55244e3..a920d94 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java @@ -137,6 +137,11 @@ public static Screen create(Screen parent) { .setTooltip(Text.translatable(TOOLTIP + "adjustOffset")) .setSaveConsumer(b -> config.binding.adjustOffset = b) .build()); + binding.addEntry(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "updateModel"), config.binding.updateModel) + .setDefaultValue(true) + .setTooltip(Text.translatable(TOOLTIP + "updateModel")) + .setSaveConsumer(b -> config.binding.updateModel = b) + .build()); return builder.build(); } diff --git a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java index e28a462..516a30b 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/ModConfig.java @@ -150,6 +150,10 @@ public void adjustOffsetZ(int count) { } // binding + public boolean updateModelAgain() { + return binding.updateModel; + } + public List getTargetList() { binding.clamp(); return binding.targetList; @@ -158,10 +162,10 @@ public List getTargetList() { public void putTarget(BindingTarget target) { if (target.isEmpty()) return; IntStream.range(0, binding.targetList.size()) - .filter(i -> binding.targetList.get(i).name().equals(target.name())) + .filter(i -> binding.targetList.get(i).name.equals(target.name)) .findAny() .ifPresentOrElse(i -> binding.targetList.set(i, target), () -> binding.targetList.add(target)); - binding.targetList.sort(Comparator.comparingInt(t -> -t.priority())); + binding.targetList.sort(Comparator.comparingInt(t -> -t.priority)); } public static class Classic { @@ -204,6 +208,7 @@ public AdjustMode cycle() { public static class Binding { public boolean adjustOffset = true; + public boolean updateModel = true; public List targetList = new ArrayList<>(BindingTarget.defaultTargets); private void clamp() { diff --git a/common/src/main/java/com/xtracr/realcamera/gui/DoubleSliderWidget.java b/common/src/main/java/com/xtracr/realcamera/gui/DoubleSliderWidget.java index 9535a0c..866a418 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/DoubleSliderWidget.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/DoubleSliderWidget.java @@ -7,14 +7,14 @@ import java.util.function.Function; public class DoubleSliderWidget extends SliderWidget { + private final Function textFactory; private final double min, max; - private final Function textFunction; - public DoubleSliderWidget(int width, int height, double value, double min, double max, Function textFunction) { - super(0, 0, width, height, textFunction.apply(value), MathHelper.clamp(0, (value - min) / (max - min), 1)); + public DoubleSliderWidget(int width, int height, double value, double min, double max, Function textFactory) { + super(0, 0, width, height, textFactory.apply(value), MathHelper.clamp(0, (value - min) / (max - min), 1)); + this.textFactory = textFactory; this.min = min; this.max = max; - this.textFunction = textFunction; } public double getValue() { @@ -28,7 +28,7 @@ public void setValue(double value) { @Override protected void updateMessage() { - setMessage(textFunction.apply(getValue())); + setMessage(textFactory.apply(getValue())); } @Override diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java index 0a0251d..18c9040 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -83,7 +83,7 @@ public int getFocusedIndex(int mouseX, int mouseY, int layers) { public void preview(DrawContext context, BindingTarget target, int entitySize, int forwardArgb, int upwardArgb, int leftArgb) { drawByAnother(context.getVertexConsumers()); context.draw(); - target.setScale(entitySize * target.scale()); + target.scale *= entitySize; Matrix3f normal = new Matrix3f(); Vec3d pos; try { diff --git a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java index 1b2c2ca..fd2ac6b 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -170,7 +170,7 @@ private void initRightWidgets(final int page) { addDrawableChild(new TexturedButton(x + xSize - 21, y + 4, 16, 16, 16, 32, button -> initWidgets(category, (page + 1) % pages))); for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, targetList.size()); i++) { BindingTarget target = targetList.get(i); - String name = target.name(); + String name = target.name; adder.add(createButton(Text.literal(name), widgetWidth * 2 - 18, button -> loadBindingTarget(target))); adder.add(new TexturedButton(32, 32, button -> { targetList.remove(target); @@ -262,27 +262,27 @@ protected BindingTarget generateBindingTarget() { protected void loadBindingTarget(BindingTarget target) { if (target.isEmpty()) return; - nameField.setText(target.name()); - textureIdField.setText(target.textureId()); - priorityField.setValue(target.priority()); - forwardUField.setValue(target.forwardU()); - forwardVField.setValue(target.forwardV()); - upwardUField.setValue(target.upwardU()); - upwardVField.setValue(target.upwardV()); - posUField.setValue(target.posU()); - posVField.setValue(target.posV()); - depthField.setValue(target.disablingDepth()); - scaleField.setValue((float) target.scale()); - bindXButton.setValue(target.bindX() ? 0 : 1); - offsetXSlider.setValue(target.offsetX()); - bindYButton.setValue(target.bindY() ? 0 : 1); - offsetYSlider.setValue(target.offsetY()); - bindZButton.setValue(target.bindZ() ? 0 : 1); - offsetZSlider.setValue(target.offsetZ()); - bindRotButton.setValue(target.bindRotation() ? 0 : 1); - pitchSlider.setValue(target.pitch()); - yawSlider.setValue(target.yaw()); - rollSlider.setValue(target.roll()); + nameField.setText(target.name); + textureIdField.setText(target.textureId); + priorityField.setValue(target.priority); + forwardUField.setValue(target.forwardU); + forwardVField.setValue(target.forwardV); + upwardUField.setValue(target.upwardU); + upwardVField.setValue(target.upwardV); + posUField.setValue(target.posU); + posVField.setValue(target.posV); + depthField.setValue(target.disablingDepth); + scaleField.setValue((float) target.scale); + bindXButton.setValue(target.bindX ? 0 : 1); + offsetXSlider.setValue(target.offsetX); + bindYButton.setValue(target.bindY ? 0 : 1); + offsetYSlider.setValue(target.offsetY); + bindZButton.setValue(target.bindZ ? 0 : 1); + offsetZSlider.setValue(target.offsetZ); + bindRotButton.setValue(target.bindRotation ? 0 : 1); + pitchSlider.setValue(target.pitch); + yawSlider.setValue(target.yaw); + rollSlider.setValue(target.roll); } private ButtonWidget createButton(Text message, int width, ButtonWidget.PressAction onPress) { diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java index 6135f6c..da1c706 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinCamera.java @@ -34,7 +34,7 @@ public abstract class MixinCamera { private float yaw; @Inject(method = "update", at = @At("RETURN")) - private void realCamera$updateCamera(BlockView area, Entity focusedEntity, boolean thirdPerson, boolean inverseView, float tickDelta, CallbackInfo cInfo) { + private void realcamera$updateCamera(BlockView area, Entity focusedEntity, boolean thirdPerson, boolean inverseView, float tickDelta, CallbackInfo cInfo) { if (!RealCameraCore.isActive()) return; final ModConfig config = ConfigFile.modConfig; Vec3d startVec = pos; @@ -57,12 +57,12 @@ public abstract class MixinCamera { setPos(prevPos); setRotation(RealCameraCore.getYaw(yaw), RealCameraCore.getPitch(pitch)); } - realCamera$clipToSpace(startVec); + realcamera$clipToSpace(startVec); RealCameraCore.setCameraPos(pos); } @Unique - private void realCamera$clipToSpace(Vec3d startVec) { + private void realcamera$clipToSpace(Vec3d startVec) { Vec3d offset = pos.subtract(startVec); final float depth = 0.085F; for (int i = 0; i < 8; ++i) { diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java index 1de2ca2..7f1dc69 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinGameRenderer.java @@ -29,7 +29,7 @@ public abstract class MixinGameRenderer { @Final private Camera camera; @ModifyVariable(method = "updateTargetedEntity", at = @At("STORE"), ordinal = 0) - private EntityHitResult realCamera$modifyEntityHitResult(EntityHitResult entityHitResult) { + private EntityHitResult realcamera$modifyEntityHitResult(EntityHitResult entityHitResult) { CrosshairUtil.capturedEntityHitResult = entityHitResult; if (!ConfigFile.modConfig.isCrosshairDynamic() && RealCameraCore.isActive()) { Vec3d startVec = RaycastUtil.getStartVec(); @@ -43,15 +43,16 @@ public abstract class MixinGameRenderer { } @Inject(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;update(Lnet/minecraft/world/BlockView;Lnet/minecraft/entity/Entity;ZZF)V")) - private void realCamera$onBeforeCameraUpdate(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo cInfo) { + private void realcamera$onBeforeCameraUpdate(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo cInfo) { RealCameraCore.init(client); if (RealCameraCore.isActive() && !ConfigFile.modConfig.isClassic()) { - RealCameraCore.computeCamera(client, tickDelta); + RealCameraCore.updateModel(client, tickDelta); + RealCameraCore.computeCamera(); } } @Inject(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;setupFrustum(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/util/math/Vec3d;Lorg/joml/Matrix4f;)V")) - private void realCamera$onBeforeSetupFrustum(CallbackInfo cInfo) { + private void realcamera$onBeforeSetupFrustum(CallbackInfo cInfo) { if (RealCameraCore.isActive() && !ConfigFile.modConfig.isClassic()) { ((CameraAccessor) camera).invokeSetPos(RealCameraCore.getCameraPos(camera.getPos())); } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinInGameHud.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinInGameHud.java index 134a51a..b0036de 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinInGameHud.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinInGameHud.java @@ -13,7 +13,7 @@ @Mixin(InGameHud.class) public abstract class MixinInGameHud { @Inject(method = "renderCrosshair(Lnet/minecraft/client/gui/DrawContext;)V", at = @At("HEAD")) - private void realCamera$onRenderCrosshairHEAD(DrawContext context, CallbackInfo cInfo) { + private void realcamera$onRenderCrosshairHEAD(DrawContext context, CallbackInfo cInfo) { if (ConfigFile.modConfig.isCrosshairDynamic() && RealCameraCore.isActive()) { context.getMatrices().push(); CrosshairUtil.translateMatrices(context.getMatrices()); @@ -21,7 +21,7 @@ public abstract class MixinInGameHud { } @Inject(method = "renderCrosshair(Lnet/minecraft/client/gui/DrawContext;)V", at = @At("RETURN")) - private void realCamera$onRenderCrosshairRETURN(DrawContext context, CallbackInfo cInfo) { + private void realcamera$onRenderCrosshairRETURN(DrawContext context, CallbackInfo cInfo) { if (ConfigFile.modConfig.isCrosshairDynamic() && RealCameraCore.isActive()) { context.getMatrices().pop(); } diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java index bd2cdfe..044ad58 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinItem.java @@ -16,7 +16,7 @@ @Mixin(Item.class) public abstract class MixinItem { @Inject(method = "raycast", at = @At("HEAD"), cancellable = true) - private static void realCamera$coverRaycast(World world, PlayerEntity player, RaycastContext.FluidHandling fluidHandling, + private static void realcamera$coverRaycast(World world, PlayerEntity player, RaycastContext.FluidHandling fluidHandling, CallbackInfoReturnable cInfo) { if (!ConfigFile.modConfig.isCrosshairDynamic() && RealCameraCore.isActive()) { RaycastUtil.update(player, 25.0d, 1.0f); diff --git a/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java b/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java index e95e018..dae4182 100644 --- a/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java +++ b/common/src/main/java/com/xtracr/realcamera/mixin/MixinWorldRenderer.java @@ -3,6 +3,7 @@ import com.xtracr.realcamera.RealCameraCore; import com.xtracr.realcamera.config.ConfigFile; import com.xtracr.realcamera.config.ModConfig; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; @@ -18,6 +19,8 @@ @Mixin(WorldRenderer.class) public abstract class MixinWorldRenderer { + @Shadow + @Final private MinecraftClient client; @Shadow @Final private BufferBuilderStorage bufferBuilders; @@ -28,7 +31,10 @@ public abstract class MixinWorldRenderer { if (!RealCameraCore.isActive() || !config.isRendering() || (camera.getFocusedEntity() instanceof PlayerEntity player && player.isUsingSpyglass())) return; VertexConsumerProvider.Immediate immediate = this.bufferBuilders.getEntityVertexConsumers(); Vec3d cameraPos = camera.getPos(); - if (!config.isClassic()) RealCameraCore.renderEntity(immediate); + if (!config.isClassic()) { + if (config.updateModelAgain()) RealCameraCore.updateModel(client, tickDelta); + RealCameraCore.renderCameraEntity(immediate); + } else renderEntity(camera.getFocusedEntity(), cameraPos.getX(), cameraPos.getY(), cameraPos.getZ(), tickDelta, matrices, immediate); } diff --git a/common/src/main/java/com/xtracr/realcamera/util/VertexRecorder.java b/common/src/main/java/com/xtracr/realcamera/util/VertexRecorder.java index f9afab0..b1bb16c 100644 --- a/common/src/main/java/com/xtracr/realcamera/util/VertexRecorder.java +++ b/common/src/main/java/com/xtracr/realcamera/util/VertexRecorder.java @@ -65,9 +65,9 @@ public boolean setCurrent(Predicate predicate) { } public Vec3d getTargetPosAndRot(BindingTarget target, Matrix3f normal) throws NullPointerException, ArithmeticException { - Vec3d forward = Objects.requireNonNull(getQuad(target.forwardU(), target.forwardV()))[0].normal().normalize(); - Vec3d left = Objects.requireNonNull(getQuad(target.upwardU(), target.upwardV()))[0].normal().crossProduct(forward).normalize(); - Vec3d center = getPos(Objects.requireNonNull(getQuad(target.posU(), target.posV())), target.posU(), target.posV()); + Vec3d forward = Objects.requireNonNull(getQuad(target.forwardU, target.forwardV))[0].normal().normalize(); + Vec3d left = Objects.requireNonNull(getQuad(target.upwardU, target.upwardV))[0].normal().crossProduct(forward).normalize(); + Vec3d center = getPos(Objects.requireNonNull(getQuad(target.posU, target.posV)), target.posU, target.posV); if (!MathUtil.isFinite(forward) || !MathUtil.isFinite(left) || !MathUtil.isFinite(center)) throw new ArithmeticException(); normal.set(left.toVector3f(), forward.crossProduct(left).toVector3f(), forward.toVector3f()); Vector3f offset = new Vector3f((float) target.offsetZ(), (float) target.offsetY(), (float) target.offsetX()).mul(normal); diff --git a/common/src/main/resources/assets/realcamera/lang/en_us.json b/common/src/main/resources/assets/realcamera/lang/en_us.json index d676263..2da04ea 100644 --- a/common/src/main/resources/assets/realcamera/lang/en_us.json +++ b/common/src/main/resources/assets/realcamera/lang/en_us.json @@ -38,7 +38,7 @@ "config.option.xtracr_realcamera.roll": "Roll", "config.option.xtracr_realcamera.toModelViewGui": "For detailed settings, please go to the %s screen (key bind need to be set to open it)", "config.option.xtracr_realcamera.adjustOffset": "Adjust Camera Offset", - "config.option.xtracr_realcamera.autoBind": "Auto Bind", + "config.option.xtracr_realcamera.updateModel": "Update Model State Again Before Rendering", "config.tooltip.xtracr_realcamera.isClassic": "Classic mode only makes simple changes to the position and rotation of camera", "config.tooltip.xtracr_realcamera.dynamicCrosshair": "When enabled, the crosshair will follow the player's view, ensuring consistent hit result\nRecommended to enable when Jade, WTHIT or similar mods are installed", "config.tooltip.xtracr_realcamera.renderModel": "Render player model in first-person perspective", @@ -46,6 +46,7 @@ "config.tooltip.xtracr_realcamera.classicAdjustMode": "Determine which to adjust when pressing the adjustment key", "config.tooltip.xtracr_realcamera.scale": "Control the size of the offsets", "config.tooltip.xtracr_realcamera.adjustOffset": "When pressing the adjustment key, adjust the offset or rotation of camera", + "config.tooltip.xtracr_realcamera.updateModel": "Have some impact on performance, recommended to turn off, if no visible difference after turned off\nCode running order: update player model (advanced here by RealCamera) -> update camera -> some mods may be initialized here -> (update player model again) -> render player model", "screen.xtracr_realcamera.modelView_title": "Model View", "screen.widget.xtracr_realcamera.modelView_selectMode": "Selecting", diff --git a/common/src/main/resources/assets/realcamera/lang/zh_cn.json b/common/src/main/resources/assets/realcamera/lang/zh_cn.json index 3a47432..e27a113 100644 --- a/common/src/main/resources/assets/realcamera/lang/zh_cn.json +++ b/common/src/main/resources/assets/realcamera/lang/zh_cn.json @@ -38,7 +38,7 @@ "config.option.xtracr_realcamera.roll": "翻滚角", "config.option.xtracr_realcamera.toModelViewGui": "详细设置请前往%s界面(需设置快捷键来打开它)", "config.option.xtracr_realcamera.adjustOffset": "调整摄像头偏移", - "config.option.xtracr_realcamera.autoBind": "自动绑定", + "config.option.xtracr_realcamera.updateModel": "在渲染前再次更新模型状态", "config.tooltip.xtracr_realcamera.isClassic": "经典模式只对摄像头的位置和旋转做简单的修改", "config.tooltip.xtracr_realcamera.dynamicCrosshair": "在开启状态下,十字准心会随着玩家的视线移动,确保命中结果不受影响\n在安装了Jade、WTHIT或类似模组时建议启用", "config.tooltip.xtracr_realcamera.renderModel": "在第一人称视角下渲染玩家模型", @@ -46,6 +46,7 @@ "config.tooltip.xtracr_realcamera.classicAdjustMode": "决定当前按下调整键时调整哪一个", "config.tooltip.xtracr_realcamera.scale": "控制偏移量的大小", "config.tooltip.xtracr_realcamera.adjustOffset": "当前按下调整键时是调整摄像头的偏移还是旋转", + "config.tooltip.xtracr_realcamera.updateModel": "会对性能产生一定影响,建议关闭,如果关闭后没有可见的区别\n代码运行顺序:更新玩家模型(被RealCamera提前至此)->更新摄像头->部分模组可能在此处初始化->(再次更新玩家模型)->渲染玩家模型", "screen.xtracr_realcamera.modelView_title": "模型视图", "screen.widget.xtracr_realcamera.modelView_selectMode": "选择", diff --git a/fabric/src/main/java/com/xtracr/realcamera/mixin/GameRendererEvents.java b/fabric/src/main/java/com/xtracr/realcamera/mixin/GameRendererEvents.java index b65dc34..8f2378f 100644 --- a/fabric/src/main/java/com/xtracr/realcamera/mixin/GameRendererEvents.java +++ b/fabric/src/main/java/com/xtracr/realcamera/mixin/GameRendererEvents.java @@ -12,7 +12,7 @@ @Mixin(GameRenderer.class) public abstract class GameRendererEvents { @Inject(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;update(Lnet/minecraft/world/BlockView;Lnet/minecraft/entity/Entity;ZZF)V", shift = At.Shift.AFTER)) - private void realCamera$onAfterCameraUpdate(float tickDelta, long limitTime, MatrixStack matrixStack, CallbackInfo cInfo) { + private void realcamera$onAfterCameraUpdate(float tickDelta, long limitTime, MatrixStack matrixStack, CallbackInfo cInfo) { if (RealCameraCore.isActive()) { matrixStack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(RealCameraCore.getRoll(0))); }