add getTargetNames method
This commit is contained in:
@@ -14,7 +14,7 @@ static const id VIEW_TYPE = @"mimetic.app/filament_view";
|
||||
- (mimetic::FilamentViewer*) _viewer;
|
||||
- (mimetic::ResourceBuffer)loadResource:(const char* const)path;
|
||||
- (void)freeResource:(void*)mem size:(size_t)size misc:(void*)misc;
|
||||
|
||||
- (void)ready;
|
||||
- (instancetype)initWithController:(FilamentViewController*)controller
|
||||
registrar:(NSObject<FlutterPluginRegistrar>*)registrar
|
||||
viewId:(int64_t)viewId
|
||||
|
||||
@@ -57,7 +57,7 @@ static void* freeResourceGlobal(void* mem, size_t size, void* misc) {
|
||||
} else if([@"loadGltf" isEqualToString:call.method]) {
|
||||
if(!_viewer)
|
||||
return;
|
||||
_viewer->loadGltf([call.arguments[0] UTF8String], [call.arguments[1] UTF8String], [call.arguments[2] UTF8String]);
|
||||
_viewer->loadGltf([call.arguments[0] UTF8String], [call.arguments[1] UTF8String]);
|
||||
result(@"OK");
|
||||
} else if([@"panStart" isEqualToString:call.method]) {
|
||||
if(!_viewer)
|
||||
@@ -85,6 +85,13 @@ static void* freeResourceGlobal(void* mem, size_t size, void* misc) {
|
||||
_viewer->manipulator->grabEnd();
|
||||
} else if([@"createMorpher" isEqualToString:call.method]) {
|
||||
_viewer->createMorpher([call.arguments[0] UTF8String], [call.arguments[1] UTF8String],[call.arguments[2] UTF8String]);
|
||||
} else if([@"getTargetNames" isEqualToString:call.method]) {
|
||||
mimetic::StringList list = _viewer->getTargetNames([call.arguments UTF8String]);
|
||||
NSMutableArray* asArray = [NSMutableArray arrayWithCapacity:list.count];
|
||||
for(int i = 0; i < list.count; i++) {
|
||||
asArray[i] = [NSString stringWithFormat:@"%s", list.strings[i]];
|
||||
}
|
||||
result(asArray);
|
||||
} else if([@"applyWeights" isEqualToString:call.method]) {
|
||||
if(!_viewer)
|
||||
return;
|
||||
@@ -113,7 +120,7 @@ static void* freeResourceGlobal(void* mem, size_t size, void* misc) {
|
||||
NSString* nsPath = [[NSBundle mainBundle] pathForResource:key
|
||||
ofType:nil];
|
||||
if (![[NSFileManager defaultManager] fileExistsAtPath:nsPath]) {
|
||||
NSLog(@"Error: no file exists at %@", nsPath);
|
||||
NSLog(@"Error: no file exists at %@", p);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
@@ -128,4 +135,8 @@ static void* freeResourceGlobal(void* mem, size_t size, void* misc) {
|
||||
free(mem);
|
||||
}
|
||||
|
||||
- (void)ready {
|
||||
[_channel invokeMethod:@"ready" arguments:nil];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
[_controller viewDidLoad];
|
||||
_layer = (__bridge_retained void*)[_view layer];
|
||||
_handler = [[FilamentMethodCallHandler alloc] initWithController:_controller registrar:registrar viewId:viewId layer:_layer];
|
||||
[_handler ready];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -20,21 +20,21 @@ A new flutter plugin project.
|
||||
s.static_framework = true
|
||||
|
||||
# Flutter.framework does not contain a i386 slice.
|
||||
s.xcconfig = {
|
||||
s.user_target_xcconfig = {
|
||||
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
|
||||
'ALWAYS_SEARCH_USER_PATHS' => 'YES',
|
||||
'USER_HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/../.symlinks/plugins/mimetic_filament/ios/include" "${PODS_ROOT}/../.symlinks/plugins/mimetic_filament/ios/src", "${PODS_ROOT}/../.symlinks/plugins/mimetic_filament/ios/morph"',
|
||||
'OTHER_CXXFLAGS' => '--std=c++17',
|
||||
'OTHER_CXXFLAGS' => '--std=c++17 -fmodules -fcxx-modules',
|
||||
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
|
||||
#"CLANG_CXX_LIBRARY" => "libc++"
|
||||
}
|
||||
s.pod_target_xcconfig = {
|
||||
'DEFINES_MODULE' => 'YES',
|
||||
'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386',
|
||||
'OTHER_CFLAGS' => '-fmodules -fcxx-modules',
|
||||
#'OTHER_CXXFLAGS' => '--std=c++17',
|
||||
#"CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
|
||||
#"CLANG_CXX_LIBRARY" => "libc++"
|
||||
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
|
||||
'OTHER_CXXFLAGS' => '--std=c++17 -fmodules -fcxx-modules',
|
||||
'USER_HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/../.symlinks/plugins/mimetic_filament/ios/include" "${PODS_ROOT}/../.symlinks/plugins/mimetic_filament/ios/src", "${PODS_ROOT}/../.symlinks/plugins/mimetic_filament/ios/morph"',
|
||||
'ALWAYS_SEARCH_USER_PATHS' => 'YES',
|
||||
}
|
||||
s.swift_version = '5.0'
|
||||
end
|
||||
|
||||
@@ -98,13 +98,13 @@ FilamentViewer::FilamentViewer(
|
||||
|
||||
_swapChain = _engine->createSwapChain(_layer);
|
||||
|
||||
if(shaderPath) {
|
||||
ResourceBuffer rb = _loadResource(shaderPath);
|
||||
_materialProvider = createGPUMorphShaderLoader(rb.data, rb.size, _engine);
|
||||
// _freeResource((void*)rb.data, rb.size, nullptr);
|
||||
} else {
|
||||
if(shaderPath) {
|
||||
ResourceBuffer rb = _loadResource(shaderPath);
|
||||
_materialProvider = createGPUMorphShaderLoader(rb.data, rb.size, _engine);
|
||||
// _freeResource((void*)rb.data, rb.size, nullptr); <- TODO this is being freed too early, need to pass to callback?
|
||||
} else {
|
||||
_materialProvider = createUbershaderLoader(_engine);
|
||||
}
|
||||
}
|
||||
EntityManager& em = EntityManager::get();
|
||||
_ncm = new NameComponentManager(em);
|
||||
_assetLoader = AssetLoader::create({_engine, _materialProvider, _ncm, &em});
|
||||
@@ -113,7 +113,6 @@ FilamentViewer::FilamentViewer(
|
||||
|
||||
manipulator =
|
||||
Manipulator<float>::Builder().orbitHomePosition(0.0f, 0.0f, 0.0f).targetPosition(0.0f, 0.0f, 0).build(Mode::ORBIT);
|
||||
//Manipulator<float>::Builder().orbitHomePosition(0.0f, 0.0f, 0.0f).targetPosition(0.0f, 0.0f, 0).build(Mode::ORBIT);
|
||||
_asset = nullptr;
|
||||
|
||||
}
|
||||
@@ -143,12 +142,12 @@ void FilamentViewer::loadResources(string relativeResourcePath) {
|
||||
}
|
||||
|
||||
_animator = _asset->getAnimator();
|
||||
// _asset->releaseSourceData();
|
||||
// _asset->releaseSourceData(); // we need to wait until the Morpher is created to release the source data
|
||||
|
||||
_scene->addEntities(_asset->getEntities(), _asset->getEntityCount());
|
||||
};
|
||||
|
||||
void FilamentViewer::loadGltf(const char* const uri, const char* const relativeResourcePath, const char* materialInstanceName) {
|
||||
void FilamentViewer::loadGltf(const char* const uri, const char* const relativeResourcePath) {
|
||||
if(_asset) {
|
||||
_resourceLoader->evictResourceData();
|
||||
_scene->removeEntities(_asset->getEntities(), _asset->getEntityCount());
|
||||
@@ -162,7 +161,6 @@ void FilamentViewer::loadGltf(const char* const uri, const char* const relativeR
|
||||
// Parse the glTF file and create Filament entities.
|
||||
_asset = _assetLoader->createAssetFromJson((uint8_t*)rbuf.data, rbuf.size);
|
||||
|
||||
|
||||
if (!_asset) {
|
||||
std::cerr << "Unable to parse asset" << std::endl;
|
||||
exit(1);
|
||||
@@ -178,6 +176,22 @@ void FilamentViewer::loadGltf(const char* const uri, const char* const relativeR
|
||||
|
||||
}
|
||||
|
||||
StringList FilamentViewer::getTargetNames(const char* meshName) {
|
||||
FFilamentAsset* asset = (FFilamentAsset*)_asset;
|
||||
NodeMap &sourceNodes = asset->isInstanced() ? asset->mInstances[0]->nodeMap
|
||||
: asset->mNodeMap;
|
||||
|
||||
for (auto pair : sourceNodes) {
|
||||
cgltf_node const *node = pair.first;
|
||||
cgltf_mesh const *mesh = node->mesh;
|
||||
|
||||
if (mesh && strcmp(meshName, mesh->name) == 0) {
|
||||
return StringList((const char**)mesh->target_names, (int) mesh->target_names_count);
|
||||
}
|
||||
}
|
||||
return StringList(nullptr, 0);
|
||||
}
|
||||
|
||||
void FilamentViewer::createMorpher(const char* meshName, const char* entityName, const char* materialInstanceName) {
|
||||
morphHelper = new gltfio::GPUMorphHelper((FFilamentAsset*)_asset, meshName, entityName, materialInstanceName);
|
||||
}
|
||||
@@ -250,16 +264,16 @@ void FilamentViewer::render() {
|
||||
// Extract the camera basis from the helper and push it to the Filament camera.
|
||||
math::float3 eye, target, upward;
|
||||
manipulator->getLookAt(&eye, &target, &upward);
|
||||
//std::cout << "eye " << eye[0] << " " << eye[1] << " " << eye[2] << " " << target[0] << " " << target[1] << " " << target[2] << std::endl;
|
||||
|
||||
_mainCamera->lookAt(eye, target, upward);
|
||||
|
||||
if(_animator) {
|
||||
/*typedef std::chrono::duration<float, std::milli> duration;
|
||||
typedef std::chrono::duration<float, std::milli> duration;
|
||||
duration dur = std::chrono::high_resolution_clock::now() - startTime;
|
||||
if (_animator->getAnimationCount() > 0) {
|
||||
_animator->applyAnimation(0, dur.count() / 1000);
|
||||
}
|
||||
_animator->updateBoneMatrices(); */
|
||||
//if (_animator->getAnimationCount() > 0) {
|
||||
///_animator->applyAnimation(0, dur.count() / 1000);
|
||||
//}
|
||||
//_animator->updateBoneMatrices();
|
||||
}
|
||||
|
||||
// Render the scene, unless the renderer wants to skip the frame.
|
||||
|
||||
@@ -42,6 +42,12 @@ using namespace camutils;
|
||||
|
||||
namespace mimetic {
|
||||
|
||||
struct StringList {
|
||||
StringList(const char** strings, const int count) : strings(strings), count(count) {};
|
||||
const char** strings;
|
||||
const int count;
|
||||
};
|
||||
|
||||
struct ResourceBuffer {
|
||||
ResourceBuffer(const void* data, const uint32_t size) : data(data), size(size) {};
|
||||
const void* data;
|
||||
@@ -55,11 +61,12 @@ namespace mimetic {
|
||||
public:
|
||||
FilamentViewer(void* layer, const char* shaderPath, LoadResource loadResource, FreeResource freeResource);
|
||||
~FilamentViewer();
|
||||
void loadGltf(const char* const uri, const char* relativeResourcePath, const char* materialInstanceName);
|
||||
void loadGltf(const char* const uri, const char* relativeResourcePath);
|
||||
void loadSkybox(const char* const skyboxUri, const char* const iblUri);
|
||||
void updateViewportAndCameraProjection(int height, int width, float scaleFactor);
|
||||
void render();
|
||||
void createMorpher(const char* meshName, const char* entityName, const char* materialInstanceName);
|
||||
StringList getTargetNames(const char* meshName);
|
||||
Manipulator<float>* manipulator;
|
||||
GPUMorphHelper* morphHelper;
|
||||
|
||||
@@ -68,6 +75,7 @@ namespace mimetic {
|
||||
void transformToUnitCube();
|
||||
void cleanup();
|
||||
void* _layer;
|
||||
|
||||
|
||||
LoadResource _loadResource;
|
||||
FreeResource _freeResource;
|
||||
|
||||
@@ -70,10 +70,8 @@ namespace gltfio {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
createTextures();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
GPUMorphHelper::~GPUMorphHelper() {
|
||||
|
||||
Reference in New Issue
Block a user