update Dart cli_windows example

This commit is contained in:
Nick Fisher
2025-04-02 22:29:39 +08:00
parent 3922ee536b
commit 69ce7b1a15
4 changed files with 20 additions and 57 deletions

View File

@@ -1,9 +1,8 @@
import 'dart:ffi'; import 'dart:ffi';
import 'dart:io'; import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:ffi/ffi.dart'; import 'package:ffi/ffi.dart';
import 'package:thermion_dart/src/utils/src/dart_resources.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_filament_app.dart';
import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_viewer_ffi.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_viewer_ffi.dart';
import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_dart.g.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_dart.g.dart';
import 'package:thermion_dart/thermion_dart.dart'; import 'package:thermion_dart/thermion_dart.dart';
@@ -13,29 +12,17 @@ import 'package:cli_windows/thermion_window.g.dart';
void main(List<String> arguments) async { void main(List<String> arguments) async {
var hwnd = create_thermion_window(500, 500, 0, 0); var hwnd = create_thermion_window(500, 500, 0, 0);
update(); update();
await FFIFilamentApp.create();
final resourceLoader = calloc<ResourceLoaderWrapper>(1); var viewer = ThermionViewerFFI(
loadAssetFromUri: (path) async => File(path.replaceAll("file://", "")).readAsBytesSync());
var loadToOut = NativeCallable<
Void Function(Pointer<Char>,
Pointer<ResourceBuffer>)>.listener(DartResourceLoader.loadResource);
resourceLoader.ref.loadToOut = loadToOut.nativeFunction;
var freeResource = NativeCallable<Void Function(ResourceBuffer)>.listener(
DartResourceLoader.freeResource);
resourceLoader.ref.freeResource = freeResource.nativeFunction;
var viewer = ThermionViewerFFI(
resourceLoader: resourceLoader.cast<Void>());
await viewer.initialized; await viewer.initialized;
var swapChain = await viewer.createHeadlessSwapChain(500,500); var swapChain = await FilamentApp.instance!.createSwapChain(Pointer<Void>.fromAddress(hwnd));
var view = await viewer.getViewAt(0); var view = viewer.view;
await view.setViewport(500, 500); await view.setViewport(500, 500);
var camera = await viewer.getMainCamera(); var camera = await viewer.getActiveCamera();
await camera.setLensProjection(); await camera.setLensProjection();
await FilamentApp.instance!.register(swapChain, view);
await view.setRenderable(true, swapChain);
await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0); await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0);
@@ -49,15 +36,15 @@ void main(List<String> arguments) async {
var last = 0; var last = 0;
await viewer.setCameraPosition(0, 0, 10); await camera.lookAt(Vector3(0, 0, 10));
while(true) { while(true) {
var angle = (stopwatch.elapsedMilliseconds / 1000) * 2 * pi; var angle = (stopwatch.elapsedMilliseconds / 1000) * 2 * pi;
var rotation = Quaternion.axisAngle(Vector3(0,1,0), angle); var rotation = Quaternion.axisAngle(Vector3(0,1,0), angle);
var position = Vector3(10 * sin(angle), 0, 10 * cos(angle)); var position = Vector3(10 * sin(angle), 0, 10 * cos(angle));
var modelMatrix = Matrix4.compose(position, rotation, Vector3.all(1)); var modelMatrix = Matrix4.compose(position, rotation, Vector3.all(1));
await viewer.setCameraModelMatrix4(modelMatrix); await camera.setModelMatrix(modelMatrix);
await viewer.render(); await FilamentApp.instance!.requestFrame();
update(); update();
await Future.delayed(Duration(milliseconds: 17)); await Future.delayed(Duration(milliseconds: 17));
} }

View File

@@ -1,5 +1,3 @@
import 'dart:io';
import 'package:archive/archive.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:native_assets_cli/native_assets_cli.dart'; import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_toolchain_c/native_toolchain_c.dart'; import 'package:native_toolchain_c/native_toolchain_c.dart';
@@ -10,23 +8,22 @@ void main(List<String> args) async {
..level = Level.ALL ..level = Level.ALL
..onRecord.listen((record) => print( ..onRecord.listen((record) => print(
record.message + "\n")); record.message + "\n"));
await build(args, (input, output) async {
await build(args, (config, output) async {
final cbuilder = CBuilder.library( final cbuilder = CBuilder.library(
name: "thermion_window", name: input.packageName,
language: Language.cpp, language: Language.cpp,
assetName: 'thermion_window.dart', assetName: 'cli_windows.dart',
sources: ['native/thermion_window.cpp'], sources: ['native/thermion_window.cpp'],
includes: ['native', '../../../thermion_dart/native/include'], includes: ['native', '../../../thermion_dart/native/include'],
defines: {"UNICODE":"1"}, defines: {"UNICODE":"1"},
flags:[], flags:[],
dartBuildFiles: ['hook/build.dart'], dartBuildFiles: ['hook/build.dart'],
); );
await cbuilder.run( await cbuilder.run(
buildConfig: config, input: input,
buildOutput: output, output: output,
logger: logger, logger: logger,
); );

View File

@@ -2,7 +2,7 @@
// //
// Generated by `package:ffigen`. // Generated by `package:ffigen`.
// ignore_for_file: type=lint // ignore_for_file: type=lint
@ffi.DefaultAsset('package:cli_windows/thermion_window.dart') @ffi.DefaultAsset('package:cli_windows/cli_windows.dart')
library; library;
import 'dart:ffi' as ffi; import 'dart:ffi' as ffi;

View File

@@ -1,42 +1,21 @@
name: cli_windows name: cli_windows
description: A sample command-line application with basic argument parsing. description: A sample command-line application with basic argument parsing.
version: 0.0.1 version: 0.0.1
# repository: https://github.com/my_org/my_repo
environment: environment:
sdk: ^3.6.0-326.0.dev sdk: ^3.6.0-326.0.dev
# Add regular dependencies here.
dependencies: dependencies:
args: ^2.5.0 args: ^2.5.0
thermion_dart: thermion_dart:
path: ../../../thermion_dart path: ../../../thermion_dart
ffi: ^2.1.3 ffi: ^2.1.3
vector_math: ^2.1.4 vector_math: ^2.1.4
native_toolchain_c: ^0.4.2 native_toolchain_c: ^0.9.0
native_assets_cli: ^0.6.1 native_assets_cli: ^0.12.0
dev_dependencies: dev_dependencies:
lints: ^5.0.0 lints: ^5.0.0
test: ^1.24.0 test: ^1.24.0
ffigen: ^13.0.0
ffigen:
output: 'lib/thermion_window.g.dart'
headers:
entry-points:
- 'native/thermion_window.h'
include-directives:
- 'native/thermion_window.h'
ffi-native:
assetId: package:cli_windows/thermion_window.dart
ignore-source-errors: true
llvm-path:
- E:\clang+llvm-19.1.3-x86_64-pc-windows-msvc\bin
- E:\clang+llvm-19.1.3-x86_64-pc-windows-msvc\
- E:\clang+llvm-19.1.3-x86_64-pc-windows-msvc\lib
functions:
leaf:
include:
- '.*'