Windows embedder fixes
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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>,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user