lumino trail

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

開発状況 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

開発状況 2018 #3

ずっといじってる Chainer のほうですが、Model とか Updater とかの学習の土台ができてきたので、少しずつ集めていた 500 体くらいの 3D モデルをデータセットにして学習させています。 (今までは数体だったので過学習状態でした)

・・・が、これがまたとんでもなく時間かかっていて、ちょっと足踏み中。学習中は暇なのでジャヴァスクリプターしてます。

Lumino 本体はそんなに変更ないですが、ジャヴァスクリプターついでに Emscripten について調べてたりします。C++ コードを JavaScript に変換するアレ。

Core モジュールはほぼ変更無しでブラウザで動かせました。

ファイルIO 以外はね!!!

ずーっとネイティブアプリを相手にしてたのでこの辺戸惑いが多かったですが、まぁなんとかなるでしょう。

開発状況 2018 #2

相変わらず Chainer いじってます。 なので Lumino 自体の進み具合は微妙です。

SkinnedMesh 周りを作っています

SkinnedMesh は当面公開予定のないモジュールでしたが、今回のツールでポーズ付けたりする必要があるので作りこんでいます。

2月中はほぼずっとこれ。

f:id:lriki:20180228223118p:plain

言語バインダ自動生成を clang で置き換えています

SkinnedMesh 実装中の息抜きに、Lumino とほかの言語 (C,C#,Ruby など) をつなぐグルーコードの自動生成にお直し入れたりしています。

これまで自前のパーサ組んでましたがメンテするの限界なので clang に置き換えています。