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
- TPixelDataFormat
- TPixelDataType

View File

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

View File

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

View File

@@ -425,7 +425,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
///
@override
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
Future setToneMapper(ToneMapper mapper) async {
View_setToneMappingRenderThread(
view, app.engine, TToneMapping.values[mapper.index].value);
view, app.engine, TToneMapping.values[mapper.index]);
}
Future setStencilBufferEnabled(bool enabled) async {

View File

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

View File

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