奥维实验icon
奥维实验
耳内有灰
对话框和列表都正常了。但有两个问题:导入了 0 个像素 — 日志显示 (128.0x128.0 -> 32x32) 但 导入完成: 0 个像素KTX 格式错误 — Unsupported texture format in KTX file,说明 cache:GetResource("Image", ...) 加载了 GPU 压缩格式,GetPixel 无法正确读取需要改用 Image() 直接加载文件来读取原始像素数据。Image 有 IsCompressed() 方法。问题是 cache:GetResource("Image", ...) 可能自动加载了 KTX 压缩格式。需要用 Image:new() 创建并手动从文件加载,绕过缓存的压缩格式。我可以用 cache:GetFile() 获取文件,然后用 Image:new() 创建 Image 对象并从文件 load。Bot Avatar现在修改 CharData:ImportFromImage,改用 Image:new() + cache:GetFile() 加载原始 PNG 数据。构建成功。修复方案:改用 cache:GetFile() + Image:new() + image:Load(file) 加载原始 PNG 数据绕过 cache:GetResource("Image") 可能返回的 KTX GPU 压缩格式加了 IsCompressed() 检查作为额外保险可以预览测试——再次点击「导入」选择一张图片,应该能看到像素被正确导入到画布上了。
耳内有灰
嗒啦啦终于修复:继续修复地形纹理渲染为条纹的 bug。问题已定位:nvgImagePattern 使用了原始纹理尺寸(如 512×512)作为 pattern 大小,但每个 tile 只有 64×64,导致只显示纹理的一小部分。让我先读取当前代码确认状态。问题清晰了。三个渲染路径都需要修复:普通渲染:nvgImagePattern(nvg, ox, oy, texW, texH, ...) → 应改为 (x, y, ts, ts)镜像渲染:同样使用了 texW, texH → 应改为 ts, tsdiagShift 路径:使用 pw = texW * 13,这个逻辑是特殊的大尺寸纹理映射,暂不改动核心修复:将 pattern 大小从原始纹理尺寸改为 tile 尺寸,pattern 起点改为 tile 位置,这样每个 tile 恰好显示一张完整纹理。构建成功。修复内容总结:问题:地形纹理渲染为条纹/斜线,完全看不到素材样貌。根因:nvgImagePattern 的 pattern 尺寸使用了原始纹理尺寸(如 512×512),但每个 tile 的矩形只有 64×64。纹理被映射到 512px 宽的区域上,而 tile 只截取了其中 1/8 的窄条,导致出现条纹。修复:普通渲染:nvgImagePattern(nvg, x, y, ts, ts, ...) — pattern 大小改为 tile 大小,起点改为 tile 位置,每个 tile 恰好显示一张完整纹理镜像渲染:同样改为 nvgImagePattern(nvg, fx, y, ts, ts, ...)diagShift 路径:保持不变(该路径使用 13 倍放大纹理,是专门的对角线纹理逻辑)
耳内有灰
已修复的问题:VirtualList 无法滚动 — 根本原因是 Modal 的内容容器使用 YGUndefined 高度,导致 flexGrow=1 的列表容器实际高度为 0,VirtualList 的 ScrollView 无法获得滚动空间。修复方式是将 listContainer 和 VirtualList 都改为明确的固定高度 460px,并设置 viewportHeight = 460。排序切换功能 — 在留言列表头部添加了排序切换按钮,支持两种排序模式:按热度排序:优先按点赞数降序,其次按评论数降序按时间排序:优先按发布时间降序点击按钮即可在两种模式间切换,切换后自动重新排序并刷新列表。