use child entity for morph animations rather than name & expose Emscripten scripts via moduleArgs
This commit is contained in:
@@ -373,7 +373,8 @@ extern "C"
|
|||||||
int numFrames,
|
int numFrames,
|
||||||
float frameLengthInMs)
|
float frameLengthInMs)
|
||||||
{
|
{
|
||||||
return ((SceneManager *)sceneManager)->setMorphAnimationBuffer(asset, morphData, morphIndices, numMorphTargets, numFrames, frameLengthInMs);
|
auto result = ((SceneManager *)sceneManager)->setMorphAnimationBuffer(asset, morphData, morphIndices, numMorphTargets, numFrames, frameLengthInMs);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose(void *sceneManager, EntityId entityId)
|
EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose(void *sceneManager, EntityId entityId)
|
||||||
@@ -476,15 +477,15 @@ extern "C"
|
|||||||
strcpy(outPtr, name.c_str());
|
strcpy(outPtr, name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId asset, const char *meshName)
|
EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity)
|
||||||
{
|
{
|
||||||
auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(asset, meshName);
|
auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(assetEntity, childEntity);
|
||||||
return (int)names->size();
|
return (int)names->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void get_morph_target_name(void *sceneManager, EntityId asset, const char *meshName, char *const outPtr, int index)
|
EMSCRIPTEN_KEEPALIVE void get_morph_target_name(void *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index)
|
||||||
{
|
{
|
||||||
auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(asset, meshName);
|
auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(assetEntity, childEntity);
|
||||||
std::string name = names->at(index);
|
std::string name = names->at(index);
|
||||||
strcpy(outPtr, name.c_str());
|
strcpy(outPtr, name.c_str());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ public:
|
|||||||
|
|
||||||
_viewer = new FilamentViewer((void* const) emContext, loader, platform, uberArchivePath);
|
_viewer = new FilamentViewer((void* const) emContext, loader, platform, uberArchivePath);
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0, $1);
|
moduleArg.dartFilamentResolveCallback($0, $1);
|
||||||
}, callback, _viewer);
|
}, callback, _viewer);
|
||||||
#else
|
#else
|
||||||
_viewer = new FilamentViewer(context, loader, platform, uberArchivePath);
|
_viewer = new FilamentViewer(context, loader, platform, uberArchivePath);
|
||||||
@@ -227,7 +227,7 @@ extern "C"
|
|||||||
create_swap_chain(viewer, surface, width, height);
|
create_swap_chain(viewer, surface, width, height);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, onComplete);
|
}, onComplete);
|
||||||
#else
|
#else
|
||||||
onComplete();
|
onComplete();
|
||||||
@@ -245,7 +245,7 @@ extern "C"
|
|||||||
destroy_swap_chain(viewer);
|
destroy_swap_chain(viewer);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, onComplete);
|
}, onComplete);
|
||||||
#else
|
#else
|
||||||
onComplete();
|
onComplete();
|
||||||
@@ -265,7 +265,7 @@ extern "C"
|
|||||||
create_render_target(viewer, nativeTextureId, width, height);
|
create_render_target(viewer, nativeTextureId, width, height);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, onComplete);
|
}, onComplete);
|
||||||
#else
|
#else
|
||||||
onComplete();
|
onComplete();
|
||||||
@@ -285,7 +285,7 @@ extern "C"
|
|||||||
update_viewport_and_camera_projection(viewer, width, height, scaleFactor);
|
update_viewport_and_camera_projection(viewer, width, height, scaleFactor);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, onComplete);
|
}, onComplete);
|
||||||
#else
|
#else
|
||||||
onComplete();
|
onComplete();
|
||||||
@@ -351,7 +351,7 @@ extern "C"
|
|||||||
auto entity = load_gltf(sceneManager, path, relativeResourcePath);
|
auto entity = load_gltf(sceneManager, path, relativeResourcePath);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0, $1);
|
moduleArg.dartFilamentResolveCallback($0, $1);
|
||||||
}, callback, entity);
|
}, callback, entity);
|
||||||
#else
|
#else
|
||||||
callback(entity);
|
callback(entity);
|
||||||
@@ -369,7 +369,7 @@ extern "C"
|
|||||||
auto entity = load_glb(sceneManager, path, numInstances);
|
auto entity = load_glb(sceneManager, path, numInstances);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0, $1);
|
moduleArg.dartFilamentResolveCallback($0, $1);
|
||||||
}, callback, entity);
|
}, callback, entity);
|
||||||
#else
|
#else
|
||||||
callback(entity);
|
callback(entity);
|
||||||
@@ -409,7 +409,7 @@ extern "C"
|
|||||||
set_background_image(viewer, path, fillHeight);
|
set_background_image(viewer, path, fillHeight);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, callback);
|
}, callback);
|
||||||
#else
|
#else
|
||||||
callback();
|
callback();
|
||||||
@@ -449,7 +449,7 @@ extern "C"
|
|||||||
load_skybox(viewer, skyboxPath);
|
load_skybox(viewer, skyboxPath);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, onComplete);
|
}, onComplete);
|
||||||
#else
|
#else
|
||||||
onComplete();
|
onComplete();
|
||||||
@@ -490,7 +490,7 @@ extern "C"
|
|||||||
dirY, dirZ, shadows);
|
dirY, dirZ, shadows);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0, $1);
|
moduleArg.dartFilamentResolveCallback($0, $1);
|
||||||
}, callback, entity);
|
}, callback, entity);
|
||||||
#else
|
#else
|
||||||
callback(entity);
|
callback(entity);
|
||||||
@@ -523,7 +523,7 @@ extern "C"
|
|||||||
remove_entity(viewer, asset);
|
remove_entity(viewer, asset);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, callback);
|
}, callback);
|
||||||
#else
|
#else
|
||||||
callback();
|
callback();
|
||||||
@@ -539,7 +539,7 @@ extern "C"
|
|||||||
clear_entities(viewer);
|
clear_entities(viewer);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, callback);
|
}, callback);
|
||||||
#else
|
#else
|
||||||
callback();
|
callback();
|
||||||
@@ -557,7 +557,7 @@ extern "C"
|
|||||||
auto success = set_camera(viewer, asset, nodeName);
|
auto success = set_camera(viewer, asset, nodeName);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0,$1);
|
moduleArg.dartFilamentResolveCallback($0,$1);
|
||||||
}, callback, success);
|
}, callback, success);
|
||||||
#else
|
#else
|
||||||
callback(success);
|
callback(success);
|
||||||
@@ -568,15 +568,15 @@ extern "C"
|
|||||||
}
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void
|
EMSCRIPTEN_KEEPALIVE void
|
||||||
get_morph_target_name_ffi(void *sceneManager, EntityId asset,
|
get_morph_target_name_ffi(void *sceneManager, EntityId assetEntity,
|
||||||
const char *meshName, char *const outPtr, int index, void (*callback)())
|
EntityId childEntity, char *const outPtr, int index, void (*callback)())
|
||||||
{
|
{
|
||||||
std::packaged_task<void()> lambda([=]
|
std::packaged_task<void()> lambda([=]
|
||||||
{
|
{
|
||||||
get_morph_target_name(sceneManager, asset, meshName, outPtr, index);
|
get_morph_target_name(sceneManager, assetEntity, childEntity, outPtr, index);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, callback);
|
}, callback);
|
||||||
#else
|
#else
|
||||||
callback();
|
callback();
|
||||||
@@ -586,15 +586,15 @@ extern "C"
|
|||||||
}
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void
|
EMSCRIPTEN_KEEPALIVE void
|
||||||
get_morph_target_name_count_ffi(void *sceneManager, EntityId asset,
|
get_morph_target_name_count_ffi(void *sceneManager, EntityId assetEntity,
|
||||||
const char *meshName, void (*callback)(int))
|
EntityId childEntity, void (*callback)(int))
|
||||||
{
|
{
|
||||||
std::packaged_task<int()> lambda([=]
|
std::packaged_task<int()> lambda([=]
|
||||||
{
|
{
|
||||||
auto count = get_morph_target_name_count(sceneManager, asset, meshName);
|
auto count = get_morph_target_name_count(sceneManager, assetEntity, childEntity);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0,$1);
|
moduleArg.dartFilamentResolveCallback($0,$1);
|
||||||
}, callback, count);
|
}, callback, count);
|
||||||
#else
|
#else
|
||||||
callback(count);
|
callback(count);
|
||||||
@@ -644,7 +644,7 @@ extern "C"
|
|||||||
auto count = get_animation_count(sceneManager, asset);
|
auto count = get_animation_count(sceneManager, asset);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0,$1);
|
moduleArg.dartFilamentResolveCallback($0,$1);
|
||||||
}, callback, count);
|
}, callback, count);
|
||||||
#else
|
#else
|
||||||
callback(count);
|
callback(count);
|
||||||
@@ -666,7 +666,7 @@ extern "C"
|
|||||||
get_animation_name(sceneManager, asset, outPtr, index);
|
get_animation_name(sceneManager, asset, outPtr, index);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0);
|
moduleArg.dartFilamentResolveCallback($0);
|
||||||
}, callback);
|
}, callback);
|
||||||
#else
|
#else
|
||||||
callback();
|
callback();
|
||||||
@@ -693,7 +693,7 @@ extern "C"
|
|||||||
auto name = get_name_for_entity(sceneManager, entityId);
|
auto name = get_name_for_entity(sceneManager, entityId);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0,$1);
|
moduleArg.dartFilamentResolveCallback($0,$1);
|
||||||
}, callback, name);
|
}, callback, name);
|
||||||
#else
|
#else
|
||||||
callback(name);
|
callback(name);
|
||||||
@@ -709,13 +709,17 @@ extern "C"
|
|||||||
int numWeights,
|
int numWeights,
|
||||||
void (*callback)(bool))
|
void (*callback)(bool))
|
||||||
{
|
{
|
||||||
|
Log("Setting morph target weights");
|
||||||
std::packaged_task<void()> lambda(
|
std::packaged_task<void()> lambda(
|
||||||
[=]
|
[=]
|
||||||
{
|
{
|
||||||
|
Log("Setting in lambda");
|
||||||
auto result = set_morph_target_weights(sceneManager, asset, morphData, numWeights);
|
auto result = set_morph_target_weights(sceneManager, asset, morphData, numWeights);
|
||||||
|
Log("Set, result was %d", result);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
|
Log("emscripten");
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0,$1);
|
moduleArg.dartFilamentResolveCallback($0,$1);
|
||||||
}, callback, result);
|
}, callback, result);
|
||||||
#else
|
#else
|
||||||
callback(result);
|
callback(result);
|
||||||
@@ -738,7 +742,7 @@ extern "C"
|
|||||||
auto success = set_bone_transform(sceneManager, asset, entityName, transform, boneName);
|
auto success = set_bone_transform(sceneManager, asset, entityName, transform, boneName);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0,$1);
|
moduleArg.dartFilamentResolveCallback($0,$1);
|
||||||
}, callback, success);
|
}, callback, success);
|
||||||
#else
|
#else
|
||||||
callback(success);
|
callback(success);
|
||||||
@@ -786,7 +790,7 @@ extern "C"
|
|||||||
auto entity = create_geometry(viewer, vertices, numVertices, indices, numIndices, primitiveType, materialPath);
|
auto entity = create_geometry(viewer, vertices, numVertices, indices, numIndices, primitiveType, materialPath);
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
MAIN_THREAD_EM_ASM({
|
MAIN_THREAD_EM_ASM({
|
||||||
window.resolveCallback($0,$1);
|
moduleArg.dartFilamentResolveCallback($0,$1);
|
||||||
}, callback, entity);
|
}, callback, entity);
|
||||||
#else
|
#else
|
||||||
callback(entity);
|
callback(entity);
|
||||||
|
|||||||
@@ -445,7 +445,6 @@ namespace flutter_filament
|
|||||||
const auto &pos = _instances.find(entityId);
|
const auto &pos = _instances.find(entityId);
|
||||||
if (pos == _instances.end())
|
if (pos == _instances.end())
|
||||||
{
|
{
|
||||||
// Log("Failed to find FilamentInstance for entity %d", entityId);
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return pos->second;
|
return pos->second;
|
||||||
@@ -1197,32 +1196,38 @@ namespace flutter_filament
|
|||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<std::vector<std::string>> SceneManager::getMorphTargetNames(EntityId entityId, const char *meshName)
|
unique_ptr<std::vector<std::string>> SceneManager::getMorphTargetNames(EntityId assetEntityId, EntityId child)
|
||||||
{
|
{
|
||||||
|
|
||||||
unique_ptr<std::vector<std::string>> names = std::make_unique<std::vector<std::string>>();
|
unique_ptr<std::vector<std::string>> names = std::make_unique<std::vector<std::string>>();
|
||||||
|
|
||||||
const auto *instance = getInstanceByEntityId(entityId);
|
const auto *instance = getInstanceByEntityId(assetEntityId);
|
||||||
|
|
||||||
if (!instance)
|
if (!instance)
|
||||||
{
|
{
|
||||||
auto asset = getAssetByEntityId(entityId);
|
auto asset = getAssetByEntityId(assetEntityId);
|
||||||
if (!asset)
|
if (!asset)
|
||||||
{
|
{
|
||||||
|
Log("Warning - failed to find specified asset. This is unexpected and probably indicates you are passing the wrong entity");
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
instance = asset->getInstance();
|
instance = asset->getInstance();
|
||||||
|
if(!instance) {
|
||||||
|
Log("Warning - failed to find instance for specified asset. This is unexpected and probably indicates you are passing the wrong entity");
|
||||||
|
return names;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto *asset = instance->getAsset();
|
const auto *asset = instance->getAsset();
|
||||||
|
|
||||||
const utils::Entity *entities = asset->getEntities();
|
const utils::Entity *entities = asset->getEntities();
|
||||||
|
|
||||||
|
const utils::Entity target = Entity::import(child);
|
||||||
|
|
||||||
for (int i = 0; i < asset->getEntityCount(); i++)
|
for (int i = 0; i < asset->getEntityCount(); i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
utils::Entity e = entities[i];
|
utils::Entity e = entities[i];
|
||||||
const char *name = asset->getName(e);
|
if (e == target)
|
||||||
|
|
||||||
if (name && strcmp(name, meshName) == 0)
|
|
||||||
{
|
{
|
||||||
size_t count = asset->getMorphTargetCountAt(e);
|
size_t count = asset->getMorphTargetCountAt(e);
|
||||||
for (int j = 0; j < count; j++)
|
for (int j = 0; j < count; j++)
|
||||||
|
|||||||
Reference in New Issue
Block a user