Commit Graph
77 Commits
Author SHA1 Message Date
tianmo 64361e389e 保留本次功能的最终实现源码(热更 agent 第 10 版)
内容:不重启、纯编辑器自身 API 加一个按钮 → 弹名称输入面板(编辑器自带 xl 对话框,ASM 现场生成子类拿名字)
→ 按名字匹配附件 → 在当前选中骨骼下建 15 根骨骼,每根 1 插槽 1 附件(输入的附件名):
- 骨骼 x/y 0~500 随机、rotation/scale/shear = 0/1/1/0/0
- 插槽 alpha 0.5~1 随机、blend normal/additive 随机
- 附件在插槽上 x/y/rotation=0、scaleX/scaleY=1(并换掉 ADD_SLOT 带来的模板附件)
- 弹窗按 pref 尺寸(399x170)撑开、同一次渲染回调里居中(不再先闪左下角)
同期其余临时件(build*/、*.jar、实验探针源码)已移出到 /tmp/spineview-tools-live-backup-1016-1933(可恢复)
2026-10-16 19:33:51 +08:00
tianmo 0a2da7f11b spine修改 2026-10-16 19:32:49 +08:00
tianmo f40979f965 对照表:补 WidgetGroup 尺寸读取(min/pref/maxW/H) + 对话框显示不全/闪左下角的两个修正
- 弹窗建出来默认 150x150,正文和按钮被裁 → 显式设 width/height=max(pref,min,下限) 再 invalidate
- '先左下角再跳中间' = addActor 后过一帧才居中;改成尺寸+居中在同一次渲染回调里做完
names.tsv 338 条,payload-named.zip 已重产(5617 处引用)
2026-10-16 19:31:04 +08:00
tianmo 42b40f6f65 对照表:补上'操作类'API(加插槽/加附件/加骨骼/不重名/撤销/名称输入面板/Actor 几何),全部来自热更实测
这次任务(不重启,纯编辑器自身 API:按钮→名称面板→按名字匹配附件→当前选中骨骼下建 15 根骨骼,每根 1 插槽 1 附件)
用到的 API 全部落表,含踩坑:
- ADD_SLOT 会把模板插槽连它自带的附件一起复制('插槽上的附件变换没改'就是这个)
- xl.D(dt) 不会把对话框挂进 Stage,必须再 dt.D(dl)V(Stage.addActor)
- dl.b_()Z=remove 与 eX.b_()V=invalidate 同名不同描述符,按名字取会删不掉
- et(Table) 也声明 int L()/I(),按名字取 Actor 几何必须按返回类型 float 过滤
- iz 枚举顺序 normal/additive/multiply/screen 取自 clinit
- un.Z()=撤销(实测栈 23->22、对象数回退)
names.tsv 合并成 332 条,payload-named.zip 已重新产出(5605 处引用)
2026-10-16 19:26:25 +08:00
tianmo b8e84c7aa5 停用 grabScrollFocus:它把列表的 ScrollPane 当 Stage.addActor 的参数传进去,导致列表被搬出面板画到窗口左下角
现象:点过面板按钮后,列表(Inspector 114 行)画在窗口左下角一小块里,面板中段只剩红/绿描边。
原因(探针实测 pid 59699):
  - 面板根表格只剩 2 个子控件(按钮块 + 日志 Label),ScrollPane 不见了;
  - ScrollPane 的父级变成 do[0,0,0x0](Stage 根),绝对坐标 (57,824);
  - grabScrollFocus 在 Stage 上找「1 个 Actor 参数 + void」当 setScrollFocus,
    只排除 dl/do/eX;但编辑器的 Stage 类 dt **自己声明** D(Ldl;)V(字节码 = root.addActor),
    于是唯一候选就是 addActor,被 invoke 后 Group.addActor 先把 ScrollPane 摘下来再挂到 Stage 根。
修复(用户选方案 B):不再调用 grabScrollFocus(滚动焦点本来就靠鼠标点列表拿到)。
复验(新进程 pid 60682,同一探针):root 子控件 = 3,ScrollPane 父级 = root,
绝对坐标 (2115,830) 回到停靠框内。
2026-10-16 18:47:34 +08:00
tianmo 7f06c6744a 新增阶段五文档:面板接真实数据(增删改查/属性读写/Inspector 真名翻译/滚动焦点/统计)+ 14 条踩坑点 + 未完成清单 2026-10-16 18:46:16 +08:00
tianmo bb817b85e5 映射表:用编辑器自带的 JSON 导出器(sB)反查字段含义(权威对照)
依据:导出 JSON 时每个 key 后面紧跟被读的字段,所以 key 名就是字段语义。
- 可读载荷 spine398.jar(DecAll 产出)javap -c sB 能直接看到 key 紧跟 getfield;
- 未解密载荷用 strings.tsv(class sB, method D) 的密文顺序核对,281 条顺序逐条一致(三段解密器各自成组)。
新增:Gp(骨骼) length/transform/skin;GU(插槽) color/dark/attachment/blend(注意是 B 不是 D);
各附件 GO/GE/Gx/Gr/Gs 与附件基类 Gn;约束 Gw/GX/GD。
修正:删掉被导出器证伪的 Gp.Class=length 与'静姿态 setup 组'推断(C:F 就是 length)。
同步:names.tsv 合并成 297 条,payload-named.zip 重新产出。
2026-10-16 18:30:03 +08:00
tianmo 7f519edc67 热更(不重启)整理新建附件:用编辑器自身 API 重置图片附件变换 + 删除占位(skin)附件
- 确认 GO 的字段/入口:x=D(float)、y=B(float)、rotation=S、scaleX=L、scaleY=I、width=C、height=Z;
  GO.D(FFFFF)V 就是编辑器自己的 setTransform(x,y,rotation,scaleX,scaleY)。
  依据:载荷 JSON 写入器 sb_0.java:669-675 + javap -c GO(两条独立证据),
  width/height 与 mega_dg4.png 真实像素 157x154 对上。
- 确认删除入口:Gn.L()V => skeleton.removeAttachment(this,true,true);GP.L=附件表、GP.Z=插槽表;
  占位附件是载荷类 Hi(hi_2.java 的 I() 返回 "placeholder")。
- 实机(JDK8 attach,进程 56177 全程没重启):20 个新建插槽的图片附件 x/y/rotation 归 0、scale 归 1;
  20 个 Hi 占位附件删除;骨架附件表 43 -> 23;逐个核对删除占位没连带删掉图片附件。
- 顺带把 tools/live(attach 热更工具源码)入库,jar/build 加进 .gitignore。
2026-10-16 18:26:40 +08:00
tianmo 0886ba647c 补回误删的 listQuietly(上一次改动把编译搞坏了,编辑器起不来);+10 Red Bones 暂用已验证可行的一根一次路径 2026-10-16 18:07:36 +08:00
tianmo 4000a06d61 +10 Red Bones 修两处:①每建一根等一帧(编辑器下一帧才真建,同帧连调只生效一次)②颜色按映射表写 Gp 的 color 字段(混淆名 B),不再取'第一个 Color 字段' 2026-10-16 17:57:06 +08:00
tianmo b09a7e0659 统一'当前操作对象':优先取编辑器里的选择(用户在层级面板选),New/Delete/Rename/+10 全部改用 currentTarget() 2026-10-16 17:55:50 +08:00
tianmo dd520655f0 +10 Red Bones 的父级改为读'编辑器当前选择'(用户是在层级面板里选的,不走我们列表行) 2026-10-16 17:55:10 +08:00
tianmo e57d31dfe6 撤掉列表表格外层的包装容器(它让编辑器布局抛 RuntimeException: Actor: ScrollPane,面板因此失去响应) 2026-10-16 17:53:55 +08:00
tianmo f696c15671 新增按钮 +10 Red Bones:在当前选中骨骼下用编辑器自己的 New Bone 建 10 根,位置随机(±200),颜色写 red(Gp 的 x/y 走 names.tsv 反查、color 按类型找字段) 2026-10-16 17:52:04 +08:00
tianmo 2e325bc1b9 去掉根表格 setFillParent(它把根表格拉成父容器大小,反而压扁三段);实测 root 仍被父容器限制在 ~1250 2026-10-16 17:39:50 +08:00
tianmo a0c1b13a47 列表表格外包一层容器(容器 setFillParent + 表格 expand/fill),让表格铺满 ScrollPane 视口(绿框=红框) 2026-10-16 17:37:47 +08:00
tianmo 3b5e80f991 中段套回 ScrollPane(填满该格高度=红框、内容超出时裁剪+可滚) 2026-10-16 17:36:14 +08:00
tianmo b737cc2b87 修 spine-lab/启动实验室Spine.command:它注入的 native-hook/hook.dylib 早已不存在(那套方案已废弃),改为调用 viewpanel/run.sh 2026-10-16 17:31:33 +08:00
tianmo 104eaba8c0 中段直接放列表表格(去掉 ScrollPane):expand/fill 撑满红框(代价:失去滚动) 2026-10-16 17:25:08 +08:00
tianmo d6a766d5b4 列表表格垫空白(80行)让 pref ≥ ScrollPane 视口:列表区域铺满红框,内容多时照常滚动 2026-10-16 17:24:23 +08:00
tianmo 949d741cde 列表表格 setFillParent(true):撑满 ScrollPane 视口(原来按内容固定高度只画一小块) 2026-10-16 17:23:38 +08:00
tianmo 9b85090e93 拉伸后保持内容靠左上:按钮块 top()+left(),日志格加 top() 2026-10-16 17:22:11 +08:00
tianmo 22c483738c 三段控件纵向拉伸填满各自单元格:按钮块与日志块加 fillY(Cell.L),中段原本已有 fillY 2026-10-16 17:21:28 +08:00
tianmo ee82bedabe 三段都加 expand(用户点名):吃掉停靠框剩余空间,消掉底部空带;600:1400:400 的比例仍作为各段 pref 2026-10-16 17:19:31 +08:00
tianmo dc4db3e8fa 三段按 600:1400:400 等比缩放到 Stage 高度(略大于停靠框):内容盖过底部,消掉底部空带 2026-10-16 17:17:37 +08:00
tianmo efeee1fe5a 加一行布局实测日志(root/按钮表/日志Label 高度),用于定位'底部空一条'的原因 2026-10-16 17:15:01 +08:00
tianmo 120d88bf0b 改回固定高度:上 600 / 中 1400 / 日志 400(不做等比缩放) 2026-10-16 17:13:32 +08:00
tianmo 4505c50af1 三段按 600:1400:400 的比例缩放到面板高度(原来三个数合计 2400 超过面板,被 libGDX 压扁导致比例看着不对) 2026-10-16 17:12:36 +08:00
tianmo 2a02984b79 三段固定高度按用户指定:上 600 / 中 1400 / 日志 400 2026-10-16 17:11:46 +08:00
tianmo 6744f122b4 三段高度按用户指定:中段 1400、日志段 400、上段取剩余;三段单元格都用 fillX 占满面板宽度 2026-10-16 17:10:22 +08:00
tianmo 8e9f70fdbd 下段(日志)固定 800 高;中段 = 面板高 − 上段20% − 800(仍铺满,不出空带) 2026-10-16 17:08:51 +08:00
tianmo 05c5d45cca 修 run.sh(漏 import os,导致编辑器根本起不来)+ 三段高度 20/60/20 自动按 Stage 高度算(实测 Stage.B()F=getHeight:4K 窗口 2044) 2026-10-16 17:07:41 +08:00
tianmo 84a8f30811 三段高度按 20/60/20 计算,面板高度可配置:-Dpanel.h=<像素>(默认 984,run.sh 支持 PANEL_H 环境变量)——4K 屏窗口更大时用得上 2026-10-16 17:01:37 +08:00
tianmo 77d6a91422 中段高度自适应父容器:middle = 父容器高(fillParent 前读到的 dock) − 按钮段 − 日志段(不用 expand);3 次迭代收敛 2026-10-16 16:59:27 +08:00
tianmo 8a1279bf5c 按用户要求去掉 expand:中段(列表)只用固定高度 700 做成最长的一段(fillY=L 拉伸),日志段自然高度贴底 2026-10-16 16:57:10 +08:00
tianmo 5c5ae8e7aa 中段(列表)改回最长的一段:expand+fill 吃掉剩余空间、保留高度下限;日志段只占自然高度贴底 2026-10-16 16:56:10 +08:00
tianmo 42def5b395 消除第 4 条空带:中段固定 450 且不再 expand,剩余高度全部给日志段(文字贴段顶)——此时面板就是干净的 上/中/下 三段 2026-10-16 16:55:14 +08:00
tianmo 1f402ea8e4 日志段固定高度 200(Cell.I=height 实测确认),中段 450:根表格三段都能看出来(上按钮/中列表/下日志) 2026-10-16 16:54:34 +08:00
tianmo 5a59b0f739 按用户要求画出上/中/下三段边界:根表格 setDebug(true)(载荷名 et.B(Z)V,对照表已确认)—— 红线=根表格三个单元格(按钮/中段/日志)的边界,绿线=按钮块内部单元格 2026-10-16 16:51:13 +08:00
tianmo 05e2d1b074 中段固定高度:Cell.I(float)=height(实测确认:设 900 → 根表格 580->1080;设后列表区出现滚动条可滚)。值先取 700,并把该映射写进 anchors.tsv/names.tsv 2026-10-16 16:50:16 +08:00
tianmo a5307021f3 回滚到可编译版本并修映射表路径:从 classes 往上找含 tools/deobf/names.tsv 的仓库根(Inspector 显示真名) 2026-10-16 16:46:14 +08:00
tianmo 84eb409b76 修映射表路径:classes 上跳三级才是仓库根(<root>/viewpanel/build/classes) 2026-10-16 16:44:46 +08:00
tianmo f0b78dbfd6 Inspector 显示用映射表翻译真名:字段/方法显示为 realName(混淆名),表来自 tools/deobf/names.tsv(运行时载荷不能改名,indy 靠加密串里的原名反射查找) 2026-10-16 16:44:12 +08:00
tianmo 0cdc0894a4 Revert "面板支持热更:视图里挂稳定容器(编辑器类加载器建的 Table),面板内容放在容器里;后台线程轮询 build/classes/com/spineview/ObjectPanel.class 的 mtime,一变就用新的子类加载器重建内容换进容器 —— 改完代码只需 build.sh,编辑器不用重启、场景与选择状态保留"
This reverts commit be0ed2352b.
2026-10-16 16:37:58 +08:00
tianmo be0ed2352b 面板支持热更:视图里挂稳定容器(编辑器类加载器建的 Table),面板内容放在容器里;后台线程轮询 build/classes/com/spineview/ObjectPanel.class 的 mtime,一变就用新的子类加载器重建内容换进容器 —— 改完代码只需 build.sh,编辑器不用重启、场景与选择状态保留 2026-10-16 16:35:23 +08:00
tianmo f8d2cda17c grabScrollFocus 改用 getMethods():Stage 的焦点 API 声明在接口里(lpt6 implements LPt9),getDeclaredMethods 扫不到(实测 setter1/getter0);排除 Actor/Group/WidgetGroup 上声明的同名形状方法以免误调 addActor 2026-10-16 16:31:48 +08:00
tianmo 55c0794ed4 面板恢复成上/中/下三段:上=按钮块(两列紧邻+名字输入框)、中=列表(expand+fill)、下=日志(独立 Label,自然高度贴底);去掉列表里内嵌的日志行与之前未验证的尺寸调用 2026-10-16 16:26:15 +08:00
tianmo 4b05804479 修鼠标滚轮(第3版):面板按钮动作后把编辑器的滚动焦点抢到列表上
- 诊断证据:给列表 ScrollPane 挂 EventListener 代理后,滚轮事件收到 0 条 → 滚轮被视口的 scroll focus 拿走;
- grabScrollFocus():只在 **Stage 自己声明**的方法里找(addActor 声明在 Group,不会误调);
  setter=『1 个参数是 Actor、返回 void』,getter=『无参返回 Actor』;调 setter 后看哪个 getter 变成面板,
  找到就写日志『滚动焦点已抢到面板:setter=.. getter=..』,找不到写『没找到 setScrollFocus』。
- 触发时机:每次点击面板按钮/字段行之后(路由器里统一调用)。
2026-10-16 16:22:19 +08:00
tianmo 995ec585f4 修正映射表:把 MapMethods 的候选猜测(~n/m)从确定表里剔除
- anchors-libgdx.tsv 只保留唯一命中的 (126 条);候选消歧的 (138 条)移到
  anchors-libgdx-unconfirmed.tsv 并标『不可信、要用先实测』;
- names.tsv 重新合并 = 确定(=) + 手动/实测锚点(不再混入猜测)。
2026-10-16 16:20:00 +08:00
tianmo 13bce4509d 让鼠标滚轮能滚列表:把列表 ScrollPane 的 touchable 从默认 childrenOnly 改成 enabled(无参返回枚举的方法=getTouchable,枚举 dv 第0常量=enabled)
- 诊断证据:程序化 scrollY(200) 生效(before=0 after=200),说明可滚范围没问题,
  是滚轮事件没送到面板 —— 因为 childrenOnly 时 ScrollPane 自己不是命中目标,收不到 enter、
  也就不会 setScrollFocus。
- 顺带把这条 Actor/Touchable 映射写进 anchors.tsv + names.tsv。
2026-10-16 16:18:28 +08:00