Skip to content

Commit d204614

Browse files
committed
Added 'preview' feature
1 parent 8742e42 commit d204614

23 files changed

+597
-256
lines changed

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

+16-12
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@
55
import com.xtracr.realcamera.gui.ModelViewScreen;
66
import net.minecraft.client.MinecraftClient;
77
import net.minecraft.client.option.KeyBinding;
8-
import net.minecraft.client.util.InputUtil;
98
import org.lwjgl.glfw.GLFW;
109

11-
import java.util.Collection;
12-
import java.util.HashSet;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import java.util.function.Consumer;
1313

1414
public final class KeyBindings {
15-
private static final ModConfig config = ConfigFile.modConfig;
1615
private static final String KEY_CATEGORY = "key.category.xtracr_" + RealCamera.MODID;
1716
private static final String KEY_ID = "key.xtracr_" + RealCamera.MODID + "_";
18-
public static final Collection<KeyBinding> KEY_BINDINGS = new HashSet<>();
17+
private static final List<KeyBinding> KEY_BINDINGS = new ArrayList<>();
1918
private static final KeyBinding MODEL_VIEW_GUI = createKeyBinding("modelViewGui");
2019
private static final KeyBinding TOGGLE_PERSPECTIVE = createKeyBinding("togglePerspective", GLFW.GLFW_KEY_F6);
2120
private static final KeyBinding TOGGLE_ADJUST_MODE = createKeyBinding("toggleAdjustMode");
@@ -28,7 +27,7 @@ public final class KeyBindings {
2827
private static final KeyBinding ADJUST_RIGHT = createKeyBinding("adjustRIGHT");
2928

3029
public static KeyBinding createKeyBinding(String id) {
31-
return createKeyBinding(id, InputUtil.UNKNOWN_KEY.getCode());
30+
return createKeyBinding(id, GLFW.GLFW_KEY_UNKNOWN);
3231
}
3332

3433
public static KeyBinding createKeyBinding(String id, int code) {
@@ -37,8 +36,13 @@ public static KeyBinding createKeyBinding(String id, int code) {
3736
return keyBinding;
3837
}
3938

39+
public static void register(Consumer<KeyBinding> registerer) {
40+
KEY_BINDINGS.forEach(registerer);
41+
}
42+
4043
public static void handle(MinecraftClient client) {
4144
if (client.player == null) return;
45+
final ModConfig config = ConfigFile.modConfig;
4246
while (MODEL_VIEW_GUI.wasPressed()) {
4347
client.setScreen(new ModelViewScreen());
4448
}
@@ -58,32 +62,32 @@ public static void handle(MinecraftClient client) {
5862
ConfigFile.save();
5963
}
6064
while (ADJUST_LEFT.wasPressed()) {
61-
if (config.isClassic()) config.adjustClassicZ(true);
65+
if (config.isClassic()) config.adjustClassicZ(1);
6266
else config.adjustBindingZ(true);
6367
ConfigFile.save();
6468
}
6569
while (ADJUST_RIGHT.wasPressed()) {
66-
if (config.isClassic()) config.adjustClassicZ(false);
70+
if (config.isClassic()) config.adjustClassicZ(-1);
6771
else config.adjustBindingZ(false);
6872
ConfigFile.save();
6973
}
7074
while (ADJUST_UP.wasPressed()) {
71-
if (config.isClassic()) config.adjustClassicY(true);
75+
if (config.isClassic()) config.adjustClassicY(1);
7276
else config.adjustBindingY(true);
7377
ConfigFile.save();
7478
}
7579
while (ADJUST_DOWN.wasPressed()) {
76-
if (config.isClassic()) config.adjustClassicY(false);
80+
if (config.isClassic()) config.adjustClassicY(-1);
7781
else config.adjustBindingY(false);
7882
ConfigFile.save();
7983
}
8084
while (ADJUST_FRONT.wasPressed()) {
81-
if (config.isClassic()) config.adjustClassicX(true);
85+
if (config.isClassic()) config.adjustClassicX(1);
8286
else config.adjustBindingX(true);
8387
ConfigFile.save();
8488
}
8589
while (ADJUST_BACK.wasPressed()) {
86-
if (config.isClassic()) config.adjustClassicX(false);
90+
if (config.isClassic()) config.adjustClassicX(-1);
8791
else config.adjustBindingX(false);
8892
ConfigFile.save();
8993
}

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

+55-54
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.xtracr.realcamera.api.VirtualRenderer;
44
import com.xtracr.realcamera.compat.PehkuiCompat;
55
import com.xtracr.realcamera.compat.PhysicsModCompat;
6+
import com.xtracr.realcamera.config.BindingTarget;
67
import com.xtracr.realcamera.config.ConfigFile;
78
import com.xtracr.realcamera.config.ModConfig;
89
import com.xtracr.realcamera.mixin.PlayerEntityRendererAccessor;
@@ -25,17 +26,16 @@
2526
import net.minecraft.util.math.Vec3d;
2627
import org.joml.Matrix3f;
2728
import org.joml.Matrix4f;
28-
import org.joml.Vector3f;
2929
import org.joml.Vector4f;
3030

3131
import java.util.ArrayList;
3232
import java.util.Collection;
3333
import java.util.List;
34-
import java.util.function.BiPredicate;
34+
import java.util.function.BiFunction;
3535

3636
public class RealCameraCore {
37-
private static final ModConfig config = ConfigFile.modConfig;
3837
private static VertexRecorder recorder = new VertexRecorder();
38+
private static BindingTarget currentTarget = new BindingTarget();
3939
private static String status = "Successful";
4040
private static boolean renderingPlayer = false;
4141
private static boolean active = false;
@@ -55,40 +55,40 @@ public static void setRenderingPlayer(boolean value) {
5555
}
5656

5757
public static float getPitch(float f) {
58-
if (config.isRotationBound()) return pitch;
59-
else return f + config.getBindingPitch();
58+
if (currentTarget.bindRotation()) return pitch;
59+
else return f + currentTarget.pitch();
6060
}
6161

6262
public static float getYaw(float f) {
63-
if (config.isRotationBound()) return yaw;
64-
else return f - config.getBindingYaw();
63+
if (currentTarget.bindRotation()) return yaw;
64+
else return f - currentTarget.yaw();
6565
}
6666

6767
public static float getRoll(float f) {
68-
if (config.isClassic()) return f + config.getClassicRoll();
69-
else if (config.isRotationBound()) return roll;
70-
else return f + config.getBindingRoll();
68+
if (config().isClassic()) return f + config().getClassicRoll();
69+
else if (currentTarget.bindRotation()) return roll;
70+
else return f + currentTarget.roll();
7171
}
7272

7373
public static Vec3d getPos(Vec3d vec3d) {
74-
return new Vec3d(config.isXBound() ? pos.getX() : vec3d.getX() + config.getBindingX(),
75-
config.isYBound() ? pos.getY() : vec3d.getY() + config.getBindingY(),
76-
config.isZBound() ? pos.getZ() : vec3d.getZ() + config.getBindingZ());
74+
return new Vec3d(currentTarget.bindX() ? pos.getX() : vec3d.getX() + currentTarget.offsetX(),
75+
currentTarget.bindY() ? pos.getY() : vec3d.getY() + currentTarget.offsetY(),
76+
currentTarget.bindZ() ? pos.getZ() : vec3d.getZ() + currentTarget.offsetZ());
7777
}
7878

7979
public static Vec3d getCameraPos(Vec3d vec3d) {
80-
return new Vec3d(config.isXBound() ? cameraPos.getX() : vec3d.getX() + config.getBindingX(),
81-
config.isYBound() ? cameraPos.getY() : vec3d.getY() + config.getBindingY(),
82-
config.isZBound() ? cameraPos.getZ() : vec3d.getZ() + config.getBindingZ());
80+
return new Vec3d(currentTarget.bindX() ? cameraPos.getX() : vec3d.getX() + currentTarget.offsetX(),
81+
currentTarget.bindY() ? cameraPos.getY() : vec3d.getY() + currentTarget.offsetY(),
82+
currentTarget.bindZ() ? cameraPos.getZ() : vec3d.getZ() + currentTarget.offsetZ());
8383
}
8484

8585
public static void setCameraPos(Vec3d vec3d) {
8686
cameraPos = vec3d;
8787
}
8888

8989
public static void init(MinecraftClient client) {
90-
active = config.isEnabled() && client.options.getPerspective().isFirstPerson() && client.gameRenderer.getCamera() != null
91-
&& client.player != null && !config.shouldDisableMod(client);
90+
active = config().isEnabled() && client.options.getPerspective().isFirstPerson() && client.gameRenderer.getCamera() != null
91+
&& client.player != null && !config().shouldDisableMod(client);
9292
}
9393

9494
public static boolean isActive() {
@@ -103,20 +103,24 @@ public static void renderPlayer(VertexConsumerProvider vertexConsumers) {
103103
Matrix4f positionMatrix = matrixStack.peek().getPositionMatrix().transpose().invertAffine()
104104
.translate((float) -pos.getX(), (float) -pos.getY(), (float) -pos.getZ());
105105
Matrix3f normalMatrix = matrixStack.peek().getNormalMatrix().transpose().invert();
106-
BiPredicate<RenderLayer, VertexRecorder.Vertex[]> biPredicate = (renderLayer, vertices) -> {
107-
double depth = config.disable.depth, centerZ = 0;
108-
for (VertexRecorder.Vertex vertex : vertices) {
109-
if (vertex.z() < -depth) return true;
106+
BiFunction<RenderLayer, VertexRecorder.Vertex[], VertexRecorder.Vertex[]> function = (renderLayer, vertices) -> {
107+
double depth = currentTarget.disablingDepth(), centerZ = 0;
108+
int size = vertices.length;
109+
VertexRecorder.Vertex[] newQuad = new VertexRecorder.Vertex[size];
110+
for (int i = 0; i < size; i++) newQuad[i] = vertices[i].transform(positionMatrix, normalMatrix);
111+
for (VertexRecorder.Vertex vertex : newQuad) {
112+
if (vertex.z() < -depth) return newQuad;
110113
centerZ += vertex.z();
111114
}
112-
return centerZ < -depth * vertices.length;
115+
return centerZ < -depth * vertices.length ? newQuad : null;
113116
};
114-
recorder.drawByAnother(vertex -> vertex.transform(positionMatrix, normalMatrix), vertexConsumers, renderLayer -> true, biPredicate);
117+
recorder.drawByAnother(vertexConsumers, renderLayer -> true, function);
115118
}
116119

117120
public static void computeCamera(MinecraftClient client, float tickDelta) {
118-
roll = config.getClassicRoll();
119-
if (config.isClassic()) return;
121+
roll = config().getClassicRoll();
122+
currentTarget = new BindingTarget();
123+
if (config().isClassic()) return;
120124

121125
// GameRenderer.renderWorld
122126
MatrixStack matrixStack = new MatrixStack();
@@ -125,48 +129,45 @@ public static void computeCamera(MinecraftClient client, float tickDelta) {
125129
recorder.buildLastRecord();
126130

127131
// ModelPart$Cuboid.renderCuboid
128-
Vector4f offset = matrixStack.peek().getPositionMatrix().transform(new Vector4f((float) (config.getBindingZ() * config.getScale()),
129-
-(float) (config.getBindingY() * config.getScale()) - 0.125f,
130-
-(float) (config.getBindingX() * config.getScale()) - 0.225f, 1.0F));
132+
Vector4f offset = matrixStack.peek().getPositionMatrix().transform(new Vector4f((float) (config().getBindingZ() * config().getScale()),
133+
-(float) (config().getBindingY() * config().getScale()) - 0.125f,
134+
-(float) (config().getBindingX() * config().getScale()) - 0.225f, 1.0f));
131135
pos = new Vec3d(offset.x(), offset.y(), offset.z());
132-
Matrix3f normal = matrixStack.peek().getNormalMatrix().scale(1.0F, -1.0F, -1.0F);
133-
if (config.binding.experimental) {
134-
List<ModConfig.Binding.Target> targetList = new ArrayList<>();
135-
if (config.binding.autoBind) {
136-
Collection<ModConfig.Binding.Target> targetSet = config.binding.targetMap.values();
136+
Matrix3f normal = matrixStack.peek().getNormalMatrix().scale(1.0f, -1.0f, -1.0f);
137+
if (config().binding.experimental) {
138+
List<BindingTarget> targetList = new ArrayList<>();
139+
if (config().binding.autoBind) {
140+
Collection<BindingTarget> targetSet = config().binding.targetMap.values();
137141
recorder.setCurrent(renderLayer -> targetSet.stream().anyMatch(t -> renderLayer.toString().contains(t.textureId())));
138142
String textureId = recorder.currentTextureId();
139143
if (textureId != null) targetList.addAll(targetSet.stream().filter(t -> textureId.contains(t.textureId())).toList());
140144
}
141-
targetList.add(config.binding.targetMap.get(config.binding.nameOfList));
142-
for (ModConfig.Binding.Target target : targetList) {
145+
targetList.add(config().binding.targetMap.get(config().binding.nameOfList));
146+
for (BindingTarget target : targetList) {
143147
try {
144148
recorder.setCurrent(renderLayer -> renderLayer.toString().contains(target.textureId()));
145149
if (recorder.quadCount() <= 0) throw new NullPointerException("Vertices not found");
146-
Vec3d front = recorder.getNormal(target.forwardU(), target.forwardV());
147-
Vec3d up = recorder.getNormal(target.upwardU(), target.upwardV());
148-
Vec3d center = recorder.getPos(target.posU(), target.posV());
149-
if (!MathUtil.isFinite(front) || !MathUtil.isFinite(up) || !MathUtil.isFinite(center)) throw new ArithmeticException();
150-
normal.set(up.crossProduct(front).toVector3f(), up.toVector3f(), front.toVector3f());
151-
Vector3f vec3f = normal.transform(new Vector3f((float) (config.getBindingZ() * config.getScale()),
152-
(float) (config.getBindingY() * config.getScale()),
153-
(float) (config.getBindingX() * config.getScale())));
154-
pos = center.add(vec3f.x(), vec3f.y(), vec3f.z());
150+
pos = recorder.getTargetPosAndRot(target, normal);
151+
currentTarget = target;
155152
break;
156153
} catch (Exception ignored) {
157154
}
158155
}
159156
}
160157

161-
normal.rotateLocal((float) Math.toRadians(config.getBindingYaw()), normal.m10, normal.m11, normal.m12);
162-
normal.rotateLocal((float) Math.toRadians(config.getBindingPitch()), normal.m00, normal.m01, normal.m02);
163-
normal.rotateLocal((float) Math.toRadians(config.getBindingRoll()), normal.m20, normal.m21, normal.m22);
164-
Vec3d eulerAngle = MathUtil.getEulerAngleYXZ(normal).multiply(180.0D / Math.PI);
158+
normal.rotateLocal((float) Math.toRadians(currentTarget.yaw()), normal.m10, normal.m11, normal.m12);
159+
normal.rotateLocal((float) Math.toRadians(currentTarget.pitch()), normal.m00, normal.m01, normal.m02);
160+
normal.rotateLocal((float) Math.toRadians(currentTarget.roll()), normal.m20, normal.m21, normal.m22);
161+
Vec3d eulerAngle = MathUtil.getEulerAngleYXZ(normal).multiply(180.0d / Math.PI);
165162
pitch = (float) eulerAngle.getX();
166163
yaw = (float) -eulerAngle.getY();
167164
roll = (float) eulerAngle.getZ();
168165
}
169166

167+
private static ModConfig config() {
168+
return ConfigFile.modConfig;
169+
}
170+
170171
private static void virtualRender(MinecraftClient client, float tickDelta, MatrixStack matrixStack, VertexConsumerProvider consumers) {
171172
ClientPlayerEntity player = client.player;
172173
// WorldRenderer.render
@@ -182,21 +183,21 @@ private static void virtualRender(MinecraftClient client, float tickDelta, Matri
182183
matrixStack.push();
183184
EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher();
184185
dispatcher.configure(client.world, client.gameRenderer.getCamera(), player);
185-
if (config.binding.experimental) dispatcher.render(player, renderOffset.getX(), renderOffset.getY(), renderOffset.getZ(),
186+
if (config().binding.experimental) dispatcher.render(player, renderOffset.getX(), renderOffset.getY(), renderOffset.getZ(),
186187
MathHelper.lerp(tickDelta, player.prevYaw, player.getYaw()), tickDelta, matrixStack, consumers, dispatcher.getLight(player, tickDelta));
187188
matrixStack.pop();
188189
// EntityRenderDispatcher.render
189-
if (config.compatPhysicsMod())
190+
if (config().compatPhysicsMod())
190191
PhysicsModCompat.renderStart(client.getEntityRenderDispatcher(), player, renderOffset.getX(), renderOffset.getY(),
191192
renderOffset.getZ(), MathHelper.lerp(tickDelta, player.prevYaw, player.getYaw()), tickDelta, matrixStack);
192193

193194
PlayerEntityRenderer playerRenderer = (PlayerEntityRenderer) client.getEntityRenderDispatcher().getRenderer(player);
194195
renderOffset = renderOffset.add(playerRenderer.getPositionOffset(player, tickDelta));
195196
matrixStack.translate(renderOffset.getX(), renderOffset.getY(), renderOffset.getZ());
196197

197-
if (config.compatPehkui()) PehkuiCompat.scaleMatrices(matrixStack, player, tickDelta);
198+
if (config().compatPehkui()) PehkuiCompat.scaleMatrices(matrixStack, player, tickDelta);
198199

199-
if (config.isUsingModModel()) {
200+
if (config().isUsingModModel()) {
200201
status = "Successful";
201202
try {
202203
matrixStack.push();
@@ -257,6 +258,6 @@ private static void virtualRender(MinecraftClient client, float tickDelta, Matri
257258
playerModel.setAngles(player, o, n, l, k, m);
258259
// AnimalModel.render
259260
// ModelPart.render
260-
config.getVanillaModelPart().get(playerRenderer.getModel()).rotate(matrixStack);
261+
config().getVanillaModelPart().get(playerRenderer.getModel()).rotate(matrixStack);
261262
}
262263
}

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ public class PehkuiCompat {
2727

2828
public static void scaleMatrices(MatrixStack matrixStack, Entity entity, float tickDelta) {
2929
if (!loaded) return;
30-
final float widthScale = (float) ReflectUtil.invokeMethod(getModelWidthScale, null, entity, tickDelta).orElse(1.0F);
31-
final float heightScale = (float) ReflectUtil.invokeMethod(getModelHeightScale, null, entity, tickDelta).orElse(1.0F);
30+
final float widthScale = (float) ReflectUtil.invokeMethod(getModelWidthScale, null, entity, tickDelta).orElse(1.0f);
31+
final float heightScale = (float) ReflectUtil.invokeMethod(getModelHeightScale, null, entity, tickDelta).orElse(1.0f);
3232
matrixStack.peek().getPositionMatrix().scale(widthScale, heightScale, widthScale);
3333
}
3434

3535
public static Vec3d scaleVec3d(Vec3d vec3d, Entity entity, float tickDelta) {
3636
if (!loaded) return vec3d;
37-
final float widthScale = (float) ReflectUtil.invokeMethod(getModelWidthScale, null, entity, tickDelta).orElse(1.0F);
38-
final float heightScale = (float) ReflectUtil.invokeMethod(getModelHeightScale, null, entity, tickDelta).orElse(1.0F);
37+
final float widthScale = (float) ReflectUtil.invokeMethod(getModelWidthScale, null, entity, tickDelta).orElse(1.0f);
38+
final float heightScale = (float) ReflectUtil.invokeMethod(getModelHeightScale, null, entity, tickDelta).orElse(1.0f);
3939
return vec3d.multiply(widthScale, heightScale, widthScale);
4040
}
4141
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static <E extends Entity> void renderStart(EntityRenderDispatcher dispatc
5252
Object world = ReflectUtil.getFieldValue(EntityRenderDispatcher_worldField, dispatcher).get();
5353
if ((boolean) ReflectUtil.invokeMethod(ConfigClient_areOceanPhysicsEnabled, null).orElse(false) && world instanceof ClientWorld clientWorld) {
5454
Object oceanWorld = ReflectUtil.invokeMethod(PhysicsWorld_getOceanWorld, ReflectUtil.invokeMethod(PhysicsMod_getPhysicsWorld, ReflectUtil.invokeMethod(PhysicsMod_getInstance, null, clientWorld).get()).get()).get();
55-
ReflectUtil.invokeMethod(OceanWorld_computeEntityOffset, oceanWorld, matrixStack.peek().getPositionMatrix(), matrixStack.peek().getNormalMatrix(), clientWorld, entity, x, y, z, 0.0D, 0.0D, 0.0D, yRot, renderPercent);
55+
ReflectUtil.invokeMethod(OceanWorld_computeEntityOffset, oceanWorld, matrixStack.peek().getPositionMatrix(), matrixStack.peek().getNormalMatrix(), clientWorld, entity, x, y, z, 0.0d, 0.0d, 0.0d, yRot, renderPercent);
5656
}
5757
}
5858
}

0 commit comments

Comments
 (0)