Tristeon

学生2人が5か月でC++でゼロから作った3Dゲームエンジン。VulkanレンダラーとUnityのようなエディターを備えています。私はエンジンのツールプログラマーとして、エディター、リフレクション、シリアライズを担当しました。

C++ · Vulkan · ImGui · 2017年 · GitHubスター70以上

GitHub 紹介動画
The Tristeon 3D editor with scene view, hierarchy, inspector and asset browser

普段使っているようなエディターを

Tristeon 3Dは学生2人が5か月で作りました。私はImGuiでエディター全体を書きました。トランスフォームギズモ付きのシーンビュー、ヒエラルキー、あらゆるコンポーネントを編集できるインスペクター、アセットブラウザーです。

アセットブラウザーはプロジェクトフォルダーを走査し、インポート設定を保持するメタデータファイルをアセットごとに生成します。そのためアセットの名前変更や移動をしても参照が壊れません。エディターはエンジンやゲームのコードとは別の層にあり、ゲームはエディターなしで出荷できます。


リフレクションとシリアライズ

C++にはリフレクションがないため、自分たちで作りました。シリアライズ可能な型はすべて、mainの実行前に静的マップへファクトリーを登録します。シーンとプレハブは各オブジェクトの型名とともにJSONで保存され、デシリアライザーはその名前からどんなコンポーネントでも復元できます。エンジンが知らない、ゲーム側で書かれた型でもです。

同じイントロスペクションがインスペクターも動かしており、専用のUIを書かずにあらゆるコンポーネントを表示・編集できます。

template <typename T>
struct DerivedRegister : TypeRegister
{
    DerivedRegister()
    {
        getMap()->emplace(TRISTEON_TYPENAME(T),
                          &CreateInstance<T>);
    }
};

static std::unique_ptr<IntrospectionInterface>
createInstance(const std::string& s)
{
    const auto it = getMap()->find(s);
    if (it == getMap()->end()) return nullptr;
    return it->second();
}

// In a component's header:
REGISTER_TYPE_H(MeshRenderer)

原点

Tristeonは、同じ年にパズルゲームOrbのために作った最初のエンジンから生まれました。そこで私は物理を書き、Unityをレベルエディターにしました。Tristeonは自前の本格的なエディターへの一歩でした。

エンジンのスクリプト言語選びは、別の研究C# vs. Wrenにつながりました。

A level built in Unity on the left, running live in our first engine on the right
Unityで作ったレベルを動かす最初のエンジン

レンダリングを担当したLeon Brandsと共同開発。

← ポートフォリオに戻る