FloatSoda.Engine 0.0.2

There is a newer version of this package available.
See the version list below for details.
dotnet add package FloatSoda.Engine --version 0.0.2
                    
NuGet\Install-Package FloatSoda.Engine -Version 0.0.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FloatSoda.Engine" Version="0.0.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FloatSoda.Engine" Version="0.0.2" />
                    
Directory.Packages.props
<PackageReference Include="FloatSoda.Engine" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FloatSoda.Engine --version 0.0.2
                    
#r "nuget: FloatSoda.Engine, 0.0.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FloatSoda.Engine@0.0.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FloatSoda.Engine&version=0.0.2
                    
Install as a Cake Addin
#tool nuget:?package=FloatSoda.Engine&version=0.0.2
                    
Install as a Cake Tool

FloatSoda: SteamVR Overlay UI Framework (v0.0.2)

FloatSoda は、SteamVR Overlay を Flutter のような宣言的な書き心地 で作成できるように開発中の UI フレームワークです。SkiaSharp → OpenGL → OpenVR という経路でレンダリングし、複数のオーバーレイを統一的に管理できます。


特徴

  • Flutter-like な開発体験: StatelessWidget による宣言的な UI 構築が可能です(StatefulWidget は WIP)
  • 差分更新: BuildOwner による Widget の差分ビルドと、dirty フラグによる RenderObject の差分レイアウト・差分ペイント
  • RenderObject ツリー: Flutter の RenderObject に相当するレイアウト・描画ツリーを実装
  • 複数オーバーレイ対応: ダッシュボード・ワールド座標固定・デバイス追従を同時に管理
  • Skia による描画: SkiaSharp を使用した高品質なレンダリング
  • スレッドセーフ: メインスレッドとレンダースレッドをレイヤークローンで分離

Getting Started

動作環境

  • .NET 10 / C# 14
  • SteamVR(起動済みであること)
  • SkiaSharp / OpenTK / OpenVR

サンプルアプリの起動

# SteamVR を起動してから実行する
dotnet run --project samples/FloatSoda.Samples.OverlayApp

SteamVR ダッシュボードにカラーボックスを表示するオーバーレイが起動します。

最小構成のコード

using FloatSoda;
using FloatSoda.Widgets;
using FloatSoda.Widgets.Layout;
using FloatSoda.Widgets.Paint;
using SkiaSharp;

var builder = FloatSodaAppBuilder.CreateDefault();
using var app = builder.Build();

Widget root = new Align
{
    Child = new SizedBox
    {
        Width = 100,
        Height = 100,
        Child = new ColoredBox
        {
            Color = SKColors.Tomato
        }
    }
};

// ダッシュボードオーバーレイ(サイズは root のレイアウト結果に自動追従)
app.CreateWindow(new DashboardWindow { Title = "MyDashboard", Child = root });

// ワールド座標固定(メートル単位。Position 省略時は前方1m・高さ1m)
// app.CreateWindow(new WorldSpaceWindow { Title = "MyWorld", Child = root });

// デバイス追従
// app.CreateWindow(new DeviceTrackedWindow { Title = "MyHand", Child = root, Target = TrackedDevice.LeftController });

app.Run();

レンダリングライフサイクル

sequenceDiagram
    participant Main as メインスレッド
    participant Pipeline as RenderPipeline
    participant RO as RenderObject 群
    participant Layer as レイヤーツリー
    participant RT as レンダースレッド
    participant GL as GLView (OpenGL)
    participant VR as OpenVR Compositor

    loop メインループ
        Main->>Main: VREventDispatcher.PollEvents()
        Main->>Pipeline: FlushLayout()
        Pipeline->>RO: Layout(BoxConstraints) [再帰]
        Note over RO: 制約↓ サイズ↑
        Main->>Pipeline: FlushPaint()
        Pipeline->>RO: Paint(PaintingContext, Offset) [再帰]
        Note over RO: Skia ドローコールを記録<br/>→ PictureLayer に格納
        Main->>Layer: Clone() — スレッドセーフコピー
        Main-->>RT: PostTask(layer)
        Main->>Main: FrameLimiter.Wait()
    end

    loop レンダースレッド
        RT->>GL: Clear()
        RT->>Layer: Layout(LayerContext)
        RT->>Layer: Paint(LayerContext)
        Note over Layer: DrawPicture / SaveLayer<br/>でレイヤーを合成
        RT->>GL: Flush()
        Note over GL: SKSurface → GRContext → GL テクスチャ
        RT->>VR: Overlay.Texture.FromTexture_t(GL texture handle)
    end

詳細は docs/Architecture.md を参照。


実装済みの RenderObject

レイアウト系

クラス 説明
RenderView ルートノード。オーバーレイのサイズを定義
RenderPositionedBox 子を Alignment で配置(デフォルト: 中央)
RenderFlex Row / Column 相当。Axis, MainAxisAlignment, CrossAxisAlignment を指定可
RenderConstrainedBox 子に BoxConstraints を付与してサイズを強制

描画系

クラス 説明
RenderColoredBox 矩形を指定色で塗りつぶす
RenderImage FileImageProvider でロードした画像を描画

クリップ系

クラス 説明
RenderClipRect 矩形でクリップ
RenderClipRoundRect 角丸矩形でクリップ(BorderRadius 指定可)
RenderClipPath 任意の SKPath でクリップ(CustomClipper<SKPath> を渡す)
RenderClipOval 楕円でクリップ

ドキュメント

入り口は docs/Home.md です(GitHub Wiki にも自動同期されます)。

ドキュメント 内容
docs/Home.md ドキュメントトップ・全体像・実装状況サマリ
docs/GettingStarted.md クイックスタートガイド
docs/Architecture.md アーキテクチャ概要・フレームパイプライン・スレッドモデル
docs/WidgetSystem.md ウィジェット/エレメントシステム
docs/BuildPipeline.md BuildOwner による Widget 差分更新の仕組み
docs/RenderObjects.md RenderObject ツリーのリファレンス
docs/OVRIntegration.md OpenVR インテグレーションリファレンス
docs/APIDesign.md API 設計規約

開発ステータス (v0.0.2 Alpha)

本プロジェクトは現在 概念実証(PoC)段階 です。API は予告なく変更されます。

  • RenderObject ツリー(レイアウト・描画・クリップ・画像・差分更新)
  • レイヤーツリー(ContainerLayer / PictureLayer / ClipLayer / OpacityLayer)
  • 複数オーバーレイ(ダッシュボード / ワールド座標 / デバイス追従)
  • Widget → RenderObject への inflate パイプライン(StatelessWidget)
  • BuildOwner による Widget 差分ビルド
  • StatefulWidget / InheritedWidget / Key(スケルトンのみ)
  • MultiChildRenderObjectElement の再ビルド(子リストの差分更新)
  • SteamVR のイベント処理と宣言的な入力(ヒットテスト)
  • アニメーションシステムの統合
  • マニフェストファイルの自動生成(検討中)
Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on FloatSoda.Engine:

Package Downloads
FloatSoda

A SteamVR overlay UI framework with a Flutter-like declarative API. Provides the widget/element system, RenderObject tree, and render pipeline, rendering via SkiaSharp, OpenGL, and OpenVR.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.3.1 155 7/23/2026
0.2.0 137 7/16/2026
0.1.0 121 7/14/2026
0.0.3 137 7/12/2026
0.0.2 132 7/10/2026