THE 3D ENGINE FOR FLUTTER · V0.1

Build beyond
the flat screen.

Glint is a pure-Dart 3D engine for Flutter. Use it for interactive products, real-time games, immersive scenes, visualization tools, and any experience that needs a third dimension.

Install Glint

Glint ships on pub.dev as glint_engine and tracks Flutter 3.44.1 with the opt-in flutter_gpu API.

TerminalSHELL
flutter pub add glint_engine

Or add it to pubspec.yaml directly:

pubspec.yamlDART
dependencies:
  glint_engine: ^0.1.0
V0.1

The engine is feature-complete for its first release and validated at 60 fps on iPhone.

Render your first scene

A Scene3D is a Flutter widget. Give it model nodes, lights, and a camera, then compose any ordinary Flutter UI over the result.

lib/showroom.dartDART
import 'package:flutter/material.dart';
import 'package:glint_engine/glint_engine.dart';

class Showroom extends StatelessWidget {
  const Showroom({super.key});

  @override
  Widget build(BuildContext context) {
    return Stack(children: [
      Scene3D(
        children: [
          Node3D(
            name: 'product',
            model: Model.asset('assets/product.glb'),
          ),
        ],
        lights: const [
          EnvironmentLight(asset: 'assets/studio.hdr'),
          DirectionalLight(),
        ],
        autoRotate: true,
      ),
      const ProductControls(),
    ]);
  }
}

Enable Flutter GPU once per app

Flutter GPU ships behind a flag. You can pass it on every run — or set it once in your platform manifests and never think about it again. Do the one-time setup: after this, plain flutter run, IDE run buttons, and release builds all work with no flags.

iOS — add one key inside the main <dict> (Impeller is already the default renderer on iOS):

ios/Runner/Info.plistDART
<key>FLTEnableFlutterGPU</key>
<true/>

macOS — same key, plus Impeller, which is still opt-in on desktop:

macos/Runner/Info.plistDART
<key>FLTEnableImpeller</key>
<true/>
<key>FLTEnableFlutterGPU</key>
<true/>

Android — add one meta-data entry inside the <application> tag:

android/app/src/main/AndroidManifest.xmlDART
<application ...>
  <meta-data
      android:name="io.flutter.embedding.android.EnableFlutterGPU"
      android:value="true" />
</application>

Skipping this? For a quick trial you can run with flags instead — but any device or teammate without them sees Glint's fallback widget, so the manifest route is the one to ship:

TerminalSHELL
flutter run --enable-impeller --enable-flutter-gpu

Compose a world

Build scenes from Node3D objects with transforms, models, procedural meshes, material overrides, and child hierarchies. Glint resolves world transforms, bounds, culling, cameras, and lighting through one declarative scene graph.

lib/world.dartDART
final world = [
  Node3D(
    name: 'vehicle',
    model: Model.asset('assets/vehicle.glb'),
    transform: Transform3D(
      position: Vector3(0, 0, -4),
      scale: Vector3(1.2, 1.2, 1.2),
    ),
    children: [
      Node3D(name: 'marker', mesh: Mesh3D.cube(size: .2)),
    ],
  ),
];

Drive a real-time game

GlintGameView owns the ticker-driven render loop. Your simulation advances with delta time and returns a camera plus model instances for every frame. Flutter remains responsible for HUD, menus, navigation, and touch surfaces.

lib/game.dartDART
GlintGameView(
  models: {
    'player': Model.asset('assets/player.glb'),
    'coin': Model.asset('assets/coin.glb'),
  },
  onFrame: (dt) {
    simulation.step(dt);
    return GlintGameFrame(
      camera: GlintGameCamera(
        position: Vector3(0, 3.6, 8.4),
        target: Vector3(0, 1, -6),
      ),
      instances: simulation.instances,
    );
  },
)

Load 3D assets safely

Use Model.asset for packaged GLB files or Model.network for bounded, timeout-aware remote models. The loader handles meshes, normals, node hierarchies, embedded images, material factors, and typed failures instead of leaving a silent blank viewport.

model_sources.dartDART
final local = Model.asset('assets/level.glb');

final remote = Model.network(
  'https://cdn.example.com/world.glb',
);

Make the world respond

Glint includes ray construction, mesh intersection, tap picking, orbit, pan, zoom, Flutter-scroll gesture routing, node-to-screen projection, and anchored labels. Use the engine for spatial input while Flutter keeps accessible interface controls.

Platform support

Glint follows the flutter_gpu and Impeller path. The first release focuses on native mobile and macOS.

macOSValidated
iOSValidated · 60 fps on device
AndroidTry on a physical device — the flag is baked in, but emulators lack the Vulkan backend Flutter GPU needs
Web / Windows / LinuxFuture direction

The direction

The goal is a complete, Flutter-native 3D engine. The current core covers rendering, scene graphs, per-material batches, PBR with HDRI lighting and fog, glTF node-animation playback, assets, cameras, picking, labels, diagnostics, instancing, and real-time frame loops.

Skeletal skinning, shadows, physics, particles, audio, richer lights, editor tooling, and broader platforms come after the foundation is stable and real projects prove the right priorities.