Skip to content

Commit

Permalink
Allowed to select surfaces of model & deleted the old analyser
Browse files Browse the repository at this point in the history
  • Loading branch information
xTracr committed Dec 22, 2023
1 parent d3e9d56 commit 427489f
Show file tree
Hide file tree
Showing 16 changed files with 245 additions and 392 deletions.
49 changes: 18 additions & 31 deletions common/src/main/java/com/xtracr/realcamera/RealCameraCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import com.xtracr.realcamera.config.ModConfig;
import com.xtracr.realcamera.mixin.PlayerEntityRendererAccessor;
import com.xtracr.realcamera.util.MathUtil;
import com.xtracr.realcamera.util.VertexDataAnalyser;
import com.xtracr.realcamera.util.VertexDataCatcher;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.AbstractClientPlayerEntity;
Expand All @@ -22,15 +21,13 @@
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix3f;
import org.joml.Vector3f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.List;

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 ,yaw, roll;
Expand Down Expand Up @@ -85,15 +82,17 @@ public static void computeCamera(MinecraftClient client, float tickDelta) {
// GameRenderer.renderWorld
MatrixStack matrixStack = new MatrixStack();
vRendering = true;
VertexDataCatcher catcher = setupCatcher();
VertexDataCatcher catcher = new VertexDataCatcher();
virtualRender(client, tickDelta, matrixStack, catcher);
vRendering = false;

// ModelPart$Cuboid.renderCuboid
Vector4f offset = matrixStack.peek().getPositionMatrix().transform(new Vector4f(0, 0, 0, 1.0F));
Vector4f offset = matrixStack.peek().getPositionMatrix().transform(new Vector4f((float) (config.getBindingZ() * config.getScale()),
-(float) (config.getBindingY() * config.getScale()) - 0.125f,
-(float) (config.getBindingX() * config.getScale()) - 0.225f, 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 {
if (config.binding.experimental) try {
applyAnalysisResult(normal, catcher);
} catch (Exception ignored) {
}
Expand All @@ -107,31 +106,20 @@ public static void computeCamera(MinecraftClient client, float tickDelta) {
roll = config.isRollingBound() ? (float) eulerAngle.getZ() : config.getBindingRoll();
}

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);
normalList.add(list.get(0));
normalList.add(list.get(1));
posList.addAll(list.subList(2, list.size()));
} 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());
int order = normalList.get(0) < normalList.get(1) ? 0 : 1;
Vec3d front = catcher.normalRecorder.get(normalList.get(order));
Vec3d up = catcher.normalRecorder.get(normalList.get(1 - order));
List<Integer> indexList = config.binding.indexListMap.get(config.binding.nameOfList);
Vec3d front = catcher.normalRecorder.get(indexList.get(0));
Vec3d up = catcher.normalRecorder.get(indexList.get(1));
normal.set(front.crossProduct(up).multiply(-1).toVector3f(), up.toVector3f(), front.toVector3f());
Vector3f offset = normal.transform(new Vector3f((float) (config.getBindingZ() * config.getScale()),
(float) (config.getBindingY() * config.getScale()),
(float) (config.getBindingX() * config.getScale())));
Vec3d center = Vec3d.ZERO;
for (int i : indexList.subList(2, indexList.size())) {
center = center.add(catcher.posRecorder.get(i));
}
pos = center.multiply(1 / (double) (indexList.size() - 2)).add(offset.x(), offset.y(), offset.z());
}

private static void virtualRender(MinecraftClient client, float tickDelta, MatrixStack matrixStack, VertexDataCatcher catcher) {
Expand All @@ -149,9 +137,8 @@ private static void virtualRender(MinecraftClient client, float tickDelta, Matri
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(),
if (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())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,32 @@

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.ArgumentType;
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.util.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)) {
Expand All @@ -78,12 +51,6 @@ private int listAll(CommandContext<S> context) {
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,13 @@ public static Screen create(Screen parent) {
SubCategoryBuilder bindingCameraOffset = entryBuilder.startSubCategory(Text.translatable(CATEGORY + "cameraOffset"))
.setTooltip(Text.translatable(TOOLTIP + "bindingOffset"), Text.translatable(TOOLTIP + "bindingOffset_n"));
bindingCameraOffset.add(entryBuilder.startDoubleField(Text.translatable(OPTION + "cameraOffset", "X"), config.binding.cameraX)
.setDefaultValue(3.25D)
.setDefaultValue(0.0D)
.setMin(ModConfig.MIN_DOUBLE)
.setMax(ModConfig.MAX_DOUBLE)
.setSaveConsumer(d -> config.binding.cameraX = d)
.build());
bindingCameraOffset.add(entryBuilder.startDoubleField(Text.translatable(OPTION + "cameraOffset", "Y"), config.binding.cameraY)
.setDefaultValue(2.0D)
.setDefaultValue(0.0D)
.setMin(ModConfig.MIN_DOUBLE)
.setMax(ModConfig.MAX_DOUBLE)
.setSaveConsumer(d -> config.binding.cameraY = d)
Expand Down Expand Up @@ -316,7 +316,7 @@ public static Screen create(Screen parent) {
.build());
disable.addEntry(disableModWhen.build());

experimental.addEntry(entryBuilder.startBooleanToggle(Text.literal("Enabled"), config.binding.experimental)
experimental.addEntry(entryBuilder.startBooleanToggle(Text.translatable(OPTION + "enabled"), config.binding.experimental)
.setDefaultValue(false)
.setSaveConsumer(b -> config.binding.experimental = b)
.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,8 +302,8 @@ public static class Binding {
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 cameraX = 0.0D;
public double cameraY = 0.0D;
public double cameraZ = 0.0D;
public boolean bindPitching = true;
public boolean bindYawing = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
public class IntFieldWidget extends TextFieldWidget {
IntConsumer consumer;

public IntFieldWidget(TextRenderer textRenderer, int width, int height, Text text, int value, IntConsumer consumer) {
super(textRenderer, width, height, text);
public IntFieldWidget(TextRenderer textRenderer, int x, int y, int width, int height, Text text, int value, IntConsumer consumer) {
super(textRenderer, x, y, width, height, text);
this.consumer = consumer;
setMaxLength(9);
setValue(value);
Expand All @@ -22,6 +22,7 @@ protected int getValue() {

protected void setValue(int value) {
setText(String.valueOf(value));
consumer.accept(value);
}

@Override
Expand Down
Loading

0 comments on commit 427489f

Please sign in to comment.