Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
xTracr committed Dec 19, 2023
2 parents 694d8f6 + bbc6bd0 commit ccf17f3
Show file tree
Hide file tree
Showing 15 changed files with 599 additions and 48 deletions.
12 changes: 12 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@

### Test Versions ###

* 0.6.0-beta:
* 0.6.0-alpha.1:

* 0.5.0-beta:
* Redesigned config screen
* Removed commands because it's no longer useful
Expand All @@ -23,6 +26,9 @@
* Added feature #15, fixed #35
* Changed the way of clipping to space to avoid #23 and #32
* 0.5.5-beta:
* Changed the way of clipping to space to avoid #37
* Deleted the option of disabling "clip to space"
* Separate the part that modifies camera from the part that computes it

* 0.4.0-alpha:
* Fixed an issue where the camera would not follow the model action when the player started/ended sneaking
Expand Down Expand Up @@ -84,6 +90,9 @@

### 测试版 ###

* 0.6.0-beta:
* 0.6.0-alpha.1:

* 0.5.0-beta:
* 重新设计了配置屏幕
* 删除了命令,因为它不再有用
Expand All @@ -101,6 +110,9 @@
* 添加了功能#15, 修复#35
* 修改了clip to space的方式来避免#23#32
* 0.5.5-beta:
* 修改了clip to space的方式来避免#37
* 删除了禁用"clip to space"的选项
* 将修改摄像头的部分与计算它的部分分离开来

* 0.4.0-alpha:
* 修复了玩家开始/结束潜行时摄像头未跟上模型动作的问题
Expand Down
74 changes: 67 additions & 7 deletions common/src/main/java/com/xtracr/realcamera/RealCameraCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@
import com.xtracr.realcamera.config.ModConfig;
import com.xtracr.realcamera.mixins.PlayerEntityRendererAccessor;
import com.xtracr.realcamera.utils.MathUtils;
import com.xtracr.realcamera.utils.VertexDataAnalyser;
import com.xtracr.realcamera.utils.VertexDataCatcher;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.client.render.entity.PlayerEntityRenderer;
import net.minecraft.client.render.entity.model.PlayerEntityModel;
import net.minecraft.client.util.math.MatrixStack;
Expand All @@ -21,10 +24,14 @@
import org.joml.Matrix3f;
import org.joml.Vector4f;

import java.util.*;

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

private static final List<Integer> normalList = new ArrayList<>();
private static final List<Integer> posList = new ArrayList<>();
private static String status = "Successful";
private static boolean vRendering = false;
private static float pitch = 0.0F;
private static float yaw = 0.0F;
private static float roll = 0.0F;
Expand All @@ -35,6 +42,10 @@ public static String getStatus() {
return status;
}

public static boolean isvRendering() {
return vRendering;
}

public static float getPitch() {
return pitch;
}
Expand Down Expand Up @@ -72,15 +83,20 @@ public static void computeCamera(MinecraftClient client, float tickDelta) {

// GameRenderer.renderWorld
MatrixStack matrixStack = new MatrixStack();
virtualRender(client, tickDelta, matrixStack);
vRendering = true;
VertexDataCatcher catcher = setupCatcher();
virtualRender(client, tickDelta, matrixStack, catcher);
vRendering = false;

// ModelPart$Cuboid.renderCuboid
Vector4f offset = matrixStack.peek().getPositionMatrix().transform(new Vector4f((float) (config.getBindingZ() * config.getScale()),
-(float) (config.getBindingY() * config.getScale()),
-(float) (config.getBindingX() * config.getScale()), 1.0F));
Vector4f offset = matrixStack.peek().getPositionMatrix().transform(new Vector4f(0, 0, 0, 1.0F));
pos = new Vec3d(offset.x(), offset.y(), offset.z());

Matrix3f normal = matrixStack.peek().getNormalMatrix().scale(1.0F, -1.0F, -1.0F);
if (!VertexDataAnalyser.isAnalysing() && config.binding.experimental) try {
applyAnalysisResult(normal, catcher);
} catch (Exception ignored) {
}

normal.rotateLocal((float) Math.toRadians(config.getBindingYaw()), normal.m10, normal.m11, normal.m12);
normal.rotateLocal((float) Math.toRadians(config.getBindingPitch()), normal.m00, normal.m01, normal.m02);
normal.rotateLocal((float) Math.toRadians(config.getBindingRoll()), normal.m20, normal.m21, normal.m22);
Expand All @@ -90,7 +106,44 @@ public static void computeCamera(MinecraftClient client, float tickDelta) {
roll = config.isRollingBound() ? (float) eulerAngle.getZ() : config.getBindingRoll();
}

private static void virtualRender(MinecraftClient client, float tickDelta, MatrixStack matrixStack) {
private static VertexDataCatcher setupCatcher() {
normalList.clear();
posList.clear();
if (VertexDataAnalyser.isAnalysing()) return VertexDataAnalyser.catcher;
if (config.binding.experimental) try {
List<Integer> list = config.binding.indexListMap.get(config.binding.nameOfList);
posList.addAll(list.subList(3, list.size()));
int leftSgn = list.get(2) >= 0 ? 1 : -1;
int upSgn = list.get(1) >= 0 ? 1 : -1;
int leftIndex = list.get(2) * leftSgn + (leftSgn - 1) / 2;
int upIndex = list.get(1) * upSgn + (upSgn - 1) / 2;
normalList.addAll(List.of(list.get(0), upIndex, leftIndex));
if (upSgn == -1) normalList.add(-1);
if (leftSgn == -1) normalList.add(-2);
} catch (Exception ignored) {
}
return new VertexDataCatcher(normalList::contains, posList::contains);
}

private static void applyAnalysisResult(Matrix3f normal, VertexDataCatcher catcher) {
if (catcher.posRecorder.isEmpty()) throw new NullPointerException("Target vertices not found");
Vec3d average = Vec3d.ZERO;
for (Vec3d vec : catcher.posRecorder) {
average = average.add(vec);
}
pos = average.multiply(1 / (double) catcher.posRecorder.size());
List<Integer> sorted = new ArrayList<>(List.copyOf(normalList.subList(0, 3)));
List<Integer> order = new ArrayList<>();
sorted.sort(Comparator.comparingInt(i -> i));
order.add(sorted.indexOf(normalList.get(0)));
order.add(sorted.indexOf(normalList.get(1)));
order.add(sorted.indexOf(normalList.get(2)));
normal.set(catcher.normalRecorder.get(order.get(2)).multiply(normalList.contains(-2) ? -1 : 1).toVector3f(),
catcher.normalRecorder.get(order.get(1)).multiply(normalList.contains(-1) ? -1 : 1).toVector3f(),
catcher.normalRecorder.get(order.get(0)).toVector3f());
}

private static void virtualRender(MinecraftClient client, float tickDelta, MatrixStack matrixStack, VertexDataCatcher catcher) {
ClientPlayerEntity player = client.player;
// WorldRenderer.render
if (player.age == 0) {
Expand All @@ -102,6 +155,13 @@ private static void virtualRender(MinecraftClient client, float tickDelta, Matri
Vec3d renderOffset = new Vec3d(MathHelper.lerp(tickDelta, player.lastRenderX, player.getX()),
MathHelper.lerp(tickDelta, player.lastRenderY, player.getY()),
MathHelper.lerp(tickDelta, player.lastRenderZ, player.getZ()));
matrixStack.push();
EntityRenderDispatcher dispatcher = client.getEntityRenderDispatcher();
dispatcher.configure(client.world, client.gameRenderer.getCamera(), player);
if (VertexDataAnalyser.preAnalysing() || config.binding.experimental) dispatcher.render(player, renderOffset.getX(),
renderOffset.getY(), renderOffset.getZ(), 0, tickDelta, matrixStack, layer -> catcher, 0xF000F0);
VertexDataAnalyser.analyse(player, tickDelta);
matrixStack.pop();
// EntityRenderDispatcher.render
if (config.compatPhysicsMod())
PhysicsModCompat.renderStart(client.getEntityRenderDispatcher(), player, renderOffset.getX(), renderOffset.getY(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.xtracr.realcamera.command;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.arguments.BoolArgumentType;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.xtracr.realcamera.RealCamera;
import com.xtracr.realcamera.config.ConfigFile;
import com.xtracr.realcamera.config.ModConfig;
import com.xtracr.realcamera.utils.VertexDataAnalyser;
import net.minecraft.client.MinecraftClient;
import net.minecraft.command.CommandRegistryAccess;
import net.minecraft.command.CommandSource;
import net.minecraft.text.Text;

import java.util.List;

public class ClientCommand<S extends CommandSource>{
private static final String KEY_COMMAND = "message.xtracr_" + RealCamera.MODID + "_command_";
private static final ModConfig config = ConfigFile.modConfig;

public void register(CommandDispatcher<S> dispatcher, CommandRegistryAccess access) {
final LiteralArgumentBuilder<S> builder = literal(RealCamera.MODID);
builder.then(literal("analyse").executes(context -> this.startAnalysis(context, 0))
.then(argument("targetIndex", IntegerArgumentType.integer(0))
.then(argument("accuracy", IntegerArgumentType.integer(10, 10000000)).executes(context -> this.startAnalysis(context, 1)))));
builder.then(literal("autoBind")
.then(argument("name", StringArgumentType.string()).executes(this::autoBind)));
builder.then(literal("config")
.then(literal("delete")
.then(argument("name", StringArgumentType.string()).executes(this::deleteList)))
.then(literal("listAll").executes(this::listAll)));
builder.then(literal("showResult")
.then(argument("number", IntegerArgumentType.integer(1)).executes(this::showResult)));

dispatcher.register(builder);
}

private int startAnalysis(CommandContext<S> context, int mode) {
if (mode == 1) mode += IntegerArgumentType.getInteger(context, "targetIndex");
final float accuracy = mode == 0 ? 100 : IntegerArgumentType.getInteger(context, "accuracy");
VertexDataAnalyser.start(mode, mode == 0 ? 80 : 120, 1 / accuracy);
return 1;
}

private int autoBind(CommandContext<S> context) {
List<Integer> list = VertexDataAnalyser.getFinalResults(-1);
if (list == null) return 0;
config.binding.indexListMap.put(StringArgumentType.getString(context, "name"), list);
ConfigFile.save();
printGameMessage(Text.translatable(KEY_COMMAND + "autoBind", list.get(0), list.get(0), list.get(1), list.get(2)));
return 1;
}

private int deleteList(CommandContext<S> context) {
final String name = StringArgumentType.getString(context, "name");
if (!config.binding.indexListMap.containsKey(name)) {
printGameMessage(Text.translatable(KEY_COMMAND + "delete_failure", name));
return 0;
}
config.binding.indexListMap.remove(name);
ConfigFile.save();
printGameMessage(Text.translatable(KEY_COMMAND + "delete_success", name));
return 1;
}

private int listAll(CommandContext<S> context) {
StringBuffer buffer = new StringBuffer();
config.binding.indexListMap.forEach((name, list) -> {
buffer.append("\n'").append(name).append("' -> [ ");
list.forEach(i -> buffer.append(i).append(" "));
buffer.append("]");
});
printGameMessage(Text.translatable(KEY_COMMAND + "listAll", config.binding.indexListMap.size(), buffer.toString()));
return 1;
}

private int showResult(CommandContext<S> context) {
final int number = IntegerArgumentType.getInteger(context, "number");
VertexDataAnalyser.showResult(number, true);
return 1;
}

private static void printGameMessage(Text text) {
MinecraftClient.getInstance().getMessageHandler().onGameMessage(text, false);
}

private <T> RequiredArgumentBuilder<S, T> argument(final String name, final ArgumentType<T> type) {
return RequiredArgumentBuilder.argument(name, type);
}

private LiteralArgumentBuilder<S> literal(final String name) {
return LiteralArgumentBuilder.literal(name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static Screen create(Screen parent) {
ConfigCategory classic = builder.getOrCreateCategory(Text.translatable(CATEGORY + "classic"));
ConfigCategory compats = builder.getOrCreateCategory(Text.translatable(CATEGORY + "compats"));
ConfigCategory disable = builder.getOrCreateCategory(Text.translatable(CATEGORY + "disable"));
ConfigCategory experimental = builder.getOrCreateCategory(Text.literal("Experimental"));

general.addEntry(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "enabled"), config.general.enabled)
.setSaveConsumer(b -> config.general.enabled = b)
Expand Down Expand Up @@ -315,6 +316,15 @@ public static Screen create(Screen parent) {
.build());
disable.addEntry(disableModWhen.build());

experimental.addEntry(entryBuilder.startBooleanToggle(Text.literal("Enabled"), config.binding.experimental)
.setDefaultValue(false)
.setSaveConsumer(b -> config.binding.experimental = b)
.build());
experimental.addEntry(entryBuilder.startStrField(Text.literal("Name Of List"), config.binding.nameOfList)
.setDefaultValue("minecraft_head")
.setSaveConsumer(s -> config.binding.nameOfList = s)
.build());

return builder.build();
}
}
11 changes: 7 additions & 4 deletions common/src/main/java/com/xtracr/realcamera/config/ModConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import net.minecraft.registry.Registries;
import net.minecraft.util.math.MathHelper;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;

public class ModConfig {
protected static final double MIN_DOUBLE = -64.0D;
Expand Down Expand Up @@ -297,9 +294,14 @@ private void clamp() {
}

public static class Binding {
public static final Map<String, List<Integer>> defaultIndexListMap = Map.of(
"minecraft_head", Arrays.asList(12, 0, -9, 12, 13, 14, 15));
public VanillaModelPart vanillaModelPart = VanillaModelPart.head;
public boolean experimental = false;
public boolean adjustOffset = true;
public boolean offsetModel = false;
public String nameOfList = "minecraft_head";
public Map<String, List<Integer>> indexListMap = defaultIndexListMap;
public double cameraX = 3.25D;
public double cameraY = 2.0D;
public double cameraZ = 0.0D;
Expand All @@ -312,6 +314,7 @@ public static class Binding {

private void clamp() {
if (vanillaModelPart == null) vanillaModelPart = VanillaModelPart.head;
if (indexListMap == null) indexListMap = defaultIndexListMap;
cameraX = MathHelper.clamp(cameraX, MIN_DOUBLE, MAX_DOUBLE);
cameraY = MathHelper.clamp(cameraY, MIN_DOUBLE, MAX_DOUBLE);
cameraZ = MathHelper.clamp(cameraZ, MIN_DOUBLE, MAX_DOUBLE);
Expand Down
Loading

0 comments on commit ccf17f3

Please sign in to comment.