This commit is contained in:
Nick Fisher
2025-03-19 16:06:55 +08:00
parent e2048c3efd
commit 124f923720
7 changed files with 43 additions and 21 deletions

View File

@@ -19,3 +19,4 @@ enums:
- TPrimitiveType - TPrimitiveType
- TPixelDataFormat - TPixelDataFormat
- TPixelDataType - TPixelDataType

View File

@@ -8,7 +8,7 @@ import '../input_handler.dart';
class OverTheShoulderCameraDelegate implements InputHandlerDelegate { class OverTheShoulderCameraDelegate implements InputHandlerDelegate {
final ThermionViewer viewer; final ThermionViewer viewer;
late ThermionEntity player; late ThermionAsset player;
late Camera camera; late Camera camera;
final double rotationSensitivity; final double rotationSensitivity;
@@ -79,7 +79,7 @@ class OverTheShoulderCameraDelegate implements InputHandlerDelegate {
return null; return null;
} }
Matrix4 currentPlayerTransform = await viewer.getWorldTransform(player); Matrix4 currentPlayerTransform = await player.getWorldTransform();
// first we need to convert the move vector to player space // first we need to convert the move vector to player space
var newTransform = var newTransform =
@@ -87,7 +87,7 @@ class OverTheShoulderCameraDelegate implements InputHandlerDelegate {
_queuedMoveDelta = Vector3.zero(); _queuedMoveDelta = Vector3.zero();
Matrix4 newPlayerTransform = newTransform * currentPlayerTransform; Matrix4 newPlayerTransform = newTransform * currentPlayerTransform;
await viewer.setTransform(player, newPlayerTransform); await player.setTransform(newPlayerTransform);
if (_queuedZoomDelta != 0.0) { if (_queuedZoomDelta != 0.0) {
// Ignore zoom // Ignore zoom
@@ -112,8 +112,8 @@ class OverTheShoulderCameraDelegate implements InputHandlerDelegate {
var newCameraTransform = newPlayerTransform * newCameraViewMatrix; var newCameraTransform = newPlayerTransform * newCameraViewMatrix;
await camera.setTransform(newCameraTransform); await camera.setTransform(newCameraTransform);
await viewer.queueTransformUpdates( // await viewer.queueTransformUpdates(
[camera.getEntity(), player], [newCameraTransform, newPlayerTransform]); // [camera.getEntity(), player], [newCameraTransform, newPlayerTransform]);
onUpdate?.call(newPlayerTransform); onUpdate?.call(newPlayerTransform);
_executing = false; _executing = false;
return newCameraTransform; return newCameraTransform;

View File

@@ -263,7 +263,7 @@ class BackgroundImage extends ThermionAsset {
} }
@override @override
Future setTransform(ThermionEntity entity, Matrix4 transform) { Future setTransform(Matrix4 transform, { ThermionEntity? entity }) {
// TODO: implement setTransform // TODO: implement setTransform
throw UnimplementedError(); throw UnimplementedError();
} }

View File

@@ -425,7 +425,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
/// ///
@override @override
Future render() async { Future render() async {
RenderTicker_renderRenderThread(renderTicker, 0); await withVoidCallback((cb) =>
RenderTicker_renderRenderThread(renderTicker, 0, cb));
} }
/// ///

View File

@@ -82,7 +82,7 @@ class FFIView extends View {
@override @override
Future setToneMapper(ToneMapper mapper) async { Future setToneMapper(ToneMapper mapper) async {
View_setToneMappingRenderThread( View_setToneMappingRenderThread(
view, app.engine, TToneMapping.values[mapper.index].value); view, app.engine, TToneMapping.values[mapper.index]);
} }
Future setStencilBufferEnabled(bool enabled) async { Future setStencilBufferEnabled(bool enabled) async {

View File

@@ -333,18 +333,22 @@ external void LightManager_setDirection(
double z, double z,
); );
@ffi.Native<ffi.Int Function(ffi.Pointer<TLightManager>, ffi.UnsignedInt)>( @ffi.Native<
symbol: "LightManager_createLight", isLeaf: true) ffi.Int Function(ffi.Pointer<TEngine>, ffi.Pointer<TLightManager>,
ffi.UnsignedInt)>(symbol: "LightManager_createLight", isLeaf: true)
external int _LightManager_createLight( external int _LightManager_createLight(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TLightManager> tLightManager, ffi.Pointer<TLightManager> tLightManager,
int tLightTtype, int tLightTtype,
); );
int LightManager_createLight( int LightManager_createLight(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TLightManager> tLightManager, ffi.Pointer<TLightManager> tLightManager,
TLightType tLightTtype, TLightType tLightTtype,
) => ) =>
_LightManager_createLight( _LightManager_createLight(
tEngine,
tLightManager, tLightManager,
tLightTtype.value, tLightTtype.value,
); );
@@ -1492,11 +1496,13 @@ external void RenderLoop_requestAnimationFrame(
ffi.Pointer<ffi.Void> onComplete, ffi.Pointer<ffi.Void> onComplete,
); );
@ffi.Native<ffi.Void Function(ffi.Pointer<TRenderTicker>, ffi.Uint64)>( @ffi.Native<
isLeaf: true) ffi.Void Function(ffi.Pointer<TRenderTicker>, ffi.Uint64,
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>(isLeaf: true)
external void RenderTicker_renderRenderThread( external void RenderTicker_renderRenderThread(
ffi.Pointer<TRenderTicker> tRenderTicker, ffi.Pointer<TRenderTicker> tRenderTicker,
int frameTimeInNanos, int frameTimeInNanos,
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
); );
@ffi.Native< @ffi.Native<
@@ -1896,14 +1902,26 @@ external void Material_createInstanceRenderThread(
); );
@ffi.Native< @ffi.Native<
ffi.Void Function( ffi.Void Function(
ffi.Pointer<TView>, ffi.Pointer<TEngine>, ffi.Int)>(isLeaf: true) ffi.Pointer<TView>, ffi.Pointer<TEngine>, ffi.UnsignedInt)>(
external void View_setToneMappingRenderThread( symbol: "View_setToneMappingRenderThread", isLeaf: true)
external void _View_setToneMappingRenderThread(
ffi.Pointer<TView> tView, ffi.Pointer<TView> tView,
ffi.Pointer<TEngine> tEngine, ffi.Pointer<TEngine> tEngine,
int toneMapping, int toneMapping,
); );
void View_setToneMappingRenderThread(
ffi.Pointer<TView> tView,
ffi.Pointer<TEngine> tEngine,
TToneMapping toneMapping,
) =>
_View_setToneMappingRenderThread(
tView,
tEngine,
toneMapping.value,
);
@ffi.Native<ffi.Void Function(ffi.Pointer<TView>, ffi.Bool, ffi.Double)>( @ffi.Native<ffi.Void Function(ffi.Pointer<TView>, ffi.Bool, ffi.Double)>(
isLeaf: true) isLeaf: true)
external void View_setBloomRenderThread( external void View_setBloomRenderThread(
@@ -2963,8 +2981,8 @@ ffi.Pointer<TEngine> Engine_create(
disableHandleUseAfterFreeCheck, disableHandleUseAfterFreeCheck,
); );
@ffi.Native<ffi.Pointer<TEngine> Function(ffi.Pointer<TEngine>)>(isLeaf: true) @ffi.Native<ffi.Void Function(ffi.Pointer<TEngine>)>(isLeaf: true)
external ffi.Pointer<TEngine> Engine_destroy( external void Engine_destroy(
ffi.Pointer<TEngine> tEngine, ffi.Pointer<TEngine> tEngine,
); );
@@ -3296,10 +3314,12 @@ external Aabb3 SceneAsset_getBoundingBox(
ffi.Pointer<TSceneAsset> asset, ffi.Pointer<TSceneAsset> asset,
); );
@ffi.Native<ffi.Pointer<TAnimationManager> Function(ffi.Pointer<TEngine>)>( @ffi.Native<
isLeaf: true) ffi.Pointer<TAnimationManager> Function(
ffi.Pointer<TEngine>, ffi.Pointer<TScene>)>(isLeaf: true)
external ffi.Pointer<TAnimationManager> AnimationManager_create( external ffi.Pointer<TAnimationManager> AnimationManager_create(
ffi.Pointer<TEngine> tEngine, ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TScene> tScene,
); );
@ffi.Native<ffi.Void Function(ffi.Pointer<TAnimationManager>, EntityId)>( @ffi.Native<ffi.Void Function(ffi.Pointer<TAnimationManager>, EntityId)>(

View File

@@ -128,7 +128,7 @@ class ThermionViewerFFI extends ThermionViewer {
/// ///
@override @override
Future render() async { Future render() async {
RenderTicker_renderRenderThread(app.renderTicker, 0); await withVoidCallback((cb) => RenderTicker_renderRenderThread(app.renderTicker, 0, cb));
} }
double _msPerFrame = 1000.0 / 60.0; double _msPerFrame = 1000.0 / 60.0;
@@ -320,7 +320,7 @@ class ThermionViewerFFI extends ThermionViewer {
/// ///
@override @override
Future<ThermionEntity> addDirectLight(DirectLight directLight) async { Future<ThermionEntity> addDirectLight(DirectLight directLight) async {
var entity = LightManager_createLight( var entity = LightManager_createLight(app.engine,
app.lightManager, TLightType.values[directLight.type.index]); app.lightManager, TLightType.values[directLight.type.index]);
if (entity == FILAMENT_ASSET_ERROR) { if (entity == FILAMENT_ASSET_ERROR) {
throw Exception("Failed to add light to scene"); throw Exception("Failed to add light to scene");