lumino trail

ゲームエンジン作ってます。Github:https://github.com/lriki/Lumino Twitter:https://twitter.com/lriki8

開発状況 2018 #10

0.6.0 をリリースしました

Documentation: https://lriki.github.io/lumino/articles/documents/GettingStarted/getting-started.html

コマンドラインツールでプロジェクトを作成し、各プラットフォームでバックバッファをクリアするまでです。

※テクスチャのクラスとかも入ってたりしますが、これらはまだテストされていません。

これでひとまずクロスプラットフォーム対応を謳えるようになった気がしますが、できることはほとんどないのでまだそんなに面白くはないです。

このリリースは今後の開発のベースラインとして、本当にスタートラインに立つための動作保証を行ったものとなります。これでいろいろ安心して開発を進められるはず・・・。

Azure Pipelines を使いました

ターゲットプラットフォームも増え、フルビルドの時間も馬鹿にならなくなってきたので、毎回 5 ターゲットをテストするのはとても大変です。

ということで、ようやく CI を導入しました。リポジトリの Readme にバッジが載ります。

0.7.0 (Shader) 実装中

次はシェーダのトランスコンパイラです。

以前の記事に書いた通り、HLSL で記述されたシェーダを SPIR-V 経由でいろいろ変換します。

変換は lumino-cli コマンドから行います。

lumino-cli fxc shader.fx -o shader.cfx

プログラムからは Shader クラスの create 関数を使います。

auto shader = ln::Shader::create("shader.cfx");

こんなイメージです。

開発状況 2018 #9

0.6.0 はプロジェクト作成の自動化と各プラットフォームでウィンドウ出して画面クリアまでが目標ですが、ぼちぼち形になってきました。

lumino-cli コマンドによるプロジェクト作成

こんなコマンドを打ちます。

$ lumino-cli HelloLumino

次のようなフォルダとファイルができます。

  • Assets フォルダ
  • Sources フォルダ
  • Projects フォルダ
  • Engine フォルダ
  • HelloLumino.lnproj
  • LuminoApp.sln

Assets フォルダ

音声や画像などのファイルを入れておくフォルダです。 デプロイ時にまとめてアーカイブ化して配布パッケージに含まれます。

Sources フォルダ

.cpp などのソースファイルを置いておくフォルダです。

Projects フォルダ

各ターゲットプラットフォームごとのプロジェクトファイルが入っているフォルダです。

中はさらに次のように分かれています。

  • LuminoApp.Android
  • LuminoApp.Html5
  • LuminoApp.iOS
  • LuminoApp.macOS
  • LuminoApp.Win32

例えば、LuminoApp.iOS と LuminoApp.macOS の中には xcode のプロジェクトファイル、LuminoApp.Win32 の中には VisualStudio のプロジェクトが入っています。

Engine フォルダ

Lumino のライブラリがまるごと入っています。

ビルド済みライブラリ or Luminoのソース一式(Cocos2d-x方式) は選べるようにする予定です。 プロジェクトごとに使うLuminoのバージョンを変えたり、Lumino自体をカスタマイズするような使い方を想定しています。

git などでバージョン管理するべきフォルダではないので、クローンし直しとかしたあとは $ lumino-cli restore コマンドで Engine フォルダを復元します。

HelloLumino.lnproj と LuminoApp.sln ファイル

HelloLumino.lnproj は lumino-cli が使う情報を保存しておくためのファイルです。

LuminoApp.sln は、メインの開発環境は VisualStudio を想定しているのでサッサとプロジェクト開きたいときにダブルクリックする用です。(後でよく考える)

今後について

結局 Unity や Cocos2d-x と似たフォルダ構成になりそうです。 最初はもっと違ったのですが、特に AndroidiOS あたりの開発環境の制約を受けてこんな感じになりました。仕様変更の回数がえげつないです。

えげつなさで痛めたメンタルを癒すのに他のモジュールをいじってたので、他もそこそこ進んでたりします。 Input あたりはもうすぐ出せそうだし、テストしやすさにかかわってくるので先行して入れちゃいます。

開発状況 2018 #8

クロスプラットフォーム対応が重いです。 ネイティブ Linux は見送るかも・・・。

プロジェクトの作成について

以前は Visual Studio にプロジェクトテンプレートを登録していましたが、新しくコマンドラインからプロジェクトを作れるようにしています。

create-react-app や vue-cli のようなイメージです。

後々、プロジェクト作成だけじゃなくてリリースやパッケージ作成もコマンドひとつでできるようにしたいところ。

Shader について

先月の記事にも書きましたが、プラットフォーム問わず HLSL で書けるように詰めています。

Windows, macOS, Emscripten は多分OK。これからモバイル系を検証していきます。

Audio モジュールについて

お盆明けくらいに突然 "音" が恋しくなったので、対応予定verはかなり先ですが先行して実装していました。

ハイレベルAPIは従来の Sound クラスや GameAudio クラスなどから変える予定はありませんが、ローレベルAPIとして WebAudio に似たオーディオグラフを自由に構築できるようにしています。 これで自由度の高いエフェクトの適用を狙っています。

特定の SE にだけエコーやリバーブをかけたり、逆にシーン全体や BGM にだけかけたり、いろいろできる・・・はず。

バックエンドは DirectSound, OpenAL, SDL あたり。 Emscripten でも動作確認済み。

ちなみに XAudio2 はやめようと思います。やめることでDirectXランタイムのインストールが不要になるので、エンドユーザーに面倒かけずに済む。かも。

開発状況 2018 #7

0.5.0 リリースしてました。

Nuget: https://www.nuget.org/packages/Lumino.Core/

Documentation: https://lriki.github.io/lumino/articles/documents/index.html

まだベースライブラリだけなので、特徴的なものは少ないです。

ですが、プロトタイプと言い訳するつもりではない最初のバージョンです。

Lumino.Core について

簡単に説明を。

Lumino.Core はグラフィックスやオーディオ以外の、非 UI 部分を担当するモジュールです。

重要なコンセプトは以下2つです。

というところで UTF-16 ベースの文字列クラスや、メモリ管理を参照カウントベースにしたコレクションクラスなど 車輪再開発の成果ぽいもの がたくさん詰まっています。

OpenGL で HLSL Effect してみる

HLSL のエフェクトフレームワークはちょっとシェーダ書きたいときには便利でしたが、DirectX11 では標準機能から外されました。 Effects11 のソースコードは公開されていますが、古いコードの移植支援ということで推奨はされていないようです。

また Lumino としては使いやすい Shader インターフェイスを考えるのは長い間課題でした。

理想としては DirectX9, 11 あたりの HLSL Effect コードを書いておけば、OpenGL でも macOS でも、API や環境を問わず動かせるようにしたいです。 ついでに、事前コンパイルしなくてもちょっとした動作確認やサポートツール開発のために、ソースファイルを入力してプログラムオブジェクトを作ったりしたい。

Cg のサポートが終了してから色々と調べまわっていましたが、glslang + spirv-cross + technique構文の自前パース に落ち着きそうです。(余談ですが、仕事でメンテしてる構文解析ツールのレガシーコード感にむしゃくしゃして作ってしまった解析ライブラリが、ガベージでコレクションなことにならなくて済みそうです)

あと glslang の HLSL フロントエンドが強かったです。HLSL5 も使えるんだね。

↓ HLSL で書いた大気シェーダを OpenGL で動かしたところ。

f:id:lriki:20180731201936p:plain

開発状況 2018 #5

なんだか最近、仕事でも趣味でもあんまりコード書かない気がします。

Core モジュール開発中

0.4.0 までのコードに対してドキュメントとテストを付けてたり、AndroidEmscripten でビルドできるように修正を入れたりしています。

ただ動くだけじゃなくて、そこからちゃんと使えるようにするまでの壁が厚いです。

NuGet にプレビュー版を上げました

Lumino.Core 0.5.0-pre2

Visual Studio 2017 の C++ 用です。 [NuGet パッケージの管理] などでインストールしたら以下のようなコードではろーできます。

#include <iostream>
#include <LuminoCore.hpp>

int main()
{
    ln::String str = u"Hello, Lumino!";

    std::cout << str << std::endl;

    return 0;
}

なんの宣伝もしてないのにダウンロード数が上がってるんだけどなんだろう?botかなぁ?

開発状況 2018 #4

Lumino 8歳になりました。

多分そのくらい。

好きで作ることと惰性で作ること

開発に疲れて数週間音沙汰が無くなったと思いきや、以前より増した謎のモチベーションで GitHub に草を生やし始めます。 こんなことも半年スパンでかれこれ5回目くらいです。そういう人間なんでしょう。

一方の惰性の話。 Lumino は OSS ですが、やってることは多分全然オープンじゃないです。 というのも実際のところ「自分の成果物を他人と共有する」よりも「自分が勉強したことを実際にコードに落とす」ことに傾倒しすぎています。

まぁそのほうが楽しいからね。目標を文書にして開発ガイドラインを整えてリリースパッケージを準備するのは大変な仕事です。 だからだらだらと、勉強して、コード書いて、動いて、次。

勉強目的ならそれでいいし車輪開発も歓迎なんだけど、でもそうじゃないんだよ。そろそろちゃんと使える形でリリースしたい。

というよりまだ開発続けるつもりなの?

v1.0.0 までのロードマップを敷いて、そこにたどり着くまでは続けていきます。

一応、開発のモチベーションをメモしておきます。

やりたいこと

クロスプラットフォーム・マルチプログラミング言語で効率的かつ透過的に使える、デジタルアートなプログラマのための2D/3Dグラフィックスツールキットを作りたい。

あれこれなんかミッションステートメントのお題目でいい気がする。

作り始めた一番最初の動機は、RPGツクールスクリプトシステム、あれを C++C# でも使いたい!でした。すごいよ、あれは。

学ぶことの土台

そこそこの規模のソフトを組むというのはそれだけで学べることがあるわけで、Lumino の開発からは新しい技術を勉強するだけでなく設計の方法など多くのことを学んでいます。

今はそれでゴハン食べてるからそれはそれで Lumino 作って成功だったかなと思います。

Lumino の今後

開発状況をオープンにするには何をすればいいだろう?

  • スコープを決める
    • どのタイミングまでに何をやるのか、やらないのか(期間は決めないです。そのへん決めても本業しだいで予定通り時間はとれない)
  • とにかくまずは使える状態で公開する
  • 経過をアウトプットする
    • 進捗報告だけじゃなくて、そのローカルにため込んでいるメモ兼仕様書を公開するのじゃ。

とか考えつつ・・・

今のコードは v0.4.0 タグを以ってアーカイブします。

最初から完璧なドキュメントは用意できませんが、基本的なものを用意した後、ロードマップに沿ってコードをイチから入れなおします。

書き直すのではなく、コードに山ほど書かれていたりする TODO を潰したりテスト書いたりリファクタリングしながら再構築していきます。(戒め:異常系動作を詰めすぎない。どうしても逃げ道がなければ対策するが、それよりユーザーストーリーの満了を優先)

合間に、共有できそうな技術情報があればアウトプットしていきます。

また、バイナリパッケージは初版から公開していきます。まずは Nuget かな。

ゲームエンジンとしての機能はかなり先の実装になりますが、しばらくは粛々とタスクを消化していきます。

Note

ロードマップ https://github.com/lriki/Lumino/wiki/ProjectRoadmap

進捗状況 https://github.com/lriki/Lumino/projects/1