[English] [project page]

idsoftware forever on Dreamcast

Quake

画面写真

quake

After The Fall TC

Mod select menu

glquake

進行状況

Quake II

画面写真

ソフト描画

進行状況

Hexen2

画面写真

glhexen2

進行状況

ちなみに、QuakeとQuake2はLinux/SH上では無改造で動作します。

Downloads

sf.net project files area
(*) 誰かコミケで置いてくれんかのう

謝辞


技術解説

DC Quakeは3つのコードでできています。

- newlib with kos
- kos付属のkglをほぼ全て書き直したOpenGL API
- quakeソースコード
-- quakeの機種依存コード
-- Quakeソースの変更

さらに、kosを若干変更しています。


newlib with kos

 newlibは組み込み用途を想定した有名な標準Cライブラリです。

- kosのlibcの代わりにnewlibを使います。
- kosの#defineとtypedefを、newlibと一致するように変更します(O_RDONLYなど)。
- newlib/libc/sys/syscalls.cの代わりに、unixのシステムコール的な関数を作成します(open/readなど)。

 リンク時には、kosのスタートアップコードと新しく作成した関数をリンクします。

syscalls code:

 open,read,write,close関数をkosのfs_xxxxを呼び出すように作成します。
- open関数は失敗時に-1を返しますが、fs_openは0を返す。
- newlibのファイル関数(fopen等)は、ファイルハンドルが0から始まる整数を想定しているようで、
 失敗時の戻り値のチェックが "if (retval==-1)" でなく "if (retval<0)" となっています。
 kosのファイルハンドルは実際には内部ファイル構造体のポインタであり、8c0010000以降の値を持つので、常に負になります。

 このへんのつじつまが合うようにラップします。

OpenGL API

 今のところ、quakeで使われている関数や#defineしか実装していません。
 near/farクリッピングは実装していません。

Quakeソースの変更:

Quakeのコードでは、巨大なstatic/global変数を確保しているので、そのままではメモリが不足します。
- 一時的作業領域 -> mallocまたはallocaに変更
- structe varname[MAX_xxx]; のように静的に確保しているところで、#defines MAX_xxxを小さくする。
  大きなマップはロードできなくなります。

glquakeのコードでは、不透明テクスチャを内部フォーマットGL_COLOR_INDEX8_EXTのGL_GL_COLORINDEXテクスチャとして、 
抜きテクスチャをGL_RGBAテクスチャとして扱っています。
Dreamcastでは、パレットテクスチャでもαが利用できるので、 両方ともGL_COLORINDEXを使うように変更しました。
また、ライトマップに使われているGL_LUMINANCEテクスチャには専用のパレットを割り当て、内部的に8bitテクスチャとして扱っています。
この変更により、16bitのARGB4444から8bitのパレットテクスチャとなり、テクスチャメモリの使用が半分になります。
QuakeはglTexSubImag2Dを使ってテクスチャを書き換えることがあるので、VQ圧縮テクスチャは使っていません。
mipmapはメモリの制限で使用していません。
同様にメモリの制限で、テクスチャの大きさを256x256に制限しています。


DC Quake2にはもう一つコードがあります:

- modやレンダラの変更をサポートするため、sh-elf静的オブジェクトをdllとして扱う機構
Hosted by:
SourceForge Logo