add GPU morpher + Dart API
This commit is contained in:
@@ -14,9 +14,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "FilamentViewer.hpp"
|
||||
|
||||
#include <filament/Camera.h>
|
||||
#include <filament/ColorGrading.h>
|
||||
#include <filament/Engine.h>
|
||||
@@ -37,6 +36,7 @@
|
||||
#include <gltfio/AssetLoader.h>
|
||||
#include <gltfio/FilamentAsset.h>
|
||||
#include <gltfio/ResourceLoader.h>
|
||||
#include <gltfio/Animator.h>
|
||||
|
||||
#include <camutils/Manipulator.h>
|
||||
|
||||
@@ -50,13 +50,9 @@
|
||||
|
||||
#include <image/KtxUtility.h>
|
||||
|
||||
#include <gltfio/Animator.h>
|
||||
|
||||
#include <chrono>
|
||||
#include <iostream>
|
||||
|
||||
|
||||
|
||||
using namespace filament;
|
||||
using namespace filament::math;
|
||||
using namespace gltfio;
|
||||
@@ -67,6 +63,10 @@ namespace filament {
|
||||
class LightManager;
|
||||
}
|
||||
|
||||
namespace gltfio {
|
||||
MaterialProvider* createGPUMorphShaderLoader(const void* data, uint64_t size, Engine* engine);
|
||||
}
|
||||
|
||||
namespace mimetic {
|
||||
|
||||
const double kNearPlane = 0.05; // 5 cm
|
||||
@@ -76,10 +76,9 @@ const float kAperture = 16.0f;
|
||||
const float kShutterSpeed = 1.0f / 125.0f;
|
||||
const float kSensitivity = 100.0f;
|
||||
|
||||
MaterialProvider* createGPUShaderLoader(Engine* engine);
|
||||
|
||||
FilamentViewer::FilamentViewer(
|
||||
void* layer,
|
||||
const char* shaderPath,
|
||||
LoadResource loadResource,
|
||||
FreeResource freeResource) : _layer(layer),
|
||||
_loadResource(loadResource),
|
||||
@@ -99,8 +98,13 @@ FilamentViewer::FilamentViewer(
|
||||
|
||||
_swapChain = _engine->createSwapChain(_layer);
|
||||
|
||||
// _materialProvider = createGPUShaderLoader(_engine);
|
||||
_materialProvider = createUbershaderLoader(_engine);
|
||||
if(shaderPath) {
|
||||
ResourceBuffer rb = _loadResource(shaderPath);
|
||||
_materialProvider = createGPUMorphShaderLoader(rb.data, rb.size, _engine);
|
||||
// _freeResource((void*)rb.data, rb.size, nullptr);
|
||||
} else {
|
||||
_materialProvider = createUbershaderLoader(_engine);
|
||||
}
|
||||
EntityManager& em = EntityManager::get();
|
||||
_ncm = new NameComponentManager(em);
|
||||
_assetLoader = AssetLoader::create({_engine, _materialProvider, _ncm, &em});
|
||||
@@ -111,6 +115,7 @@ FilamentViewer::FilamentViewer(
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
FilamentViewer::~FilamentViewer() {
|
||||
@@ -138,23 +143,26 @@ void FilamentViewer::loadResources(string relativeResourcePath) {
|
||||
}
|
||||
|
||||
_animator = _asset->getAnimator();
|
||||
_asset->releaseSourceData();
|
||||
// _asset->releaseSourceData();
|
||||
|
||||
_scene->addEntities(_asset->getEntities(), _asset->getEntityCount());
|
||||
};
|
||||
|
||||
void FilamentViewer::loadGltf(const char* const uri, const char* const relativeResourcePath) {
|
||||
_resourceLoader->asyncCancelLoad();
|
||||
_resourceLoader->evictResourceData();
|
||||
void FilamentViewer::loadGltf(const char* const uri, const char* const relativeResourcePath, const char* materialInstanceName) {
|
||||
if(_asset) {
|
||||
_resourceLoader->evictResourceData();
|
||||
_scene->removeEntities(_asset->getEntities(), _asset->getEntityCount());
|
||||
_assetLoader->destroyAsset(_asset);
|
||||
}
|
||||
_asset = nullptr;
|
||||
_animator = nullptr;
|
||||
|
||||
ResourceBuffer rbuf = _loadResource(uri);
|
||||
|
||||
// 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);
|
||||
@@ -167,6 +175,11 @@ void FilamentViewer::loadGltf(const char* const uri, const char* const relativeR
|
||||
transformToUnitCube();
|
||||
|
||||
startTime = std::chrono::high_resolution_clock::now();
|
||||
|
||||
}
|
||||
|
||||
void FilamentViewer::createMorpher(const char* meshName, const char* entityName, const char* materialInstanceName) {
|
||||
morphHelper = new gltfio::GPUMorphHelper((FFilamentAsset*)_asset, meshName, entityName, materialInstanceName);
|
||||
}
|
||||
|
||||
|
||||
@@ -241,13 +254,12 @@ void FilamentViewer::render() {
|
||||
_mainCamera->lookAt(eye, target, upward);
|
||||
|
||||
if(_animator) {
|
||||
// typedef std::chrono::high_resolution_clock clock;
|
||||
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();
|
||||
_animator->updateBoneMatrices(); */
|
||||
}
|
||||
|
||||
// Render the scene, unless the renderer wants to skip the frame.
|
||||
|
||||
Reference in New Issue
Block a user