Scenery SDK 調査室

Under Construction

はじめに

Microsoft から公開された Scenery SDK を調査した資料をまとめたものです。

Scenery SDK は Flight Simulator 98 : Software Development Kit の第4パート にあたり、FS98 のシーナリファイル構造の解説と、シーナリ作成方法について述べたものになっています。

従来、BGL ファイルの構造は "FS5STRUC" で解説されていましたが、これは Microsoft 公式のものではありませんでした。公式なドキュメントが Microsoft から公開された ことは歓迎すべきことです。

SDK は量が結構あるので、全部を解説するのは大変ですので、つまみ食い的に 役に立つ情報だけを選んで解説したいと思います。

なお、Scenery SDK はここからダウンロードできます。


コンパイラは何を使うのか?

Scenery 作成用コンパイラとしては、フリーソフトの SCASM が有名で、事実上の 標準となっています。が、SCASM は Microsoft 公式のツールではありません。

今回、Scenery SDK の公開にあたり、Microsoft 社内で 使用されている(であろう)正式なコンパイラが公開されることを期待していました。

が、蓋をあけてみるとコンパイラは含まれておらず、MASM (Microsoft 社のアセンブラ)を使って BGL ファイルを作成するようになっています。これにはやや失望しました。まさか、BAO や Microsoft は全てのシーナリを MASM で作成したのでしょうか? とてもそうは思えないのですが、、、

そのかわり、MASM で使用するためのマクロファイルが添付されています。これを使えば SCASM のような感じで BGL ファイルの作成ができるようです。でも、BGL ヘッダなども 全部自分で作成しなければならないので、かなり面倒です。


左手座標系

シーナリ中で使用される座標系は左手座標系であることが判明しました。 簡単にいうと、 という感じです。

ちなみに SCASM では右手座標系ですので、y軸と z軸が逆になります。 SCASM で座標指定するときに、"x z y" の順に指定するのはこういうことだったのです。


Earth Model

地球は完全な球ではなく、横にやや「太った」形になっています。 FS98 でもこれを考慮しており、赤道一周の長さが 40075.0Km、北極と南極を 通る一周の長さを 40007.0Km としています。

BGL の各セクションの対応

FS5STRUC では、BGL ファイル中には 0 から 21 までの 22 個の「セクション」が あると解説されていました。各セクションには、セクション固有の情報(VOR、 ILS、Airport などなど)が納められています。

Scenery SDK ではセクションという言葉は使われておらず、「Entities」という 呼び方がされています。 ここでは、従来のセクションと Entities の対応を示します。
SectionEntities
0: VORVOR_DATA
1: Synthetic ScenerySYNTH_SEEDS_08
2: Synthetic ScenerySYNTH_SEEDS_09
3: Synthetic ScenerySYNTH_SEEDS_10
4: Synthetic ScenerySYNTH_SEEDS_11
5: Synthetic ScenerySYNTH_SEEDS_12
6: Synthetic ScenerySYNTH_SEEDS_13
7: UnattestedSYNTH_SEEDS_14
8: UnattestedSYNTH_SEEDS_15
9: Procedural sceneryOBJECT_DATA
10: ??LIBRARY_DATA
11: AirportsFACILITIES_DATA
12: ??ANCHOR_POINTS
13: ATISCOM_DATA
14: NDBADF_DATA
15: Dynamic sceneryDYN_PATH_DATA
16: IMO markers, land-meMISC_DATA
17: ??TITLE_DATA
18: Magnetic variationMAGDEC_MAP
19: unattestedEXCEPTIONS_DATA
20: unattestedspare 1
21: unattested0 (not saved to file list)

以下のことが判明しました。


Radsort システム

シーナリ中に複数のオブジェクトがある場合、遠い方から近い方へと順番に描画することによって、重なり描画処理を行うようになっています。これは「Radsort(radial sort)システム」と呼ばれます。

上下に積み重なったオブジェクトの場合はうまくソートされないので、ADDOBJコマンドを使って radial sort list に手で登録を行う必要があります。ADDOBJ コマンドは、SCASM の PerspectiveCall のことです。

なお、radial sort list には2本あり、一本はオブジェクト用、もう一本は山用です。 山用の radial sort list 追加コマンドは ADDMNT コマンド(注:添付マクロ内では ADDMTN になっている)です。これは SCASM の PerspectiveSurface コマンドのことです。

なお、radial sort list のサイズはシーナリの complexity によって決まります。
ComplexityRadsort buffer size
0200
1200
2400
3400
4600
なお、FS98 では以前のバージョンに比べ radsort バッファが4倍のサイズになっています。これは 256KBytes までのデータベースを扱えるようになったからだそうです。


Categories システム

シーナリエンジンには、描画順序を変更する手段として Radsort システムの他に Categories システムというものがあります。Categories システムを使うと、特定の BGL コードの実行を遅延する(つまり全面に描画する)ことが可能です。Radsort システムでももちろん良いのですが、Radsort ではソート時間がかかるという問題があります。

アイテムを category list に追加するには ADD_CAT コマンドを使います。 これは SCASM の LayerCall コマンドに相当します。


カラーコード

カラーコードが fs6def.inc ファイルで定義されています。 これらはいわゆる FO カラーです。SCASM で SurfaceColor( 01 F0 ) などとして使うあれです。
C_BLACK		EQU		00000f000h
C_DKGRAY		EQU		00000f001h
C_GRAY		EQU		00000f002h
C_LTGRAY		EQU		00000f003h
C_WHITE		EQU		00000f004h
C_RED		EQU		00000f005h
C_GREEN		EQU		00000f006h
C_BLUE		EQU		00000f007h
C_ORANGE		EQU		00000f008h
C_YELLOW		EQU		00000f009h
C_BROWN		EQU		00000f00ah
C_TAN		EQU		00000f00bh
C_BRICK		EQU		00000f00ch
C_OLIVE		EQU		00000f00dh
C_WATER		EQU		00000f00eh
C_BRIGHT_RED		EQU		00000f00fh
C_BRIGHT_GREEN		EQU		00000f010h
C_BRIGHT_BLUE		EQU		00000f011h
C_BRIGHT_AQUA		EQU		00000f012h
C_BRIGHT_ORANGE		EQU		00000f013h
C_BRIGHT_YELLOW		EQU		00000f014h
C_BRIGHT_WHITE		EQU		00000f015h
C_CONST_WHITE		EQU		00000f016h
C_DARK_RED		EQU		00000f017h
C_DARK_GREEN		EQU		00000f018h
C_DARK_BLUE		EQU		00000f019h
C_DARK_ORANGE		EQU		00000f01ah
C_DARK_YELLOW		EQU		00000f01bh
C_DARK_BROWN		EQU		00000f01ch
C_DARK_TAN		EQU		00000f01dh
C_DARK_BRICK		EQU		00000f01eh
C_DARK_OLIVE		EQU		00000f01fh
C_MED_RED		EQU		00000f020h
C_MED_GREEN		EQU		00000f021h
C_MED_BLUE		EQU		00000f022h
C_MED_ORANGE		EQU		00000f023h
C_MED_YELLOW		EQU		00000f024h
C_MED_BROWN		EQU		00000f025h
C_MED_TAN		EQU		00000f026h
C_MED_BRICK		EQU		00000f027h
C_MED_OLIVE		EQU		00000f028h
C_LIGHT_RED		EQU		00000f029h
C_LIGHT_GREEN		EQU		00000f02ah
C_LIGHT_BLUE		EQU		00000f02bh
C_LIGHT_ORANGE		EQU		00000f02ch
C_LIGHT_YELLOW		EQU		00000f02dh
C_LIGHT_BROWN		EQU		00000f02eh
C_LIGHT_TAN		EQU		00000f02fh
C_LIGHT_BRICK		EQU		00000f030h
C_LIGHT_OLIVE		EQU		00000f031h
C_BRIGHT_DKGRAY		EQU		00000f032h
C_BRIGHT_GRAY		EQU		00000f033h
C_BRIGHT_LTGRAY		EQU		00000f034h
G_DKGRAY		EQU		00000f001h
G_GRAY		EQU		00000f002h
G_LTGRAY		EQU		00000f003h
G_WHITE		EQU		00000f004h
G_RED		EQU		00000f005h
G_GREEN		EQU		00000f006h
G_BLUE		EQU		00000f007h
G_ORANGE		EQU		00000f008h
G_YELLOW		EQU		00000f009h
G_BROWN		EQU		00000f00ah
G_TAN		EQU		00000f00bh
G_BRICK		EQU		00000f00ch
G_OLIVE		EQU		00000f00dh
To be continued...