Skip to content

将 26.1 兼容更新回移到 1.20.1#207

Open
rsdadada wants to merge 5 commits into
xTracr:1.20.1from
rsdadada:codex/sync-26.1-compatible-to-1.20.1
Open

将 26.1 兼容更新回移到 1.20.1#207
rsdadada wants to merge 5 commits into
xTracr:1.20.1from
rsdadada:codex/sync-26.1-compatible-to-1.20.1

Conversation

@rsdadada
Copy link
Copy Markdown

@rsdadada rsdadada commented May 13, 2026

概要

  • 本 PR 按 origin/1.20.1...HEAD 的实际 diff,将 26.1/dev 中可在 Minecraft 1.20.1、Java 17、Forge + Fabric 架构下合理成立的行为和内部实现回移到 1.20.1
  • 目标是缩小 1.20.1 与 26.1 的代码差异,同时避免机械同步 26.1-only API、NeoForge/Kotlin DSL/Java 25/版本号更新和新版渲染提交管线。
  • PR 当前包含 5 个提交,涉及 46 个文件:common 源码、access widener/mixin 配置、lang 资源和 GitHub issue templates;不改 Gradle 版本、mod 版本或加载器结构。

行为与配置变更

  • swimOutTick 重命名为更通用的 outTick,用于“退出限制状态后延迟恢复主功能”;旧配置字段保留为 deprecated 迁移入口,读取旧配置时在 outTick 为默认值时迁移旧值并清空旧字段。
  • 绑定模式新增 disableWhenCrawling;游泳和爬行共用同一套 outTick 延迟逻辑。经典模式仍只同步游泳退出延迟,不新增爬行开关。
  • Cloth Config 中把绑定模式的禁用相关选项收进 disableConfig 子分类:潜行、爬行、游泳、outTick、手持物品禁用主功能、手持物品禁用渲染。
  • DisableHelper 把游泳专用 swimmingRecently 泛化为 checkCondition,并把 wildcard 中的 \\*+ split 改为预编译 Pattern MULTI_STAR
  • BindTarget.vanillaTarget 的默认 disablingDepth0.1f 同步为 0.2fBindTarget 的网络/JSON 字段和 serialVersion 保持不变。

绑定、渲染捕获与缓存

  • 新增 RenderTypeCache,集中管理 texture id cache 和 primitive cache,使用 Guava LoadingCache 设置 maximumSizeexpireAfterAccess,避免长期运行时静态 HashMap 无限增长。
  • texture id 获取改为 1.20.1 兼容的 Mixin accessor/access widener 方案,读取 CompositeRenderType -> CompositeState -> textureState -> cutoutTexture();不再用正则解析 RenderType.toString()。对于无法提取 texture 的 RenderType,仍保留 renderType.toString() 作为兜底标识。
  • 新增 3 个 accessor mixin,并在 realcamera-common.mixins.jsonrealcamera.accesswidener 中声明 1.20.1 所需访问权限。
  • primitive cache 从旧的 RenderType -> Map<UV, float[]> 改为 PrimitiveLayoutKey -> Object2IntMap<UV>,缓存 UV 对应的 primitive index;缺失默认值为 -1
  • PrimitiveLayoutKey 在 1.20.1 上额外包含 texture/render type、draw mode、vertex layout、vertex/primitive count 和 mesh ordinal,用来适配旧渲染分段下“同 RenderType 不同 mesh”的情况,避免错误复用 26.1 风格的粗粒度 cache。
  • IterableVertexBuffer 新增 mode()vertexLayoutHash()readPrimitiveAt(int)primitiveLengthprimitiveCount,让 cache hit 可以直接按 index 读取 primitive。
  • BuiltIterableBuffer.resolvePrimitives() 先尝试 cache hit,再只扫描缺失 UV;如果缓存 index 越界或读取出的 primitive 不再包含目标 UV,则失效当前 layout cache 并回退扫描。
  • 移除旧 allCached / uvFingerprint 路径,不再为每个 buffer 构造 UV fingerprint;stale cache 通过读取校验与 layout cache 失效处理。

YSM 与模型捕获

  • YSMCompat 的本质仍是模拟 4 组玩家头部旋转来尝试匹配 Yes Steve Model 的模型绑定点,没有改变“模拟头部转动匹配”的核心思路。
  • YSM 的实现改为每个 TransformedVertexRecorder 持有自己的 MultiVertexCatcher:第一轮渲染并尝试 cache 命中,fallback 阶段复用同一批 captured buffers 扫描缺失 primitive,不再因为 cache miss 额外重复渲染实体。
  • YSMCompatresultMap.computeIfAbsent 改为方法引用风格,并将 recorder 收窄为私有 final 类。
  • MultiVertexCatcher 新增 create()clear()forEachBuffer() 生命周期接口;旧 endCatching() 保留为 try/finally 包装,兼容原有“遍历后释放”语义。
  • RealCameraCore.computeCameraRealCameraCore.renderCameraEntityModelAnalyser.updateModel 改为显式 try/finally 清理 catcher,防止异常路径泄漏 captured mesh。

几何判断与模型视图

  • 移除 BuiltIterableBufferModelAnalyser 中的 java.awt.Polygon 依赖,改用 MathUtil.pointInTriangle / pointInQuadVertexData.containsUV / containsXY
  • MathUtil 新增 cross、三角形/四边形命中判断、固定参数 floor / ceil 工具,并将 projectToVec2 参数类型改为 Matrix4fc
  • VertexData.ImmutableVertex.asImmutable() 直接返回自身;MutableVertexVertexData 内部类提取为顶层类,减少接口内部实现膨胀并贴近 26.1 结构。
  • ModelAnalyserfocusedPolyhedron 改为私有字段并提供 getFocusedPolyhedron(),用 ZEntry record 替代 Object[],并用 LongOpenHashSet 的量化顶点 key 扩展相邻 primitive。
  • 模型点击深度排序在 1.20.1 中保留已验证的 vertex.z() + deltaZ,不机械采用 26.1 坐标约定下的符号变化。
  • texture 视图点击从“把 UV 变换到屏幕坐标后建 Polygon”改为“把鼠标点用 texture pose 逆矩阵变回 UV,再做 UV 命中判断”。
  • GUIHelper 改为 final,并将方法名同步为更短的 outlinetriangleOrQuadvector

GUI 结构与按键

  • GUI 控件迁入 com.xtracr.realcamera.gui.components 包:TexturedButton -> SimpleIconButtonCyclingTexturedButton -> CycleIconButtonDoubleSlider / NumberField 同步迁移。
  • 新增 NumberWidgetPair,把 offset/rotation 的输入框与 slider 组合为一个组件,ModelViewScreen 不再维护 6 组重复的 field + slider 字段。
  • 模型视图仍保留保存、删除、导入、导出、禁用区域选择等现有工作流;本 PR 删除的是旧 copy/paste disabled config 控件和对应语言键。
  • KeyMappings 使用新的 key.category.xtracr_realcamera.general 分类键,并把按键处理中的 ConfigFile.save() 从每个 click 内部改为一次 handle 中有按键消费后统一保存。

资源与元数据

  • 新增 .github/ISSUE_TEMPLATE/bug_report_cn.ymlbug_report_en.yml
  • 16 个 lang JSON 文件同步整理键顺序,并补齐/删除与代码一致的键。
  • 新增语言键:config.option.*.disableConfigdisableWhenCrawlingoutTickconfig.tooltip.*.outTickkey.category.*.generalscreen.widget.*.modelView_currentConfig
  • 删除语言键:config.option.*.swimOutTickconfig.tooltip.*.swimOutTickscreen.widget.*.modelView_copymodelView_pastescreen.tooltip.*.modelView_copymodelView_paste

明确不回移

  • 不同步 NeoForge、Kotlin DSL、Java 25、Minecraft 26.1.x 依赖版本、mod_version=0.7.7-beta 或任何 Gradle 构建版本改动;1.20.1 构建仍保持当前分支版本。
  • 不使用 26.1 的 RenderSetupextractEntitysubmitSubmitNodeStorage 或新版 renderer 包结构;1.20.1 缺少这些渲染 API,本 PR 只回移“捕获后复用”和“cache hit 优先”的思路。
  • 不拆分 RealCameraConfig 顶层配置结构;当前 PR 只做字段迁移和 UI 分组,避免扩大 1.20.1 配置兼容风险。
  • 不回退到旧的 UV -> float[] primitive cache;1.20.1 使用 layout-scoped primitive index cache 来兼容旧渲染分段差异。

兼容性说明

  • BindTarget.DisableConfig 的 JSON 和网络序列化字段不变,只替换内部 UV 命中缓存结构。
  • swimOutTick 作为旧配置读取字段保留并迁移到 outTick;新 UI 和语言键只暴露 outTick
  • texture id 的主路径不依赖 RenderType.toString() 正则;fallback toString() 只用于无可提取 texture 的 RenderType 标识。
  • YSM 适配的匹配语义不变,变化集中在 buffer 捕获、缓存命中和 miss path 复用。

验证

  • .\gradlew.bat build
  • common:compileJava
  • fabric:validateAccessWidener
  • forge:validateAccessWidener
  • lang JSON 按 UTF-8 全量解析
  • git diff --check
  • 检查无残留旧粗粒度 primitive cache 路径:allCacheduvFingerprintRenderType -> Map<UV, Integer>
  • 检查无残留旧 GUI / utility 名称:RenderTypeUtil、旧 button 类名、VertexData.MutableVertex、AWT Polygon

@rsdadada rsdadada changed the title Backport compatible 26.1 updates to 1.20.1 将 26.1 兼容更新回移到 1.20.1 May 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant