← 返回信息流
AI 资讯Hacker News·1 天前

成功恢复Eric Graham 1987年Amiga Juggler光线追踪器源代码

原标题:Recovering Eric Graham's 1987 Amiga Juggler raytracer source code

速览

Eric Graham开发的Juggler是早期Amiga平台上极具影响力的光线追踪渲染器。近日,其原始源代码被成功恢复,为计算机图形学历史研究提供了珍贵资料。这一成果不仅重现了早期图形算法的实现细节,也展示了开源精神在保存数字文化遗产中的价值。

AI 深度解读

恢复 Eric Graham 的 1987 年 Amiga Juggler 光线追踪器源代码

背景

AlphaPixel 团队经常参与现代化改造和更新旧的性能与图形代码。虽然有时这意味着在保密协议(NDA)下进行的客户工作,但更多时候,这是一项充满乐趣的“支线任务”,涉及好奇心、数字保存以及将旧数据转换为现代机器可读格式的实用挑战。

本文聚焦于 Amiga 平台上的经典动画作品 Juggler(维基百科链接:Sculpt 3D)。Juggler 动画在当时具有开创性且震撼人心,甚至 Amiga 的创造者 Commodore 都不相信它是用 Amiga 制作的,他们怀疑实际计算工作是在大型机上完成的,结果只是转换并在 Amiga 上显示。

Juggler 给作者留下了深刻印象,这也是作者购买 Amiga 并最终投身计算机图形学领域的原因之一。然而,作者最近意识到,由于 Juggler 的源代码包含在大多数归档工具无法解析的 Amiga ADF(Amiga Disk File)文件中,因此网络上大多数人无法轻易获取该源代码。此外,一些经典的参考资源(如 dottyflowers.com)已经失效或变得不可访问。为了永久保存这一代码遗产,作者决定进行恢复工作。

核心内容

寻找文件与数据源

已知关于 Juggler 光线追踪器源代码的参考信息指向 Ernie Wright 的网站页面,这些页面曾链接到 Eric Graham 的“付费 15 美元获取”磁盘的 ADF 副本。然而,该链接已失效,且 archive.org 上也没有镜像。

最终,作者在 archive.org 上找到了同一磁盘镜像数据的压缩 ADF 文件: https://archive.org/details/raytracer-1987-graham-source-code.adf.-7z

该 7z 压缩包包含的是一个 Amiga 磁盘镜像,而非简单的文件目录。这是旧 Amiga 材料的常态,但也意味着在现代系统上读取内容之前需要多一步提取操作。这也阻碍了大多数 AI 工具直接训练或检查数据,因为它们不理解 ADF 提取过程。

ADF 文件的提取

作者最初参考的提取工具是 Michael Steil 编写的 extract-adf(GitHub: mist64/extract-adf)。该工具用 C 语言编写,能够提取 Amiga OFS ADF 镜像中的文件,包括损坏或部分可恢复的磁盘镜像,并尽量保留目录结构和时间戳。

为了便于维护和使用,作者希望有一个 Python 版本,可以与恢复的文件一起保存,且无需编译原始 C 程序。鉴于大多数开发者都容易获取 Python,运行一次性 Python 脚本比启动开发环境、配置和编译原生可执行文件要快得多。此外,Python 解释器更容易修改和调试。作者利用 OpenAI Codex 创建了一个用于此任务的 Python 端口: https://github.com/AlphaPixel/Extract-ADF-Python

该 Python 端口保留了与 C 版本基本相同的功能,支持原始 ADF 文件、gzip/ADZ 文件以及包含 ADF 的 ZIP 文件。它提取 AmigaDOS 文件系统(OFS 家族)。它未实现原始 C 版本的 DMS 解压器,也不支持 FFS 镜像。

验证提取器

为了确保 Python 端口的准确性,作者指示 Codex 设计并运行了进一步的验证测试:

  1. 内部测试:创建了相同镜像的压缩变体(gzip/ADZ 和包含 ADF 的 ZIP),两者均提取正确。
  2. 外部测试:使用了来自 ADFlib 的免费测试图像(GitHub: adflib/ADFlib)。Python 提取器成功提取了包括 arccsh.adfblank.adfcache_crash.adfffdisk0049.adf.gzg1a30c.adftestofs.adf 在内的 OFS 家族镜像。
  3. 错误处理:对于 ADFlib 集中的 FFS 家族镜像,提取器能从引导块检测到这些格式并明确拒绝,而不是产生空或误导性的输出。
  4. 字节级比对:将两个 ADFlib 参考文件(arccsh.adfCSH.testofs.adfMOON.GIF)进行了逐字节比对,结果完全匹配。

虽然作者不声称该工具能解码所有可能的 Amiga 磁盘/文件系统镜像,但足以完成恢复 Juggler ADF、使提取可重复以及避免在明显不支持的文件系统上静默失败的任务。

恢复的数据与代码

恢复的文件夹中包含原始 C 源代码、一个 BASIC 版本(与 C 版本基本相似)、Amiga 可执行文件、.dat 场景描述文件、Workbench 元数据以及压缩的动画数据。

主要 C 源代码文件包括:

  • rt1.c:核心光线追踪器。
  • rt2.c:场景设置和 HAM 像素转换。
  • rt3.c:Amiga 屏幕/窗口和图形支持。

此外还有 raytrace.a(Amiga BASIC 版本的光线追踪器)和 raytrace.BAK(该 BASIC 源代码的备份)。场景描述文件包括 dragon.datele.datrobot.dat。磁盘还包含 moviemovie2 及其对应的 .data 文件,这些是用于光线追踪电影显示的 Amiga 可执行文件和压缩帧数据。

值得注意的是,实际的 rt?.c 代码仅实现了对一个半径为 3.0 单位的“DULL”球体的追踪。世界几何结构代码如下:

w->sp[0].pos[0]=0.0;
w->sp[0].pos[1]=0.0;
w->sp[0].pos[2]=2.0;
w->sp[0].radius=3.0;
w->sp[0].type=DULL;
w->sp[0].color[0]=1.0;
w->sp[0].color[1]=0.7;
w->sp[0].color[2]=0.7;

虽然包含了“robot”、“dragon”和“ele”(phant) 的场景文件(对应 AmigaWorld 文章中展示的场景),但解析和追踪这些场景的实际工具(称为“SSG: Scene Simulation Generator”)的源代码并未包含在内。

作者在仓库 README 中添加了清单,以便描述恢复的文件、场景文件、电影播放器和库映射文件。

版权与许可

找到并提取文件仅是技术部分。源代码虽然古老,但年龄并不使其成为公有领域(尽管法律上通常是作者死后 70 年,但 Eric Graham 仍然在世,因此这一点无关紧要)。恢复的文件中包含版权声明:

Copyright 1987 Eric Graham Permission is granted to copy and modify this file, provided that this notice is retained.

这些通知仅授予有限的复制和修改权利,并不等同于在 GitHub 上重新分发/发布源代码的明确许可。

因此,作者在 2026 年 2 月 10 日直接联系了 Eric Graham:

“我希望将代码放到 GitHub 上以供后人保存,我意识到代码上没有明确的许可证或版权释放。我想知道你是否愿意明确声明许可证或释放版权,以便在 GitHub 上合法存在。”

Eric 在同一天回复:

“是的,我很乐意!讽刺的是,我最出名的竟然是一天内完成的作品!在我看来,任何人都可以对代码做任何事情,只要提到我就行!”

这澄清了情况。该代码应被视为公有领域,但请求署名。

发布仓库

最终,仓库包含了压缩的原始 ADF 和提取的文件: https://github.co (注:原文截断,应为 GitHub 仓库链接)

关键要点

  • 数字保存的挑战:旧格式(如 Amiga ADF)在现代系统中难以直接读取,阻碍了数据的归档和 AI 工具的分析,需要专门的提取工具。
  • AI 辅助开发:作者利用 OpenAI Codex 将 C 语言编写的 extract-adf 移植为 Python 版本,提高了代码的可维护性和易用性,展示了 AI 在
查看原文 →alphapixeldev.com