尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

揭秘.shapeup文件格式:ShapeUp二进制快照的保存、加载与FNV-1a哈希命名机制

揭秘.shapeup文件格式:ShapeUp二进制快照的保存、加载与FNV-1a哈希命名机制 揭秘.shapeup文件格式ShapeUp二进制快照的保存、加载与FNV-1a哈希命名机制【免费下载链接】ShapeUp-publicA 3D Modeler Made in a Week项目地址: https://gitcode.com/gh_mirrors/sh/ShapeUp-publicShapeUp 是一个一周内用 C 语言完成的 3D 建模工具A 3D Modeler Made in a Week它基于构造实体几何CSG思想用球体、胶囊体等基元做布尔运算来雕刻模型。本文带你深入源码揭秘 ShapeUp 使用的.shapeup二进制快照文件格式——它如何保存、如何加载以及那个由FNV-1a 哈希生成的神秘文件名到底是怎么来的。ShapeUp 快速一览一周成型的 3D 建模工具ShapeUp 的核心玩法很直观基元建模每个可编辑对象代码中称为Sphere都有位置、尺寸、旋转角、圆角、blob程度、颜色、镜像、减法模式等参数CSG 布尔运算通过subtract标志控制加还是减配合镜像自动生成对称结构快照机制把整个场景序列化成一个.shapeup文件拖进窗口即可恢复全部模型数据就存储在一个简单的数组里int num_spheres 1; #define MAX_SPHERES 100 Sphere spheres[MAX_SPHERES];见 main.c。理解了这一行下面的文件格式就水到渠成。.shapeup 文件长什么样一个结构体数组的裸拷贝.shapeup文件没有任何文件头、魔数或压缩结构极其朴素偏移内容大小说明0num_spheres4 字节int32 小端序球体数量4spheres[0]52 字节第一个基元56spheres[1]52 字节第二个基元………依此类推其中每个Sphere结构体的字段依次为见 main.cpos(12B) size(12B) angle(12B) corner_radius(4B) blob_amount(4B) color rgb(3B) mirror x/y/z(3B) subtract(1B) 51B对齐后占 52 字节也就是说整个文件本质上是4 字节的数量前缀 一整个Sphere结构体数组的内存裸拷贝没有元数据、没有时间戳、没有版本号——极致简洁也意味着不同平台的字节序/结构对齐差异会直接影响兼容性。实测示例文件验证项目自带的示例文件完美印证了这一点example files/1 toad.shapeup首 4 字节为06 00 00 00→ 6 个基元总大小 316 4 6×52 字节 ✅example files/rubiks.shapeup首 4 字节为1f 00 00 00→ 31 个基元魔方模型由 31 个基元拼成example files/2 among.shapeup、example files/wrench.shapeup、example files/bracket.shapeup、example files/3 MikeW.shapeup 同样遵循该格式用十六进制编辑器打开任意.shapeup文件第一眼看到的就是这个小端整型的数量头。保存机制save() 如何把场景写进磁盘保存逻辑集中在 main.c 的 save() 函数核心步骤只有三步计算大小size sizeof(int) sizeof(Sphere) * num_spheres拼接内存块把num_spheres写入缓冲区开头随后memcpy整个spheres数组落盘调用 raylib 的SaveFileData写入build/目录触发保存有三种方式触发方式说明代码位置手动点击 Save 按钮文件前缀为savemain.c自动快照距上次保存超过 60 秒时自动保存前缀为snapshotmain.c哈希防覆盖文件名携带数据哈希内容一变文件名就变见下文FNV-1a 哈希命名机制每个快照都有唯一指纹这是.shapeup格式最巧妙的设计。保存时生成的文件名形如build/save_18364461836936832981.shapeup末尾那串 16 进制数字正是对整个文件内容数量前缀 球体数组计算的64 位 FNV-1a 哈希值。实现见 FNV1a_64_hash 函数uint64_t hash 0xcbf29ce484222325; // FNV 偏移量 for (i 0; i len; i) hash (hash ^ data[i]) * 0x00000100000001B3; // 先异或、再乘 FNV 质数FNV-1a 是业界著名的高速非加密哈希每字节只需一次异或、一次乘法性能出色且分布均匀。把它用在文件名上带来了三个好处内容寻址哈希由文件内容唯一决定天然实现内容不变 → 不重复写入内容变化 → 生成新文件避免覆盖历史快照免费的时间线配合自动快照60 秒一次build/目录里按哈希命名的文件就构成了一条可回溯的修改历史轻量校验想确认某个快照是否被篡改重新算一遍 FNV-1a 与文件名比对即可加载机制openSnapshot() 一键还原场景加载与保存完全对称见 openSnapshot 函数LoadFileData一次性读入整个文件从缓冲区开头取出int得到num_spheresmemcpy把剩余字节直接灌回全局spheres数组复位selected_sphere置needs_rebuild true触发 CSG 网格重建唯一的坑这里直接按当前平台的sizeof(Sphere)和字节序去解读内存因此.shapeup文件是强绑定平台的二进制格式——macOS 上生成的文件不能直接拿到 Windows 或浏览器 Web 版见 Makefile.Web里打开跨平台需保证结构体布局一致。交互上只需用鼠标把任意.shapeup文件拖进 ShapeUp 窗口程序就会检测droppedFiles并调用openSnapshot完成恢复main.c。总结一周造轮子的高效之道回看整个.shapeup格式处处体现一周项目的极简哲学格式层面int前缀 结构体数组裸拷贝几十行代码搞定序列化️命名层面FNV-1a 内容哈希实现内容寻址快照互不覆盖、可回溯I/O 层面保存与加载完全对称各不到 20 行⚠️代价无版本字段、无跨平台保障——教育级项目的合理取舍如果你是 C 语言新手这份约 2000 行、单文件为主的源码main.c非常适合作为游戏 建模 文件格式的完整学习样本从 raylib 渲染lib/raylib-4.5.0_macos/include/raylib.h到屏幕空间着色器slicer_body.fs、selection.fs再到本文明细拆解的二进制快照机制都值得一读。动手试试克隆仓库后运行make打开几个example files/下的.shapeup再用od -A x -t x1z查看文件头你就能亲眼看到 4 字节数量前缀与 52 字节步长的球体数组——理论立刻闭环 【免费下载链接】ShapeUp-publicA 3D Modeler Made in a Week项目地址: https://gitcode.com/gh_mirrors/sh/ShapeUp-public创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表