From 3e614daacfb09fdd8a6fe05b54498d1ff50a1dc5 Mon Sep 17 00:00:00 2001 From: MeiVinEight Date: Tue, 25 Aug 2026 14:03:26 +0800 Subject: [PATCH 1/2] [feat] add `active` config for disable config --- .../xtracr/realcamera/config/BindTarget.java | 4 +- .../realcamera/config/DisableConfig.java | 22 +++++- .../realcamera/config/codec/ConfigCodec.java | 6 +- .../config/codec/ConfigCodec703.java | 2 + .../config/codec/ConfigCodec709.java | 79 +++++++++++++++++++ .../config/codec/DisableConfigAdapter.java | 5 +- .../xtracr/realcamera/gui/ModelAnalyser.java | 2 +- .../realcamera/gui/ModelViewScreen.java | 32 ++++++-- 8 files changed, 138 insertions(+), 14 deletions(-) create mode 100644 common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index 10fb3f0..fefa2c2 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -33,8 +33,8 @@ private static BindTarget vanillaTarget(String name, int priority, boolean shoul BindConfig bindConfig = new BindConfig(shouldBind, true, shouldBind, shouldBind); OffsetConfig offsets = new OffsetConfig(); offsets.x = -0.1f; - DisableConfig playerHead = new DisableConfig("player_head", textureId, false, List.of(new UVRectangle(0, 0, 1.0f, 0.25f))); - DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, List.of()); + DisableConfig playerHead = new DisableConfig("player_head", textureId, false, List.of(new UVRectangle(0, 0, 1.0f, 0.25f)), true); + DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, List.of(), true); List disableConfigs = List.of(playerHead, dragonHead); return new BindTarget(name, textureId, priority, 0.2f, targetConfig, bindConfig, offsets, disableConfigs); } diff --git a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java index 4572c85..4b557da 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java @@ -14,12 +14,20 @@ public final class DisableConfig { private final String textureId; private final boolean disableAll; private final List rectangles; + public boolean active; - public DisableConfig(String name, String textureId, boolean disableAll, List rectangles) { + public DisableConfig(String name, String textureId, boolean disableAll, List rectangles, boolean active) { this.name = name; this.textureId = textureId; this.disableAll = disableAll; this.rectangles = rectangles; + this.active = active; + } + + @Deprecated + public DisableConfig(String name, String textureId, boolean disableAll, List rectangles) + { + this(name, textureId, disableAll, rectangles, true); } public String name() { @@ -38,7 +46,19 @@ public List rectangles() { return rectangles; } + public boolean active() + { + return this.active; + } + public boolean disable(VertexData vertex) { + return this.disable(vertex, false); + } + + public boolean disable(VertexData vertex, boolean forceActive) + { + if (!this.active && !forceActive) + return false; final float u = vertex.u(), v = vertex.v(); final long packed = (long) Float.floatToIntBits(u) << 32 | Float.floatToIntBits(v); if (enabledUVs.contains(packed)) return false; diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java index 78b492e..4b1a6bb 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec.java @@ -17,9 +17,11 @@ import java.util.zip.InflaterInputStream; public final class ConfigCodec { - static final short CURRENT_VERSION = 703; + static final short VERSION_703 = 703; + static final short CURRENT_VERSION = 709; static final Short2ReferenceMap> CODECS = Short2ReferenceMap.ofEntries( - Short2ReferenceMap.entry(CURRENT_VERSION, ConfigCodec703.CODEC) + Short2ReferenceMap.entry(VERSION_703, ConfigCodec703.CODEC), + Short2ReferenceMap.entry(CURRENT_VERSION, ConfigCodec709.CODEC) ); public static BindTarget readWithVersion(ByteBuf byteBuf) throws DecoderException, IllegalArgumentException { diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java index 7170407..f0cea98 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java @@ -57,6 +57,8 @@ final class ConfigCodec703 { ByteBufCodecs.FLOAT, UVRectangle::vMax, UVRectangle::new ).apply(ByteBufCodecs.list()); + + @SuppressWarnings("deprecation") static final StreamCodec> DISABLE_CONFIGS_CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, DisableConfig::name, ByteBufCodecs.STRING_UTF8, DisableConfig::textureId, diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java new file mode 100644 index 0000000..1b87a44 --- /dev/null +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java @@ -0,0 +1,79 @@ +package com.xtracr.realcamera.config.codec; + +import com.xtracr.realcamera.config.BindTarget; +import com.xtracr.realcamera.config.BindTarget.BindConfig; +import com.xtracr.realcamera.config.BindTarget.TargetConfig; +import com.xtracr.realcamera.config.DisableConfig; +import com.xtracr.realcamera.config.OffsetConfig; +import com.xtracr.realcamera.config.UVRectangle; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +import java.util.List; + +final class ConfigCodec709 { + static final StreamCodec TARGET_CONFIG_CODEC = StreamCodec.composite( + ByteBufCodecs.FLOAT, TargetConfig::forwardU, + ByteBufCodecs.FLOAT, TargetConfig::forwardV, + ByteBufCodecs.FLOAT, TargetConfig::upwardU, + ByteBufCodecs.FLOAT, TargetConfig::upwardV, + ByteBufCodecs.FLOAT, TargetConfig::posU, + ByteBufCodecs.FLOAT, TargetConfig::posV, + TargetConfig::new + ); + static final StreamCodec BIND_CONFIG_CODEC = StreamCodec.composite( + ByteBufCodecs.BYTE, + bindConfig -> { + byte bindFlags = 0; + if (bindConfig.bindX()) bindFlags |= 0x01; + if (bindConfig.bindY()) bindFlags |= 0x02; + if (bindConfig.bindZ()) bindFlags |= 0x04; + if (bindConfig.bindRotation()) bindFlags |= 0x08; + return bindFlags; + }, + bindFlags -> { + boolean bindX = (bindFlags & 0x01) != 0; + boolean bindY = (bindFlags & 0x02) != 0; + boolean bindZ = (bindFlags & 0x04) != 0; + boolean bindRotation = (bindFlags & 0x08) != 0; + return new BindConfig(bindX, bindY, bindZ, bindRotation); + } + ); + static final StreamCodec OFFSET_CONFIG_CODEC = StreamCodec.composite( + ByteBufCodecs.FLOAT, offsets -> offsets.scale, + ByteBufCodecs.FLOAT, offsets -> offsets.x, + ByteBufCodecs.FLOAT, offsets -> offsets.y, + ByteBufCodecs.FLOAT, offsets -> offsets.z, + ByteBufCodecs.FLOAT, offsets -> offsets.pitch, + ByteBufCodecs.FLOAT, offsets -> offsets.yaw, + ByteBufCodecs.FLOAT, offsets -> offsets.roll, + OffsetConfig::new + ); + static final StreamCodec> UV_RECTANGLES_CODEC = StreamCodec.composite( + ByteBufCodecs.FLOAT, UVRectangle::uMin, + ByteBufCodecs.FLOAT, UVRectangle::vMin, + ByteBufCodecs.FLOAT, UVRectangle::uMax, + ByteBufCodecs.FLOAT, UVRectangle::vMax, + UVRectangle::new + ).apply(ByteBufCodecs.list()); + static final StreamCodec> DISABLE_CONFIGS_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, DisableConfig::name, + ByteBufCodecs.STRING_UTF8, DisableConfig::textureId, + ByteBufCodecs.BOOL, DisableConfig::disableAll, + UV_RECTANGLES_CODEC, DisableConfig::rectangles, + ByteBufCodecs.BOOL, DisableConfig::active, + DisableConfig::new + ).apply(ByteBufCodecs.list()); + static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, BindTarget::name, + ByteBufCodecs.STRING_UTF8, BindTarget::textureId, + ByteBufCodecs.VAR_INT, BindTarget::priority, + ByteBufCodecs.FLOAT, BindTarget::disablingDepth, + TARGET_CONFIG_CODEC, BindTarget::targetConfig, + BIND_CONFIG_CODEC, BindTarget::bindConfig, + OFFSET_CONFIG_CODEC, BindTarget::offsets, + DISABLE_CONFIGS_CODEC, BindTarget::disableConfigs, + BindTarget::new + ); +} diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java index 86166de..bc0c102 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java @@ -17,6 +17,7 @@ public void write(JsonWriter out, DisableConfig value) throws IOException { out.name("name").value(value.name()); out.name("textureId").value(value.textureId()); out.name("disableAll").value(value.disableAll()); + out.name("active").value(value.active); out.name("rectangles"); out.beginArray(); for (UVRectangle rect : value.rectangles()) { @@ -36,6 +37,7 @@ public DisableConfig read(JsonReader in) throws IOException { String name = ""; String textureId = ""; boolean disableAll = false; + boolean active = false; List rectangles = new ArrayList<>(); in.beginObject(); @@ -49,11 +51,12 @@ public DisableConfig read(JsonReader in) throws IOException { while (in.hasNext()) rectangles.add(readRectangle(in)); in.endArray(); } + case "active" -> active = in.nextBoolean(); default -> in.skipValue(); } } in.endObject(); - return new DisableConfig(name, textureId, disableAll, rectangles); + return new DisableConfig(name, textureId, disableAll, rectangles, active); } private UVRectangle readRectangle(JsonReader in) throws IOException { 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 f963e14..9dc066c 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -59,7 +59,7 @@ public static void applyDisableConfigs(List modelRecords, Bind primitiveFor: for (VertexData vertex : primitive) { for (DisableConfig config : disableConfigs) { - if (config.disable(vertex)) continue primitiveFor; + if (config.disable(vertex, true)) continue primitiveFor; } primitives.add(primitive); break; 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 eeaeba5..e10e793 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelViewScreen.java @@ -266,6 +266,12 @@ else if (index > 0 && index <= rectWidgets.size()) { if (toggleCategoryButton.getValue() == Category.DISABLE && !syncDisableDraft(button, true)) return; button.setTooltip(null); BindTarget bindTarget = genBindTarget(); + Set hiddenNames = this.hiddenNameMap.get(this.nameField.getValue()); + if (hiddenNames != null) + { + for (DisableConfig config : bindTarget.disableConfigs()) + config.active = hiddenNames.contains(config.name()); + } ConfigFile.config().putBindTarget(bindTarget); ConfigFile.save(); if (toggleCategoryButton.getValue() != Category.DISABLE) loadBindTarget(bindTarget); @@ -304,14 +310,18 @@ private void initRightWidgets() { for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { DisableConfig config = disableConfigs.get(i); String targetName = nameField.getValue(); - Set hiddenNames = hiddenNameMap.computeIfAbsent(targetName, _ -> new HashSet<>()); - addRenderableWidget(new CycleIconButton(32, 16, hiddenNames.contains(config.name()) ? 1 : 0, 2)) + Set hiddenNames = hiddenNameMap.computeIfAbsent(targetName, str -> new HashSet<>()); + CycleIconButton iconButton = new CycleIconButton(32, 16, hiddenNames.contains(config.name()) ? 1 : 0, 2); + addRenderableWidget(iconButton) .setOnValueChange(value -> { if (value == 0) hiddenNames.remove(config.name()); else hiddenNames.add(config.name()); }) .setPosition(x + (xSize + middleWidth) / 2 - 20, y + 5 + (widgetHeight + 2) * (2 + i % widgetsPerPage)); - rows.addChild(createButton(LocUtil.literal(config.name()), compactWidgetWidth, _ -> { + iconButton.setValue(config.active ? 1 : 0); + if (config.active) + hiddenNames.add(config.name()); + rows.addChild(createButton(LocUtil.literal(config.name()), compactWidgetWidth, button -> { loadDisableConfig(config); initWidgets(page); }), 3).setTooltip(Tooltip.create(LocUtil.literal(config.name()))); @@ -323,6 +333,9 @@ private void initRightWidgets() { }), smallSettings); } } else { + Set hiddenNames = hiddenNameMap.get(nameField.getValue()); + if (hiddenNames != null) + hiddenNames.clear(); widgetsPerPage = 8; List fixedTargetList = ConfigFile.config().binding.fixedTargetList.stream().filter(target -> target.name().equals(RealCameraCore.currentTarget().name())).toList(); List targetList = ConfigFile.config().binding.targetList; @@ -574,7 +587,11 @@ private boolean syncDisableDraft(Button button, boolean autoName) { button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyTextureId").withStyle(ChatFormatting.RED))); return false; } - DisableConfig disableConfig = new DisableConfig(name, textureId, disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); + boolean active = false; + Set hiddenNames = this.hiddenNameMap.get(this.nameField.getValue()); + if (hiddenNames != null) + active = hiddenNames.contains(name); + DisableConfig disableConfig = new DisableConfig(name, textureId, disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList(), active); upsertDisableConfig(disableConfig); return true; } @@ -583,14 +600,15 @@ private boolean hasMeaningfulDisableDraft() { return !disabledIdField.getValue().isBlank() && (disableModeButton.getValue() == 0 || !rectWidgets.isEmpty()); } - private void upsertDisableConfig(DisableConfig disableConfig) { + private boolean upsertDisableConfig(DisableConfig disableConfig) { for (int i = 0; i < disableConfigs.size(); i++) { if (disableConfigs.get(i).name().equals(disableConfig.name())) { disableConfigs.set(i, disableConfig); - return; + return false; } } disableConfigs.add(disableConfig); + return true; } private String generateDisableConfigName(String textureId) { @@ -673,7 +691,7 @@ private void loadBindTarget(BindTarget target) { } private BindTarget genBindTarget() { - DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); + DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList(), false); List newDisableConfigs = new ArrayList<>(disableConfigs); for (int i = 0; i < newDisableConfigs.size(); i++) { if (newDisableConfigs.get(i).name().equals(currentDisableConfig.name())) From 19771dfdeae8fa99d22d7f1794748ef1f6e94b4b Mon Sep 17 00:00:00 2001 From: H31M5 <2211923909@qq.com> Date: Wed, 26 Aug 2026 00:10:20 +0800 Subject: [PATCH 2/2] Format code and simplify some elements --- .../xtracr/realcamera/config/BindTarget.java | 4 +- .../realcamera/config/DisableConfig.java | 24 +++---- .../config/codec/ConfigCodec703.java | 3 +- .../config/codec/ConfigCodec709.java | 2 +- .../config/codec/DisableConfigAdapter.java | 8 +-- .../xtracr/realcamera/gui/ModelAnalyser.java | 8 +-- .../realcamera/gui/ModelViewScreen.java | 62 ++++++++----------- 7 files changed, 46 insertions(+), 65 deletions(-) diff --git a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java index fefa2c2..940ec64 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java +++ b/common/src/main/java/com/xtracr/realcamera/config/BindTarget.java @@ -33,8 +33,8 @@ private static BindTarget vanillaTarget(String name, int priority, boolean shoul BindConfig bindConfig = new BindConfig(shouldBind, true, shouldBind, shouldBind); OffsetConfig offsets = new OffsetConfig(); offsets.x = -0.1f; - DisableConfig playerHead = new DisableConfig("player_head", textureId, false, List.of(new UVRectangle(0, 0, 1.0f, 0.25f)), true); - DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, List.of(), true); + DisableConfig playerHead = new DisableConfig("player_head", textureId, true, false, List.of(new UVRectangle(0, 0, 1.0f, 0.25f))); + DisableConfig dragonHead = new DisableConfig("dragon_head", "minecraft:textures/entity/enderdragon/dragon.png", true, true, List.of()); List disableConfigs = List.of(playerHead, dragonHead); return new BindTarget(name, textureId, priority, 0.2f, targetConfig, bindConfig, offsets, disableConfigs); } diff --git a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java index 4b557da..c3efb5b 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java +++ b/common/src/main/java/com/xtracr/realcamera/config/DisableConfig.java @@ -12,22 +12,21 @@ public final class DisableConfig { private final LongOpenHashSet disabledUVs = new LongOpenHashSet(), enabledUVs = new LongOpenHashSet(); private final String name; private final String textureId; + private final boolean active; private final boolean disableAll; private final List rectangles; - public boolean active; - public DisableConfig(String name, String textureId, boolean disableAll, List rectangles, boolean active) { + public DisableConfig(String name, String textureId, boolean active, boolean disableAll, List rectangles) { this.name = name; this.textureId = textureId; + this.active = active; this.disableAll = disableAll; this.rectangles = rectangles; - this.active = active; } @Deprecated - public DisableConfig(String name, String textureId, boolean disableAll, List rectangles) - { - this(name, textureId, disableAll, rectangles, true); + public DisableConfig(String name, String textureId, boolean disableAll, List rectangles) { + this(name, textureId, true, disableAll, rectangles); } public String name() { @@ -46,19 +45,12 @@ public List rectangles() { return rectangles; } - public boolean active() - { + public boolean active() { return this.active; } public boolean disable(VertexData vertex) { - return this.disable(vertex, false); - } - - public boolean disable(VertexData vertex, boolean forceActive) - { - if (!this.active && !forceActive) - return false; + if (!this.active) return false; final float u = vertex.u(), v = vertex.v(); final long packed = (long) Float.floatToIntBits(u) << 32 | Float.floatToIntBits(v); if (enabledUVs.contains(packed)) return false; @@ -71,4 +63,4 @@ public boolean disable(VertexData vertex, boolean forceActive) enabledUVs.add(packed); return false; } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java index f0cea98..b99c14a 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec703.java @@ -12,6 +12,7 @@ import java.util.List; +@SuppressWarnings("deprecation") final class ConfigCodec703 { static final StreamCodec TARGET_CONFIG_CODEC = StreamCodec.composite( ByteBufCodecs.FLOAT, TargetConfig::forwardU, @@ -57,8 +58,6 @@ final class ConfigCodec703 { ByteBufCodecs.FLOAT, UVRectangle::vMax, UVRectangle::new ).apply(ByteBufCodecs.list()); - - @SuppressWarnings("deprecation") static final StreamCodec> DISABLE_CONFIGS_CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, DisableConfig::name, ByteBufCodecs.STRING_UTF8, DisableConfig::textureId, diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java index 1b87a44..259c952 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/ConfigCodec709.java @@ -60,9 +60,9 @@ final class ConfigCodec709 { static final StreamCodec> DISABLE_CONFIGS_CODEC = StreamCodec.composite( ByteBufCodecs.STRING_UTF8, DisableConfig::name, ByteBufCodecs.STRING_UTF8, DisableConfig::textureId, + ByteBufCodecs.BOOL, DisableConfig::active, ByteBufCodecs.BOOL, DisableConfig::disableAll, UV_RECTANGLES_CODEC, DisableConfig::rectangles, - ByteBufCodecs.BOOL, DisableConfig::active, DisableConfig::new ).apply(ByteBufCodecs.list()); static final StreamCodec CODEC = StreamCodec.composite( diff --git a/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java index bc0c102..bf2c3a9 100644 --- a/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java +++ b/common/src/main/java/com/xtracr/realcamera/config/codec/DisableConfigAdapter.java @@ -16,8 +16,8 @@ public void write(JsonWriter out, DisableConfig value) throws IOException { out.beginObject(); out.name("name").value(value.name()); out.name("textureId").value(value.textureId()); + out.name("active").value(value.active()); out.name("disableAll").value(value.disableAll()); - out.name("active").value(value.active); out.name("rectangles"); out.beginArray(); for (UVRectangle rect : value.rectangles()) { @@ -36,8 +36,8 @@ public void write(JsonWriter out, DisableConfig value) throws IOException { public DisableConfig read(JsonReader in) throws IOException { String name = ""; String textureId = ""; - boolean disableAll = false; boolean active = false; + boolean disableAll = false; List rectangles = new ArrayList<>(); in.beginObject(); @@ -45,18 +45,18 @@ public DisableConfig read(JsonReader in) throws IOException { switch (in.nextName()) { case "name" -> name = in.nextString(); case "textureId" -> textureId = in.nextString(); + case "active" -> active = in.nextBoolean(); case "disableAll" -> disableAll = in.nextBoolean(); case "rectangles" -> { in.beginArray(); while (in.hasNext()) rectangles.add(readRectangle(in)); in.endArray(); } - case "active" -> active = in.nextBoolean(); default -> in.skipValue(); } } in.endObject(); - return new DisableConfig(name, textureId, disableAll, rectangles, active); + return new DisableConfig(name, textureId, active, disableAll, rectangles); } private UVRectangle readRectangle(JsonReader in) throws IOException { 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 9dc066c..d39b837 100644 --- a/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java +++ b/common/src/main/java/com/xtracr/realcamera/gui/ModelAnalyser.java @@ -43,11 +43,11 @@ public final class ModelAnalyser { @Nullable private BuiltModelRecord focusedRecord; - public static void applyDisableConfigs(List modelRecords, BindTarget target, String textureId, Set hiddenNames) { + public static void applyDisableConfigs(List modelRecords, BindTarget target, String textureId, Set disableActiveNameMap) { for (int i = 0; i < modelRecords.size(); i++) { BuiltModelRecord record = modelRecords.get(i); List primitives = new ArrayList<>(); - DisableConfig[] disableConfigs = target.filteredDisableConfigs(config -> record.containsTextureId(config.textureId()) && hiddenNames.contains(config.name())); + DisableConfig[] disableConfigs = target.filteredDisableConfigs(config -> record.containsTextureId(config.textureId()) && disableActiveNameMap.contains(config.name())); boolean disableAll = !record.containsTextureId(textureId); for (DisableConfig config : disableConfigs) { if (config.disableAll()) { @@ -59,7 +59,7 @@ public static void applyDisableConfigs(List modelRecords, Bind primitiveFor: for (VertexData vertex : primitive) { for (DisableConfig config : disableConfigs) { - if (config.disable(vertex, true)) continue primitiveFor; + if (config.disable(vertex)) continue primitiveFor; } primitives.add(primitive); break; @@ -273,4 +273,4 @@ private void computeRecord(BuiltIterableBuffer builtBuffer, List disableConfigs = new ArrayList<>(); private final List rectWidgets = new ArrayList<>(); - private final Map> hiddenNameMap = new HashMap<>(); + private final Set disableActiveNameMap = new HashSet<>(); private final List widgetPairs = List.of(offsetXPair, offsetYPair, offsetZPair, offsetPitchPair, offsetYawPair, offsetRollPair); private final CycleButton selectingButton = createCyclingButtonBuilder(ImmutableSortedMap.of( 0, LocUtil.MODEL_VIEW_WIDGET("forwardVector").withStyle(ChatFormatting.GREEN), @@ -266,15 +266,8 @@ else if (index > 0 && index <= rectWidgets.size()) { if (toggleCategoryButton.getValue() == Category.DISABLE && !syncDisableDraft(button, true)) return; button.setTooltip(null); BindTarget bindTarget = genBindTarget(); - Set hiddenNames = this.hiddenNameMap.get(this.nameField.getValue()); - if (hiddenNames != null) - { - for (DisableConfig config : bindTarget.disableConfigs()) - config.active = hiddenNames.contains(config.name()); - } ConfigFile.config().putBindTarget(bindTarget); ConfigFile.save(); - if (toggleCategoryButton.getValue() != Category.DISABLE) loadBindTarget(bindTarget); initWidgets(page); })); rows.addChild(priorityField, smallSettings).setTooltip(createTooltip("priority")); @@ -309,33 +302,25 @@ private void initRightWidgets() { }), smallSettings).setTooltip(createTooltip("saveAs")); for (int i = page * widgetsPerPage; i < Math.min((page + 1) * widgetsPerPage, size); i++) { DisableConfig config = disableConfigs.get(i); - String targetName = nameField.getValue(); - Set hiddenNames = hiddenNameMap.computeIfAbsent(targetName, str -> new HashSet<>()); - CycleIconButton iconButton = new CycleIconButton(32, 16, hiddenNames.contains(config.name()) ? 1 : 0, 2); - addRenderableWidget(iconButton) + addRenderableWidget(new CycleIconButton(32, 16, disableActiveNameMap.contains(config.name()) ? 1 : 0, + 2)) .setOnValueChange(value -> { - if (value == 0) hiddenNames.remove(config.name()); - else hiddenNames.add(config.name()); + if (value == 0) disableActiveNameMap.remove(config.name()); + else disableActiveNameMap.add(config.name()); }) .setPosition(x + (xSize + middleWidth) / 2 - 20, y + 5 + (widgetHeight + 2) * (2 + i % widgetsPerPage)); - iconButton.setValue(config.active ? 1 : 0); - if (config.active) - hiddenNames.add(config.name()); - rows.addChild(createButton(LocUtil.literal(config.name()), compactWidgetWidth, button -> { + rows.addChild(createButton(LocUtil.literal(config.name()), compactWidgetWidth, _ -> { loadDisableConfig(config); initWidgets(page); }), 3).setTooltip(Tooltip.create(LocUtil.literal(config.name()))); rows.addChild(new SimpleIconButton(48, 0, _ -> { disableConfigs.removeIf(disableConfig -> disableConfig.name().equals(config.name())); - hiddenNameMap.values().forEach(names -> names.remove(config.name())); + disableActiveNameMap.remove(config.name()); if (disabledNameField.getValue().equals(config.name())) clearDisableDraft(); initWidgets(page * widgetsPerPage > size - 2 && size > 1 ? page - 1 : page); }), smallSettings); } } else { - Set hiddenNames = hiddenNameMap.get(nameField.getValue()); - if (hiddenNames != null) - hiddenNames.clear(); widgetsPerPage = 8; List fixedTargetList = ConfigFile.config().binding.fixedTargetList.stream().filter(target -> target.name().equals(RealCameraCore.currentTarget().name())).toList(); List targetList = ConfigFile.config().binding.targetList; @@ -408,10 +393,10 @@ public void extractBackground(@NonNull GuiGraphicsExtractor graphics, int mouseX BindTarget target = genBindTarget(); target.offsets().scale *= modelScale; String textureId = toggleCategoryButton.getValue() == Category.DISABLE ? disabledIdField.getValue() : ""; - Set hiddenNames = hiddenNameMap.getOrDefault(nameField.getValue(), Set.of()); List modelRecords = captureRotatedEntity(analyser, target, minecraft.player); List textureRecords = modelRecords.stream().filter(record -> record.containsTextureId(textureId)).toList(); - ModelAnalyser.applyDisableConfigs(modelRecords, target, textureId, hiddenNames); + if (toggleCategoryButton.getValue() == Category.DISABLE) + ModelAnalyser.applyDisableConfigs(modelRecords, target, textureId, disableActiveNameMap); computeFocusedPrimitives(analyser, modelRecords, textureRecords, mouseX, mouseY); renderCulledModels(graphics, analyser, target, modelRecords); renderFlattenedModels(graphics, analyser, textureRecords); @@ -587,11 +572,8 @@ private boolean syncDisableDraft(Button button, boolean autoName) { button.setTooltip(Tooltip.create(LocUtil.MODEL_VIEW_TOOLTIP("emptyTextureId").withStyle(ChatFormatting.RED))); return false; } - boolean active = false; - Set hiddenNames = this.hiddenNameMap.get(this.nameField.getValue()); - if (hiddenNames != null) - active = hiddenNames.contains(name); - DisableConfig disableConfig = new DisableConfig(name, textureId, disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList(), active); + DisableConfig disableConfig = new DisableConfig(name, textureId, disableActiveNameMap.contains(name), + disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList()); upsertDisableConfig(disableConfig); return true; } @@ -600,15 +582,14 @@ private boolean hasMeaningfulDisableDraft() { return !disabledIdField.getValue().isBlank() && (disableModeButton.getValue() == 0 || !rectWidgets.isEmpty()); } - private boolean upsertDisableConfig(DisableConfig disableConfig) { + private void upsertDisableConfig(DisableConfig disableConfig) { for (int i = 0; i < disableConfigs.size(); i++) { if (disableConfigs.get(i).name().equals(disableConfig.name())) { disableConfigs.set(i, disableConfig); - return false; + return; } } disableConfigs.add(disableConfig); - return true; } private String generateDisableConfigName(String textureId) { @@ -687,15 +668,24 @@ private void loadBindTarget(BindTarget target) { offsetRollPair.setNumber(offsets.roll); disableConfigs.clear(); disableConfigs.addAll(target.disableConfigs()); + disableConfigs.forEach(config -> { + if (config.active()) disableActiveNameMap.add(config.name()); + }); clearDisableDraft(); } private BindTarget genBindTarget() { - DisableConfig currentDisableConfig = new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList(), false); List newDisableConfigs = new ArrayList<>(disableConfigs); for (int i = 0; i < newDisableConfigs.size(); i++) { - if (newDisableConfigs.get(i).name().equals(currentDisableConfig.name())) - newDisableConfigs.set(i, currentDisableConfig); + DisableConfig newDisableConfig = newDisableConfigs.get(i); + boolean active = disableActiveNameMap.contains(newDisableConfig.name()); + if (newDisableConfig.name().equals(disabledNameField.getValue())) + newDisableConfigs.set(i, new DisableConfig(disabledNameField.getValue(), disabledIdField.getValue(), active, + disableModeButton.getValue() == 0, rectWidgets.stream().map(UVRectangleWidget::toUVRectangle).toList())); + else if (newDisableConfig.active() != active) { + newDisableConfigs.set(i, new DisableConfig(newDisableConfig.name(), newDisableConfig.textureId(), active, + newDisableConfig.disableAll(), newDisableConfig.rectangles())); + } } TargetConfig targetConfig = new TargetConfig(forwardUField.getNumber(), forwardVField.getNumber(), upwardUField.getNumber(), upwardVField.getNumber(), posUField.getNumber(), posVField.getNumber()); BindConfig bindConfig = new BindConfig(bindXButton.getValue() == 0, bindYButton.getValue() == 0, bindZButton.getValue() == 0, bindRotButton.getValue() == 0); @@ -1002,4 +992,4 @@ public void setFocused(boolean focused) { protected void updateWidgetNarration(@NonNull NarrationElementOutput narrationElementOutput) { } } -} +} \ No newline at end of file