Windows embedder fixes

This commit is contained in:
Nick Fisher
2024-10-14 11:23:56 +11:00
parent df319f007f
commit dd82d5d3e7
11 changed files with 91 additions and 59 deletions

View File

@@ -32,18 +32,14 @@ void main(List<String> args) async {
final name = "thermion_dart.dart"; final name = "thermion_dart.dart";
final libUri = config.outputDirectory final libUri = config.outputDirectory
.resolve(config.targetOS.libraryFileName(name, linkMode)); .resolve(config.targetOS.libraryFileName(name, linkMode));
output.addAsset( output.addAsset(NativeCodeAsset(
package: config.packageName,
NativeCodeAsset( name: name,
package: config.packageName, file: libUri,
name: name, linkMode: linkMode,
file: libUri, os: config.targetOS,
linkMode: linkMode, architecture: config.dryRun ? null : config.targetArchitecture,
os: config.targetOS, ));
architecture: config.dryRun ? null : config.targetArchitecture,
)
);
return; return;
} }
@@ -91,7 +87,6 @@ void main(List<String> args) async {
"basis_transcoder" "basis_transcoder"
]; ];
if (platform == "windows") { if (platform == "windows") {
libDir = Directory(libDir).uri.toFilePath(); libDir = Directory(libDir).uri.toFilePath();
libs = libs.map((lib) => "${libDir}${lib}.lib").toList(); libs = libs.map((lib) => "${libDir}${lib}.lib").toList();
@@ -117,7 +112,12 @@ void main(List<String> args) async {
defines["WIN32"] = "1"; defines["WIN32"] = "1";
defines["_DEBUG"] = "1"; defines["_DEBUG"] = "1";
defines["_DLL"] = "1"; defines["_DLL"] = "1";
flags.addAll(["/std:c++20", "/MDd", "/VERBOSE", ...defines.keys.map((k) => "/D$k=${defines[k]}").toList()]); flags.addAll([
"/std:c++20",
"/MDd",
"/VERBOSE",
...defines.keys.map((k) => "/D$k=${defines[k]}").toList()
]);
} }
if (platform == "ios") { if (platform == "ios") {
@@ -148,24 +148,23 @@ void main(List<String> args) async {
name: packageName, name: packageName,
language: Language.cpp, language: Language.cpp,
assetName: 'thermion_dart.dart', assetName: 'thermion_dart.dart',
sources: platform == "windows" ? [] : sources: platform == "windows" ? [] : sources,
sources, includes: platform == "windows"
includes: platform == "windows"? [] : ['native/include', 'native/include/filament'], ? []
: ['native/include', 'native/include/filament'],
defines: platform == "windows" ? {} : defines, defines: platform == "windows" ? {} : defines,
flags: [ flags: [
if (platform == "macos") '-mmacosx-version-min=13.0', if (platform == "macos") '-mmacosx-version-min=13.0',
if (platform == "ios") '-mios-version-min=13.0', if (platform == "ios") '-mios-version-min=13.0',
...flags, ...flags,
...frameworks, ...frameworks,
if (platform != "windows") if (platform != "windows") ...libs.map((lib) => "-l$lib"),
...libs.map((lib) => "-l$lib"), if (platform != "windows") "-L$libDir",
if (platform != "windows") if (platform == "windows") ...[
"-L$libDir", "/I${config.packageRoot.toFilePath()}\\native\\include",
if(platform == "windows") "/I${config.packageRoot.toFilePath()}native\\include\\filament",
...[
"/I${config.packageRoot.toFilePath()}\\native\\include", "/I${config.packageRoot.toFilePath()}native\\include\\filament",
...sources, ...sources,
'/link', '/link',
"/LIBPATH:$libDir", "/LIBPATH:$libDir",
'/DLL', '/DLL',
] ]
@@ -187,17 +186,24 @@ sources,
Architecture.ia32 => "i686-linux-android", Architecture.ia32 => "i686-linux-android",
_ => throw FormatException('Invalid') _ => throw FormatException('Invalid')
}; };
var compilerPath = config.cCompiler.compiler!.path; var compilerPath = config.cCompiler.compiler!.path;
if(Platform.isWindows && compilerPath.startsWith("/")) { if (Platform.isWindows && compilerPath.startsWith("/")) {
compilerPath = compilerPath.substring(1); compilerPath = compilerPath.substring(1);
} }
var ndkRoot = File(compilerPath).parent.parent.uri.toFilePath(windows:true);
var stlPath = var ndkRoot =
File([ndkRoot, "sysroot", "usr", "lib", archExtension, "libc++_shared.so"].join(Platform.pathSeparator)); File(compilerPath).parent.parent.uri.toFilePath(windows: true);
var stlPath = File([
ndkRoot,
"sysroot",
"usr",
"lib",
archExtension,
"libc++_shared.so"
].join(Platform.pathSeparator));
output.addAsset(NativeCodeAsset( output.addAsset(NativeCodeAsset(
package: "thermion_dart", package: "thermion_dart",
name: "libc++_shared.so", name: "libc++_shared.so",

View File

@@ -142,6 +142,17 @@ external void Viewer_setViewRenderable(
bool renderable, bool renderable,
); );
@ffi.Native<
ffi.Void Function(ffi.Pointer<TViewer>, ffi.Pointer<ffi.Char>, ffi.Float,
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>(isLeaf: true)
external void Viewer_loadIblRenderThread(
ffi.Pointer<TViewer> viewer,
ffi.Pointer<ffi.Char> iblPath,
double intensity,
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
);
@ffi.Native< @ffi.Native<
ffi.Void Function( ffi.Void Function(
ffi.Pointer<TViewer>, ffi.Pointer<TViewer>,

View File

@@ -360,7 +360,12 @@ class ThermionViewerFFI extends ThermionViewer {
Future loadIbl(String lightingPath, {double intensity = 30000}) async { Future loadIbl(String lightingPath, {double intensity = 30000}) async {
final pathPtr = final pathPtr =
lightingPath.toNativeUtf8(allocator: allocator).cast<Char>(); lightingPath.toNativeUtf8(allocator: allocator).cast<Char>();
load_ibl(_viewer!, pathPtr, intensity);
await withVoidCallback((cb) {
Viewer_loadIblRenderThread(_viewer!, pathPtr, intensity, cb);
});
} }
/// ///

View File

@@ -99,7 +99,7 @@ extern "C"
EMSCRIPTEN_KEEPALIVE void load_skybox(TViewer *viewer, const char *skyboxPath); EMSCRIPTEN_KEEPALIVE void load_skybox(TViewer *viewer, const char *skyboxPath);
EMSCRIPTEN_KEEPALIVE void load_ibl(TViewer *viewer, const char *iblPath, float intensity); EMSCRIPTEN_KEEPALIVE void Viewer_loadIbl(TViewer *viewer, const char *iblPath, float intensity);
EMSCRIPTEN_KEEPALIVE void create_ibl(TViewer *viewer, float r, float g, float b, float intensity); EMSCRIPTEN_KEEPALIVE void create_ibl(TViewer *viewer, float r, float g, float b, float intensity);
EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix); EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix);
EMSCRIPTEN_KEEPALIVE void remove_skybox(TViewer *viewer); EMSCRIPTEN_KEEPALIVE void remove_skybox(TViewer *viewer);

View File

@@ -34,7 +34,7 @@ extern "C"
EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, uint8_t* out, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, uint8_t* out, void (*onComplete)());
EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, TRenderTarget* renderTarget, uint8_t* out, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, TRenderTarget* renderTarget, uint8_t* out, void (*onComplete)());
EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, void(*onComplete)()); EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, void(*onComplete)());
EMSCRIPTEN_KEEPALIVE void Viewer_loadIblRenderThread(TViewer *viewer, const char *iblPath, float intensity, void(*onComplete)());
EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping); EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping);
EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, double bloom); EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, double bloom);

View File

@@ -92,7 +92,7 @@ extern "C"
((FilamentViewer *)viewer)->createIbl(r, g, b, intensity); ((FilamentViewer *)viewer)->createIbl(r, g, b, intensity);
} }
EMSCRIPTEN_KEEPALIVE void load_ibl(TViewer *viewer, const char *iblPath, float intensity) EMSCRIPTEN_KEEPALIVE void Viewer_loadIbl(TViewer *viewer, const char *iblPath, float intensity)
{ {
((FilamentViewer *)viewer)->loadIbl(iblPath, intensity); ((FilamentViewer *)viewer)->loadIbl(iblPath, intensity);
} }

View File

@@ -258,6 +258,16 @@ extern "C"
} }
} }
EMSCRIPTEN_KEEPALIVE void Viewer_loadIblRenderThread(TViewer *viewer, const char *iblPath, float intensity, void(*onComplete)()) {
std::packaged_task<void()> lambda(
[=]() mutable
{
Viewer_loadIbl(viewer, iblPath, intensity);
onComplete();
});
auto fut = _rl->add_task(lambda);
}
EMSCRIPTEN_KEEPALIVE void EMSCRIPTEN_KEEPALIVE void
set_frame_interval_render_thread(TViewer *viewer, float frameIntervalInMilliseconds) set_frame_interval_render_thread(TViewer *viewer, float frameIntervalInMilliseconds)
{ {
@@ -391,15 +401,6 @@ extern "C"
}); });
auto fut = _rl->add_task(lambda); auto fut = _rl->add_task(lambda);
} }
EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(TViewer *viewer, const char *iblPath,
float intensity)
{
std::packaged_task<void()> lambda(
[=]
{ load_ibl(viewer, iblPath, intensity); });
auto fut = _rl->add_task(lambda);
}
EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer) EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer)
{ {

View File

@@ -43,11 +43,16 @@ class _ThermionWidgetWindowsState extends State<ThermionWidgetWindows> {
var dpr = MediaQuery.of(context).devicePixelRatio; var dpr = MediaQuery.of(context).devicePixelRatio;
var size = ((context.findRenderObject()) as RenderBox).size; final renderBox = ((context.findRenderObject()) as RenderBox);
var size = renderBox.size;
var width = (size.width * dpr).ceil(); var width = (size.width * dpr).ceil();
var height = (size.height * dpr).ceil(); var height = (size.height * dpr).ceil();
_window = await t.ThermionFlutterPlatform.instance.createWindow(width, height, 0, 0); final offset = renderBox.localToGlobal(Offset.zero);
final offsetLeft = (offset.dx * dpr).toInt();
final offsetTop = (offset.dy * dpr).toInt();
_window = await t.ThermionFlutterPlatform.instance.createWindow(width, height, offsetLeft, offsetTop);
await widget.view.updateViewport(_window!.width, _window!.height); await widget.view.updateViewport(_window!.width, _window!.height);
@@ -121,11 +126,16 @@ class _ThermionWidgetWindowsState extends State<ThermionWidgetWindows> {
var newWidth = newSize.width.ceil(); var newWidth = newSize.width.ceil();
var newHeight = newSize.height.ceil(); var newHeight = newSize.height.ceil();
final renderBox = context.findRenderObject() as RenderBox;
final offset = renderBox.localToGlobal(Offset.zero);
final offsetLeft = (offset.dx * dpr).toInt();
final offsetTop = (offset.dy * dpr).toInt();
await _window?.resize( await _window?.resize(
newWidth, newWidth,
newHeight, newHeight,
0, offsetLeft,
0, offsetTop,
); );
await widget.view.updateViewport(_window!.width, _window!.height); await widget.view.updateViewport(_window!.width, _window!.height);

View File

@@ -210,7 +210,7 @@ void ThermionFlutterPlugin::DestroyTexture(
void ThermionFlutterPlugin::HandleMethodCall( void ThermionFlutterPlugin::HandleMethodCall(
const flutter::MethodCall<flutter::EncodableValue> &methodCall, const flutter::MethodCall<flutter::EncodableValue> &methodCall,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) { std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
std::cout << methodCall.method_name().c_str() << std::endl; // std::cout << methodCall.method_name().c_str() << std::endl;
if (methodCall.method_name() == "usesBackingWindow") { if (methodCall.method_name() == "usesBackingWindow") {
result->Success(flutter::EncodableValue( result->Success(flutter::EncodableValue(
#ifdef WGL_USE_BACKING_WINDOW #ifdef WGL_USE_BACKING_WINDOW
@@ -239,13 +239,12 @@ void ThermionFlutterPlugin::HandleMethodCall(
int dHeight = *(std::get_if<int>(&(args->at(1)))); int dHeight = *(std::get_if<int>(&(args->at(1))));
int dLeft = *(std::get_if<int>(&(args->at(2)))); int dLeft = *(std::get_if<int>(&(args->at(2))));
int dTop = *(std::get_if<int>(&(args->at(3)))); int dTop = *(std::get_if<int>(&(args->at(3))));
auto width = (uint32_t)round(dWidth ); auto width = static_cast<uint32_t>(dWidth);
auto height = (uint32_t)round(dHeight ); auto height = static_cast<uint32_t>(dHeight);
auto left = (uint32_t)round(dLeft ); auto left = static_cast<uint32_t>(dLeft);
auto top = (uint32_t)round(dTop ); auto top = static_cast<uint32_t>(dTop );
_context->ResizeRenderingSurface(width, height, left, top); _context->ResizeRenderingSurface(width, height, left, top);
std::cout << "resized window to " << width << "x" << height << " at " << left << "," << top << std::endl;
result->Success(); result->Success();
#else #else
result->Error("ERROR", "resizeWindow is only available when using a backing window"); result->Error("ERROR", "resizeWindow is only available when using a backing window");

View File

@@ -118,7 +118,7 @@ void WGLContext::CreateRenderingSurface(
ResizeRenderingSurface(width, height, left, top); ResizeRenderingSurface(width, height, left, top);
} }
std::cout << "created window size " << width << "x" << height << " at " << left << "," << top << " with backing handle" << _backingWindow->GetHandle() << std::endl; // std::cout << "created window size " << width << "x" << height << " at " << left << "," << top << " with backing handle" << _backingWindow->GetHandle() << std::endl;
std::vector<flutter::EncodableValue> resultList; std::vector<flutter::EncodableValue> resultList;
resultList.push_back(flutter::EncodableValue()); // return null for Flutter texture ID resultList.push_back(flutter::EncodableValue()); // return null for Flutter texture ID
resultList.push_back(flutter::EncodableValue()); // return null for hardware texture ID resultList.push_back(flutter::EncodableValue()); // return null for hardware texture ID

View File

@@ -91,7 +91,7 @@ class ThermionFlutterWindowImpl extends ThermionFlutterWindow {
@override @override
Future destroy() async { Future destroy() async {
await _channel await _channel
.invokeMethod("destroyWindow", [width, height, offsetLeft, offsetLeft]); .invokeMethod("destroyWindow", this.handle);
} }
@override @override
@@ -112,7 +112,7 @@ class ThermionFlutterWindowImpl extends ThermionFlutterWindow {
throw Exception("Resize underway"); throw Exception("Resize underway");
} }
if (width == this.width && height == this.height) { if (width == this.width && height == this.height && this.offsetLeft == offsetLeft && this.offsetTop == offsetTop) {
return; return;
} }
@@ -124,7 +124,7 @@ class ThermionFlutterWindowImpl extends ThermionFlutterWindow {
_resizing = true; _resizing = true;
await _channel await _channel
.invokeMethod("resizeWindow", [width, height, offsetLeft, offsetLeft]); .invokeMethod("resizeWindow", [width, height, offsetLeft, offsetTop]);
_resizing = false; _resizing = false;
} }