refactoring
This commit is contained in:
@@ -111,6 +111,8 @@ abstract class MaterialInstance {
|
|||||||
Future setParameterFloat3Array(String name, List<Vector3> data);
|
Future setParameterFloat3Array(String name, List<Vector3> data);
|
||||||
Future setParameterFloat4(
|
Future setParameterFloat4(
|
||||||
String name, double x, double y, double z, double w);
|
String name, double x, double y, double z, double w);
|
||||||
|
Future setParameterMat4(
|
||||||
|
String name, Matrix4 matrix);
|
||||||
|
|
||||||
Future setParameterInt(String name, int value);
|
Future setParameterInt(String name, int value);
|
||||||
Future setParameterBool(String name, bool value);
|
Future setParameterBool(String name, bool value);
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:vector_math/vector_math_64.dart';
|
|
||||||
|
|
||||||
import '../../../thermion_dart.dart';
|
import '../../../thermion_dart.dart';
|
||||||
|
|
||||||
class GeometryHelper {
|
class GeometryHelper {
|
||||||
static Geometry fullscreenQuad() {
|
static Geometry fullscreenQuad() {
|
||||||
final vertices = Float32List.fromList(
|
final vertices = Float32List.fromList(
|
||||||
[-1.0, -1.0, 1.0, 1.0, 3.0, -1.0, 1.0, 1.0, -1.0, 3.0, 1.0, 1.0]);
|
[-1.0, -1.0, 1.0, 3.0, -1.0, 1.0, -1.0, 3.0, 1.0]);
|
||||||
final indices = [0, 1, 2];
|
final indices = [0, 1, 2];
|
||||||
return Geometry(vertices, indices);
|
return Geometry(vertices, indices);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class BackgroundImage extends ThermionAsset {
|
|||||||
|
|
||||||
Future destroy() async {
|
Future destroy() async {
|
||||||
Scene_removeEntity(scene.scene, entity);
|
Scene_removeEntity(scene.scene, entity);
|
||||||
|
|
||||||
await texture!.dispose();
|
await texture!.dispose();
|
||||||
await sampler!.dispose();
|
await sampler!.dispose();
|
||||||
await mi.destroy();
|
await mi.destroy();
|
||||||
@@ -40,6 +40,9 @@ class BackgroundImage extends ThermionAsset {
|
|||||||
|
|
||||||
var backgroundImage =
|
var backgroundImage =
|
||||||
await viewer.createGeometry(GeometryHelper.fullscreenQuad());
|
await viewer.createGeometry(GeometryHelper.fullscreenQuad());
|
||||||
|
await imageMaterialInstance.setParameterInt("showImage", 0);
|
||||||
|
await imageMaterialInstance.setParameterMat4("transform", Matrix4.identity());
|
||||||
|
|
||||||
backgroundImage.setMaterialInstanceAt(imageMaterialInstance);
|
backgroundImage.setMaterialInstanceAt(imageMaterialInstance);
|
||||||
await scene.add(backgroundImage as FFIAsset);
|
await scene.add(backgroundImage as FFIAsset);
|
||||||
return BackgroundImage._(
|
return BackgroundImage._(
|
||||||
@@ -61,7 +64,6 @@ class BackgroundImage extends ThermionAsset {
|
|||||||
|
|
||||||
await mi.setParameterTexture(
|
await mi.setParameterTexture(
|
||||||
"image", texture as FFITexture, sampler as FFITextureSampler);
|
"image", texture as FFITexture, sampler as FFITextureSampler);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -13,6 +13,17 @@ void using(Pointer ptr, Future Function(Pointer ptr) function) async {
|
|||||||
allocator.free(ptr);
|
allocator.free(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> withVoidCallback2(Function() func) async {
|
||||||
|
final completer = Completer();
|
||||||
|
void Function() callback = () {
|
||||||
|
func.call();
|
||||||
|
completer.complete();
|
||||||
|
};
|
||||||
|
final nativeCallable = NativeCallable<Void Function()>.listener(callback);
|
||||||
|
await completer.future;
|
||||||
|
nativeCallable.close();
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> withVoidCallback(
|
Future<void> withVoidCallback(
|
||||||
Function(Pointer<NativeFunction<Void Function()>>) func) async {
|
Function(Pointer<NativeFunction<Void Function()>>) func) async {
|
||||||
final completer = Completer();
|
final completer = Completer();
|
||||||
@@ -27,8 +38,7 @@ Future<void> withVoidCallback(
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<Pointer<T>> withPointerCallback<T extends NativeType>(
|
Future<Pointer<T>> withPointerCallback<T extends NativeType>(
|
||||||
Function(Pointer<NativeFunction<Void Function(Pointer<T>)>>)
|
Function(Pointer<NativeFunction<Void Function(Pointer<T>)>>) func) async {
|
||||||
func) async {
|
|
||||||
final completer = Completer<Pointer<T>>();
|
final completer = Completer<Pointer<T>>();
|
||||||
// ignore: prefer_function_declarations_over_variables
|
// ignore: prefer_function_declarations_over_variables
|
||||||
void Function(Pointer<NativeType>) callback = (Pointer<NativeType> ptr) {
|
void Function(Pointer<NativeType>) callback = (Pointer<NativeType> ptr) {
|
||||||
@@ -101,4 +111,3 @@ Future<String> withCharPtrCallback(
|
|||||||
nativeCallable.close();
|
nativeCallable.close();
|
||||||
return completer.future;
|
return completer.future;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -563,6 +563,13 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
|
|||||||
await withBoolCallback((cb) {
|
await withBoolCallback((cb) {
|
||||||
Renderer_beginFrameRenderThread(renderer, swapChain!.swapChain, 0, cb);
|
Renderer_beginFrameRenderThread(renderer, swapChain!.swapChain, 0, cb);
|
||||||
});
|
});
|
||||||
|
await withVoidCallback((cb) {
|
||||||
|
Renderer_renderRenderThread(
|
||||||
|
renderer,
|
||||||
|
view.view,
|
||||||
|
cb,
|
||||||
|
);
|
||||||
|
});
|
||||||
await withVoidCallback((cb) {
|
await withVoidCallback((cb) {
|
||||||
Renderer_readPixelsRenderThread(
|
Renderer_readPixelsRenderThread(
|
||||||
renderer,
|
renderer,
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'dart:async';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart';
|
import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart';
|
||||||
@@ -192,4 +193,16 @@ class FFIMaterialInstance extends MaterialInstance {
|
|||||||
MaterialInstance_setParameterBool(
|
MaterialInstance_setParameterBool(
|
||||||
pointer, name.toNativeUtf8().cast<Char>(), value);
|
pointer, name.toNativeUtf8().cast<Char>(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future setParameterMat4(String name, Matrix4 matrix) async {
|
||||||
|
final completer = Completer();
|
||||||
|
final func = () {
|
||||||
|
MaterialInstance_setParameterMat4(pointer, name.toNativeUtf8().cast<Char>(), matrix.storage.address);
|
||||||
|
completer.complete();
|
||||||
|
};
|
||||||
|
final nativeCallable = NativeCallable<Void Function()>.listener(func);
|
||||||
|
RenderLoop_addTask(nativeCallable.nativeFunction);
|
||||||
|
await completer.future;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,15 @@ external void MaterialInstance_setParameterFloat4(
|
|||||||
double z,
|
double z,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ffi.Native<
|
||||||
|
ffi.Void Function(ffi.Pointer<TMaterialInstance>, ffi.Pointer<ffi.Char>,
|
||||||
|
ffi.Pointer<ffi.Double>)>(isLeaf: true)
|
||||||
|
external void MaterialInstance_setParameterMat4(
|
||||||
|
ffi.Pointer<TMaterialInstance> materialInstance,
|
||||||
|
ffi.Pointer<ffi.Char> propertyName,
|
||||||
|
ffi.Pointer<ffi.Double> matrix,
|
||||||
|
);
|
||||||
|
|
||||||
@ffi.Native<
|
@ffi.Native<
|
||||||
ffi.Void Function(ffi.Pointer<TMaterialInstance>, ffi.Pointer<ffi.Char>,
|
ffi.Void Function(ffi.Pointer<TMaterialInstance>, ffi.Pointer<ffi.Char>,
|
||||||
ffi.Int)>(isLeaf: true)
|
ffi.Int)>(isLeaf: true)
|
||||||
@@ -1511,6 +1520,13 @@ external void RenderTicker_renderRenderThread(
|
|||||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
|
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ffi.Native<
|
||||||
|
ffi.Void Function(
|
||||||
|
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>(isLeaf: true)
|
||||||
|
external void RenderLoop_addTask(
|
||||||
|
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> task,
|
||||||
|
);
|
||||||
|
|
||||||
@ffi.Native<
|
@ffi.Native<
|
||||||
ffi.Void Function(
|
ffi.Void Function(
|
||||||
ffi.Pointer<TEngine>,
|
ffi.Pointer<TEngine>,
|
||||||
|
|||||||
@@ -4,6 +4,16 @@
|
|||||||
|
|
||||||
namespace thermion {
|
namespace thermion {
|
||||||
|
|
||||||
|
// Helper function to convert double* to filament::math::mat4f
|
||||||
|
static filament::math::mat4f convert_double_to_mat4f(double* data)
|
||||||
|
{
|
||||||
|
return filament::math::mat4f {
|
||||||
|
filament::math::float4{static_cast<float>(data[0]), static_cast<float>(data[1]), static_cast<float>(data[2]), static_cast<float>(data[3])},
|
||||||
|
filament::math::float4{static_cast<float>(data[4]), static_cast<float>(data[5]), static_cast<float>(data[6]), static_cast<float>(data[7])},
|
||||||
|
filament::math::float4{static_cast<float>(data[8]), static_cast<float>(data[9]), static_cast<float>(data[10]), static_cast<float>(data[11])},
|
||||||
|
filament::math::float4{static_cast<float>(data[12]), static_cast<float>(data[13]), static_cast<float>(data[14]), static_cast<float>(data[15])}};
|
||||||
|
}
|
||||||
|
|
||||||
// Helper function to convert filament::math::mat4 to double4x4
|
// Helper function to convert filament::math::mat4 to double4x4
|
||||||
static double4x4 convert_mat4_to_double4x4(const filament::math::mat4 &mat)
|
static double4x4 convert_mat4_to_double4x4(const filament::math::mat4 &mat)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ extern "C"
|
|||||||
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat3(TMaterialInstance *materialInstance, const char *propertyName, double x, double y, double z);
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat3(TMaterialInstance *materialInstance, const char *propertyName, double x, double y, double z);
|
||||||
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat3Array(TMaterialInstance *tMaterialInstance, const char *propertyName, double *raw, uint32_t length);
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat3Array(TMaterialInstance *tMaterialInstance, const char *propertyName, double *raw, uint32_t length);
|
||||||
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *materialInstance, const char *propertyName, double x, double y, double w, double z);
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *materialInstance, const char *propertyName, double x, double y, double w, double z);
|
||||||
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterMat4(TMaterialInstance *materialInstance, const char *propertyName, double *matrix);
|
||||||
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *propertyName, int value);
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *propertyName, int value);
|
||||||
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterBool(TMaterialInstance *materialInstance, const char *propertyName, bool value);
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterBool(TMaterialInstance *materialInstance, const char *propertyName, bool value);
|
||||||
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterTexture(TMaterialInstance *materialInstance, const char *propertyName, TTexture *texture, TTextureSampler *sampler);
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterTexture(TMaterialInstance *materialInstance, const char *propertyName, TTexture *texture, TTextureSampler *sampler);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ namespace thermion
|
|||||||
EMSCRIPTEN_KEEPALIVE void RenderLoop_destroy();
|
EMSCRIPTEN_KEEPALIVE void RenderLoop_destroy();
|
||||||
EMSCRIPTEN_KEEPALIVE void RenderLoop_requestAnimationFrame(void (*onComplete)());
|
EMSCRIPTEN_KEEPALIVE void RenderLoop_requestAnimationFrame(void (*onComplete)());
|
||||||
EMSCRIPTEN_KEEPALIVE void RenderTicker_renderRenderThread(TRenderTicker *tRenderTicker, uint64_t frameTimeInNanos, void (*onComplete)());
|
EMSCRIPTEN_KEEPALIVE void RenderTicker_renderRenderThread(TRenderTicker *tRenderTicker, uint64_t frameTimeInNanos, void (*onComplete)());
|
||||||
// EMSCRIPTEN_KEEPALIVE void RenderLoop_addTask(TRenderLoop* tRenderLoop, void (*task)());
|
EMSCRIPTEN_KEEPALIVE void RenderLoop_addTask(void (*task)());
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void AnimationManager_createRenderThread(TEngine *tEngine, TScene *tScene, void (*onComplete)(TAnimationManager *));
|
EMSCRIPTEN_KEEPALIVE void AnimationManager_createRenderThread(TEngine *tEngine, TScene *tScene, void (*onComplete)(TAnimationManager *));
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include <math/vec2.h>
|
#include <math/vec2.h>
|
||||||
|
|
||||||
#include "Log.hpp"
|
#include "Log.hpp"
|
||||||
|
#include "MathUtils.hpp"
|
||||||
#include "material/image.h"
|
#include "material/image.h"
|
||||||
#include "material/grid.h"
|
#include "material/grid.h"
|
||||||
|
|
||||||
@@ -125,6 +125,11 @@ namespace thermion
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterMat4(TMaterialInstance *tMaterialInstance, const char *propertyName, double *matrix) {
|
||||||
|
auto *mi = reinterpret_cast<filament::MaterialInstance *>(tMaterialInstance);
|
||||||
|
mi->setParameter(propertyName, convert_double_to_mat4f(matrix));
|
||||||
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *tMaterialInstance, TSamplerCompareFunc tDepthFunc)
|
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *tMaterialInstance, TSamplerCompareFunc tDepthFunc)
|
||||||
{
|
{
|
||||||
auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance);
|
auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance);
|
||||||
|
|||||||
@@ -50,6 +50,15 @@ extern "C"
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void RenderLoop_addTask(void (*task)()) {
|
||||||
|
std::packaged_task<void()> lambda(
|
||||||
|
[=]() mutable
|
||||||
|
{
|
||||||
|
task();
|
||||||
|
});
|
||||||
|
auto fut = _rl->add_task(lambda);
|
||||||
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void RenderLoop_requestAnimationFrame(void (*onComplete)()) {
|
EMSCRIPTEN_KEEPALIVE void RenderLoop_requestAnimationFrame(void (*onComplete)()) {
|
||||||
_rl->requestFrame(onComplete);
|
_rl->requestFrame(onComplete);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user