tianmo
|
6580611012
|
动画面板:新增两个动画测试按钮 + 把动画模型 API 全部落进对照表
## 功能(面板源码,重启后仍在)
- 新增 AnimationTools:
- Animate Random Props:随机骨骼/插槽/附件 → ani_api_test
旋转 0°→90°、位移 (0,0)→(120,-60)、缩放 (1,1)→(1.6,0.6)、斜切 (0,0)→(25,15)
插槽颜色 (1,1,1,1)→(1,0.2,0.2,0.25)、附件 显示→隐藏;全部只在 0f/30f
- Curve Test 6 Modes:curve_test,6 根骨骼各一条旋转轴(0°→45°,0f/30f),
分别 linear / curve 平滑(0.25,0,0.75,1) / stepped / ease-in(0.42,0,1,1) /
ease-out(0,0,0.58,1) / 对称自动(0.25,0.25,0.75,0.75)
- ObjectPanel.build 里挂载这两个按钮,复用面板自己的 wire() 点击轮询
## 对照表(tools/deobf/anchors.tsv + 混淆名对照表.md 第十一节)
- GP.I=animations、GP.D:LFT;.D:F=fps、Gl=动画(name/skeleton/timelineGroups/register)
- Gl.D/B/L/I(Gp)=旋转/位移/缩放/斜切;Gl.D/B(Gp,GU)=插槽颜色/附件;Gl.D()=绘制顺序
- FH=组;FI=时间轴(runtimeTimelineClass、keys、findKey、insertKey、invalidateRuntime)
- FN=关键帧(time、curve、c2x/c2y/c3x/c3y、setAngle/setX/setY、Color、Gn)
- FV=曲线枚举(linear/curve/stepped;'自动'=curve+控制值)
- 踩坑记录:
* 关键帧数值写在 FN.D()/B()/L() 的 float 字段,**不是** FN.D():ga(ga 是 deform 的),
否则会出现'有帧但运行时不变'
* 编辑器时间轴刻度就是**帧**,关键帧时间写 0/30,不要按 1 秒=30 帧换算
* FI.D(float,int) 建帧要求时间轴已有关键帧(先有鸡问题)
* fI.removeRange 两个 (int,int) 重载都不缩容 → 清空动画直接换新 fI
names.tsv 合并成 380 条,payload-named.zip 重产(7271 处成员引用)。
验证:全部在运行中的编辑器里逐条读回(时间轴/关键帧/曲线枚举/控制值),
重启后 pid 94663 单实例,日志确认 '[animtool] 两个动画按钮已加入'。
|
2026-10-17 12:57:17 +08:00 |
|
tianmo
|
8df990a058
|
把 New 15 Bone+Slot+Att 按钮移植进面板源码(重启后仍在)
- 新类 com.spineview.NewFifteen:按钮 → 编辑器自带名称面板(xl + ASM 子类拿名字) → 按名字匹配附件
→ 当前选中骨骼下建 15 根骨骼,每根 1 插槽 1 附件(该名字的副本)
骨骼 x/y 0~500 随机、rotation/scale/shear=0/1/0;插槽 alpha 0.5~1、blend normal/additive 随机;
附件 x/y/rotation=0、scaleX/scaleY=1(并替换掉 ADD_SLOT 带过来的模板附件)
弹窗按 pref 尺寸(>=360x170)撑开、同一次渲染回调里居中
- ObjectPanel.build 里挂一行按钮(复用 ObjectPanel.wire 的点击轮询)
- build.sh 的 javac 加 -cp ../tools/asm/asm.jar(NewFifteen 现场生成 xl 子类需要 ASM)
依据:tools/deobf/anchors.tsv + 混淆名对照表.md(全部字节码/实测确认)
|
2026-10-17 10:25:22 +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
|
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
|
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 |
|
tianmo
|
d59287937d
|
列表滚动(第二版):给列表单元格固定高度 360(Cell.height 载荷名 I,(F)LdR; 指纹确认)+ setForceScroll(false,true)(ScrollPane.I(ZZ)V 指纹确认);并把 setForceScroll/setOverscroll/Cell 尺寸方法写进 anchors.tsv+names.tsv
|
2026-10-16 16:15:35 +08:00 |
|
tianmo
|
8d396ecb5b
|
修列表滚动:ScrollPane 的 (boolean,boolean) 方法是 setScrollingDisabled 不是 setForceScroll;上一版传 (false,true) 把纵向滚动关掉了,现改为 (false,false) 恢复双向滚动
|
2026-10-16 16:13:09 +08:00 |
|
tianmo
|
320f537a60
|
只修列表:beginRender 改回复用同一个 Table(换新 ScrollPane 会抛 InvocationTargetException 导致列表渲染失败);invalidate 后再调 ScrollPane(boolean,boolean)=setForceScroll 让它按新内容高度重算可滚动范围
|
2026-10-16 16:11:54 +08:00 |
|
tianmo
|
ee1f2a2ced
|
只修列表滚动:每次渲染换一套新的 Table+ScrollPane 塞回同一单元格(复用时 ScrollPane 不重新测量 widget 高度,maxY=0 导致滚轮失效)
|
2026-10-16 16:10:20 +08:00 |
|
tianmo
|
94c467a40d
|
Revert "列表区改分页:每页 12 行 + Prev/Next(复用同一个 ScrollPane 时高度不重算,滚轮失效;分页绕开滚动)"
This reverts commit 32e707d23a.
|
2026-10-16 16:09:11 +08:00 |
|