Skip to content

Commit 6f09695

Browse files
committed
Update to 0.5.5-beta
1 parent eb005c6 commit 6f09695

22 files changed

+231
-234
lines changed

changelog.md

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
* 0.5.4-beta:
2323
* Added feature #15, fixed #35
2424
* Changed the way of clipping to space to avoid #23 and #32
25+
* 0.5.5-beta:
26+
* Changed the way of clipping to space to avoid #37
27+
* Deleted the option of disabling "clip to space"
28+
* Separate the part that modifies camera from the part that computes it
2529

2630
* 0.4.0-alpha:
2731
* Fixed an issue where the camera would not follow the model action when the player started/ended sneaking
@@ -99,6 +103,10 @@
99103
* 0.5.4-beta:
100104
* 添加了功能#15, 修复#35
101105
* 修改了clip to space的方式来避免#23#32
106+
* 0.5.5-beta:
107+
* 修改了clip to space的方式来避免#37
108+
* 删除了禁用"clip to space"的选项
109+
* 将修改摄像头的部分与计算它的部分分离开来
102110

103111
* 0.4.0-alpha:
104112
* 修复了玩家开始/结束潜行时摄像头未跟上模型动作的问题

common/src/main/java/com/xtracr/realcamera/RealCameraCore.java

+52-103
Original file line numberDiff line numberDiff line change
@@ -5,96 +5,95 @@
55
import com.xtracr.realcamera.compat.PhysicsModCompat;
66
import com.xtracr.realcamera.config.ConfigFile;
77
import com.xtracr.realcamera.config.ModConfig;
8-
import com.xtracr.realcamera.mixins.CameraAccessor;
98
import com.xtracr.realcamera.mixins.PlayerEntityRendererAccessor;
109
import com.xtracr.realcamera.utils.MathUtils;
1110
import com.xtracr.realcamera.utils.Matrix3fc;
1211
import net.minecraft.client.MinecraftClient;
1312
import net.minecraft.client.network.AbstractClientPlayerEntity;
1413
import net.minecraft.client.network.ClientPlayerEntity;
15-
import net.minecraft.client.render.Camera;
1614
import net.minecraft.client.render.entity.PlayerEntityRenderer;
1715
import net.minecraft.client.render.entity.model.PlayerEntityModel;
1816
import net.minecraft.client.util.math.MatrixStack;
1917
import net.minecraft.entity.EntityPose;
2018
import net.minecraft.entity.LivingEntity;
21-
import net.minecraft.util.hit.HitResult;
2219
import net.minecraft.util.math.Direction;
2320
import net.minecraft.util.math.MathHelper;
2421
import net.minecraft.util.math.Vec3d;
25-
import net.minecraft.util.math.Vec3f;
2622
import net.minecraft.util.math.Vector4f;
27-
import net.minecraft.world.RaycastContext;
2823

2924
public class RealCameraCore {
3025
private static final ModConfig config = ConfigFile.modConfig;
3126

3227
private static String status = "Successful";
33-
private static float cameraRoll = 0.0F;
28+
private static float pitch = 0.0F;
29+
private static float yaw = 0.0F;
30+
private static float roll = 0.0F;
31+
private static Vec3d pos = Vec3d.ZERO;
32+
private static Vec3d modelOffset = Vec3d.ZERO;
3433

3534
public static String getStatus() {
3635
return status;
3736
}
3837

38+
public static float getPitch() {
39+
return pitch;
40+
}
41+
42+
public static float getYaw() {
43+
return yaw;
44+
}
45+
3946
public static float getRoll() {
40-
return cameraRoll;
47+
return roll;
4148
}
4249

43-
public static boolean isActive() {
44-
MinecraftClient client = MinecraftClient.getInstance();
45-
return config.isEnabled() && client.options.getPerspective().isFirstPerson() && client.gameRenderer.getCamera() != null
46-
&& client.player != null && !config.disableModWhen(client);
50+
public static Vec3d getPos() {
51+
return pos;
4752
}
4853

49-
public static void updateCamera(Camera camera, MinecraftClient client, float tickDelta) {
50-
cameraRoll = 0.0F;
54+
public static Vec3d getModelOffset() {
55+
return modelOffset;
56+
}
5157

52-
if (config.isRendering() && !config.disableRenderingWhen(client)) {
53-
((CameraAccessor) camera).setThirdPerson(true);
54-
}
58+
public static void setModelOffset(Vec3d vec3d) {
59+
modelOffset = vec3d;
60+
}
5561

56-
if (config.isClassic()) {
57-
classicModeUpdate(camera, client, tickDelta);
58-
} else {
59-
// GameRenderer.render
60-
bindingModeUpdate(camera, client, tickDelta, new MatrixStack());
61-
}
62+
public static boolean isActive() {
63+
MinecraftClient client = MinecraftClient.getInstance();
64+
return config.isEnabled() && client.options.getPerspective().isFirstPerson() && client.gameRenderer.getCamera() != null
65+
&& client.player != null && !config.shouldDisableMod(client);
6266
}
6367

64-
private static void classicModeUpdate(Camera camera, MinecraftClient client, float tickDelta) {
65-
ClientPlayerEntity player = client.player;
68+
public static void computeCamera(MinecraftClient client, float tickDelta) {
69+
modelOffset = Vec3d.ZERO;
70+
roll = config.getClassicRoll();
71+
if (config.isClassic()) return;
6672

67-
float centerYaw = camera.getYaw();
68-
float pitch = camera.getPitch() + config.getClassicPitch();
69-
float yaw = centerYaw - config.getClassicYaw();
70-
cameraRoll = config.getClassicRoll();
71-
Vec3d offset = new Vec3d(config.getClassicX(), config.getClassicY(), config.getClassicZ()).multiply(config.getScale());
72-
Vec3d center = new Vec3d(config.getCenterX(), config.getCenterY(), config.getCenterZ()).multiply(config.getScale());
73+
// GameRenderer.renderWorld
74+
MatrixStack matrixStack = new MatrixStack();
75+
virtualRender(client, tickDelta, matrixStack);
7376

74-
if (player.isSneaking()) {
75-
center = center.add(0.0D, -0.021875D, 0.0D);
76-
}
77-
if (config.compatPehkui()) {
78-
offset = PehkuiCompat.scaleVec3d(offset, player, tickDelta);
79-
center = PehkuiCompat.scaleVec3d(center, player, tickDelta);
80-
}
77+
// ModelPart$Cuboid.renderCuboid
78+
Vector4f offset = new Vector4f((float)(config.getBindingZ() * config.getScale()),
79+
-(float)(config.getBindingY() * config.getScale()),
80+
-(float)(config.getBindingX() * config.getScale()), 1.0F);
81+
offset.transform(matrixStack.peek().getPositionMatrix());
82+
pos = new Vec3d(offset.getX(), offset.getY(), offset.getZ());
8183

82-
((CameraAccessor) camera).invokeSetRotation(centerYaw, 0.0F);
83-
((CameraAccessor) camera).invokeMoveBy(center.getX(), center.getY(), center.getZ());
84-
((CameraAccessor) camera).invokeSetRotation(yaw, pitch);
85-
Vec3d referVec = camera.getPos();
86-
((CameraAccessor) camera).invokeMoveBy(offset.getX(), offset.getY(), offset.getZ());
87-
clipCameraToSpace(camera, referVec);
84+
Matrix3fc normal = new Matrix3fc(matrixStack.peek().getNormalMatrix()).scale(1.0F, -1.0F, -1.0F);
85+
normal.rotateLocal((float) Math.toRadians(config.getBindingYaw()), normal.m10, normal.m11, normal.m12);
86+
normal.rotateLocal((float) Math.toRadians(config.getBindingPitch()), normal.m00, normal.m01, normal.m02);
87+
normal.rotateLocal((float) Math.toRadians(config.getBindingRoll()), normal.m20, normal.m21, normal.m22);
88+
Vec3d eulerAngle = MathUtils.getEulerAngleYXZ(normal).multiply(180.0D / Math.PI);
89+
pitch = (float) eulerAngle.getX();
90+
yaw = (float) -eulerAngle.getY();
91+
roll = config.isRollingBound() ? (float) eulerAngle.getZ() : config.getBindingRoll();
8892
}
8993

90-
private static void bindingModeUpdate(Camera camera, MinecraftClient client, float tickDelta, MatrixStack matrixStack) {
91-
92-
// GameRenderer.renderWorld
93-
matrixStack.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(camera.getPitch()));
94-
matrixStack.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(camera.getYaw() + 180.0F));
95-
matrixStack.peek().getNormalMatrix().loadIdentity();
96-
// WorldRenderer.render
94+
private static void virtualRender(MinecraftClient client, float tickDelta, MatrixStack matrixStack) {
9795
ClientPlayerEntity player = client.player;
96+
// WorldRenderer.render
9897
if (player.age == 0) {
9998
player.lastRenderX = player.getX();
10099
player.lastRenderY = player.getY();
@@ -103,68 +102,18 @@ private static void bindingModeUpdate(Camera camera, MinecraftClient client, flo
103102
// WorldRenderer.renderEntity
104103
Vec3d renderOffset = new Vec3d(MathHelper.lerp(tickDelta, player.lastRenderX, player.getX()),
105104
MathHelper.lerp(tickDelta, player.lastRenderY, player.getY()),
106-
MathHelper.lerp(tickDelta, player.lastRenderZ, player.getZ()))
107-
.subtract(camera.getPos());
105+
MathHelper.lerp(tickDelta, player.lastRenderZ, player.getZ()));
108106
// EntityRenderDispatcher.render
109107
if (config.compatPhysicsMod())
110-
PhysicsModCompat.renderStart(client.getEntityRenderDispatcher(), player, renderOffset.getX(),
111-
renderOffset.getY(), renderOffset.getZ(), MathHelper.lerp(tickDelta, player.prevYaw, player.getYaw()), tickDelta, matrixStack);
108+
PhysicsModCompat.renderStart(client.getEntityRenderDispatcher(), player, renderOffset.getX(), renderOffset.getY(),
109+
renderOffset.getZ(), MathHelper.lerp(tickDelta, player.prevYaw, player.getYaw()), tickDelta, matrixStack);
112110

113111
PlayerEntityRenderer playerRenderer = (PlayerEntityRenderer) client.getEntityRenderDispatcher().getRenderer(player);
114112
renderOffset = renderOffset.add(playerRenderer.getPositionOffset(player, tickDelta));
115113
matrixStack.translate(renderOffset.getX(), renderOffset.getY(), renderOffset.getZ());
116114

117115
if (config.compatPehkui()) PehkuiCompat.scaleMatrices(matrixStack, player, tickDelta);
118116

119-
virtualRender(player, playerRenderer, tickDelta, matrixStack);
120-
121-
// ModelPart$Cuboid.renderCuboid
122-
Vector4f offset = new Vector4f((float)(config.getBindingZ() * config.getScale()),
123-
-(float)(config.getBindingY() * config.getScale()),
124-
-(float)(config.getBindingX() * config.getScale()), 1.0F);
125-
offset.transform(matrixStack.peek().getPositionMatrix());
126-
127-
Vec3d referVec = camera.getPos();
128-
((CameraAccessor) camera).invokeMoveBy(-offset.getZ(), offset.getY(), -offset.getX());
129-
clipCameraToSpace(camera, referVec);
130-
131-
Matrix3fc normal = new Matrix3fc(matrixStack.peek().getNormalMatrix()).scale(1.0F, -1.0F, -1.0F);
132-
normal.rotateLocal((float) Math.toRadians(config.getBindingYaw()), normal.m10, normal.m11, normal.m12);
133-
normal.rotateLocal((float) Math.toRadians(config.getBindingPitch()), normal.m00, normal.m01, normal.m02);
134-
normal.rotateLocal((float) Math.toRadians(config.getBindingRoll()), normal.m20, normal.m21, normal.m22);
135-
Vec3d eulerAngle = MathUtils.getEulerAngleYXZ(normal).multiply(180.0D / Math.PI);
136-
137-
float pitch = config.isPitchingBound() ? (float) eulerAngle.getX() : camera.getPitch() + config.getBindingPitch();
138-
float yaw = config.isYawingBound() ? (float) eulerAngle.getY() : -camera.getYaw() + config.getBindingYaw();
139-
cameraRoll = config.isRollingBound() ? (float) eulerAngle.getZ() : config.getBindingRoll();
140-
((CameraAccessor) camera).invokeSetRotation(-yaw, pitch);
141-
}
142-
143-
private static void clipCameraToSpace(Camera camera, Vec3d referVec) {
144-
if (!config.doClipToSpace()) return;
145-
Vec3d offset = camera.getPos().subtract(referVec);
146-
boolean hitted = false;
147-
final float depth = 0.1F;
148-
for (int i = 0; i < 8; ++i) {
149-
float f = depth * ((i & 1) * 2 - 1);
150-
float g = depth * ((i >> 1 & 1) * 2 - 1);
151-
float h = depth * ((i >> 2 & 1) * 2 - 1);
152-
Vec3d start = referVec.add(f, g, h);
153-
Vec3d end = referVec.add(offset).add(f, g, h);
154-
HitResult hitResult = ((CameraAccessor) camera).getArea().raycast(new RaycastContext(start, end,
155-
RaycastContext.ShapeType.VISUAL, RaycastContext.FluidHandling.NONE, camera.getFocusedEntity()));
156-
double l = hitResult.getPos().distanceTo(start);
157-
if (hitResult.getType() == HitResult.Type.MISS || l >= offset.length()) continue;
158-
offset = offset.multiply(l / offset.length());
159-
hitted = true;
160-
}
161-
((CameraAccessor) camera).invokeSetPos(referVec.add(offset));
162-
if (hitted && offset.length() <= 0.8F) ((CameraAccessor) camera).setThirdPerson(false);
163-
}
164-
165-
private static void virtualRender(AbstractClientPlayerEntity player, PlayerEntityRenderer playerRenderer,
166-
float tickDelta, MatrixStack matrixStack) {
167-
168117
if (config.isUsingModModel()) {
169118
status = "Successful";
170119
try {

common/src/main/java/com/xtracr/realcamera/api/VirtualRenderer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static String getModelPartName() {
4040
*/
4141
public static boolean shouldDisableRender(String modelPartName) {
4242
ModConfig.Disable.optionalParts.add(modelPartName);
43-
return Flags.isRenderingWorld && config.shouldDisableRender(modelPartName) && RealCameraCore.isActive();
43+
return Flags.isRenderingClientPlayer && config.shouldDisableModelPart(modelPartName) && RealCameraCore.isActive();
4444
}
4545

4646
public static boolean virtualRender(float tickDelta, MatrixStack matrixStack) {

common/src/main/java/com/xtracr/realcamera/compat/DoABarrelRollCompat.java

-28
This file was deleted.

common/src/main/java/com/xtracr/realcamera/config/ConfigScreen.java

+5-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.xtracr.realcamera.RealCamera;
44
import com.xtracr.realcamera.RealCameraCore;
55
import com.xtracr.realcamera.api.VirtualRenderer;
6-
import com.xtracr.realcamera.compat.DoABarrelRollCompat;
76
import com.xtracr.realcamera.compat.PehkuiCompat;
87
import com.xtracr.realcamera.compat.PhysicsModCompat;
98
import com.xtracr.realcamera.utils.Triple;
@@ -53,11 +52,6 @@ public static Screen create(Screen parent) {
5352
.setTooltip(Text.translatable(TOOLTIP + "classic"))
5453
.setSaveConsumer(b -> config.general.classic = b)
5554
.build());
56-
general.addEntry(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "clipToSpace"), config.general.clipToSpace)
57-
.setDefaultValue(true)
58-
.setTooltip(Text.translatable(TOOLTIP + "clipToSpace"))
59-
.setSaveConsumer(b -> config.general.clipToSpace = b)
60-
.build());
6155
general.addEntry(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "dynamicCrosshair"), config.general.dynamicCrosshair)
6256
.setDefaultValue(false)
6357
.setTooltip(Text.translatable(TOOLTIP + "dynamicCrosshair"))
@@ -93,6 +87,11 @@ public static Screen create(Screen parent) {
9387
.setTooltip(Text.translatable(TOOLTIP + "adjustOffset"))
9488
.setSaveConsumer(b -> config.binding.adjustOffset = b)
9589
.build());
90+
binding.addEntry(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "offsetModel"), config.binding.offsetModel)
91+
.setDefaultValue(false)
92+
.setTooltip(Text.translatable(TOOLTIP + "offsetModel"))
93+
.setSaveConsumer(b -> config.binding.offsetModel = b)
94+
.build());
9695
SubCategoryBuilder bindingCameraOffset = entryBuilder.startSubCategory(Text.translatable(CATEGORY + "cameraOffset"))
9796
.setTooltip(Text.translatable(TOOLTIP + "bindingOffset"), Text.translatable(TOOLTIP + "bindingOffset_n"));
9897
bindingCameraOffset.add(entryBuilder.startDoubleField(Text.translatable(OPTION + "cameraOffset", "X"), config.binding.cameraX)
@@ -239,11 +238,6 @@ public static Screen create(Screen parent) {
239238
.build());
240239
SubCategoryBuilder compatSwitches = entryBuilder.startSubCategory(Text.translatable(CATEGORY + "compatSwitches"))
241240
.setTooltip(Text.translatable(TOOLTIP + "compatSwitches"));
242-
if (DoABarrelRollCompat.loaded)
243-
compatSwitches.add(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "doABarrelRoll"), config.compats.doABarrelRoll)
244-
.setDefaultValue(true)
245-
.setSaveConsumer(b -> config.compats.doABarrelRoll = b)
246-
.build());
247241
if (PehkuiCompat.loaded)
248242
compatSwitches.add(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "pehkui"), config.compats.pehkui)
249243
.setDefaultValue(true)

0 commit comments

Comments
 (0)