update FilamentViewer with iOS Metal

This commit is contained in:
Nick Fisher
2022-08-19 12:37:28 +08:00
parent 967be4d8a7
commit d23fe45d08

View File

@@ -1,3 +1,8 @@
#if __APPLE__
#include "TargetConditionals.h"
#endif
/* /*
* Copyright (C) 2019 The Android Open Source Project * Copyright (C) 2019 The Android Open Source Project
* *
@@ -14,6 +19,7 @@
* limitations under the License. * limitations under the License.
*/ */
#include <filament/Camera.h> #include <filament/Camera.h>
#include <backend/DriverEnums.h>
#include <filament/ColorGrading.h> #include <filament/ColorGrading.h>
#include <filament/Engine.h> #include <filament/Engine.h>
#include <filament/IndexBuffer.h> #include <filament/IndexBuffer.h>
@@ -59,7 +65,7 @@
#include "Log.hpp" #include "Log.hpp"
#include "SceneResources.hpp" #include "SceneResources.hpp"
#include "image/imagematerial.h" #include "image/imagematerials_ios.h"
#include "FilamentViewer.hpp" #include "FilamentViewer.hpp"
#include "StreamBufferAdapter.hpp" #include "StreamBufferAdapter.hpp"
@@ -86,7 +92,12 @@ const float kSensitivity = 100.0f;
FilamentViewer::FilamentViewer(void *layer, LoadResource loadResource, FilamentViewer::FilamentViewer(void *layer, LoadResource loadResource,
FreeResource freeResource) FreeResource freeResource)
: _layer(layer), _loadResource(loadResource), _freeResource(freeResource) { : _layer(layer), _loadResource(loadResource), _freeResource(freeResource) {
_engine = Engine::create(Engine::Backend::OPENGL);
#if TARGET_OS_IPHONE
_engine = Engine::create(Engine::Backend::METAL);
#else
_engine = Engine::create(Engine::Backend::OPENGL);
#endif;
_renderer = _engine->createRenderer(); _renderer = _engine->createRenderer();
@@ -109,8 +120,11 @@ FilamentViewer::FilamentViewer(void *layer, LoadResource loadResource,
_cameraFocalLength = 28.0f; _cameraFocalLength = 28.0f;
_mainCamera->setExposure(kAperture, kShutterSpeed, kSensitivity); _mainCamera->setExposure(kAperture, kShutterSpeed, kSensitivity);
#if TARGET_OS_IPHONE
_swapChain = _engine->createSwapChain(_layer); _swapChain = _engine->createSwapChain(layer, filament::backend::SWAP_CHAIN_CONFIG_APPLE_CVPIXELBUFFER);
#else
_swapChain = _engine->createSwapChain(layer);
#endif
View::DynamicResolutionOptions options; View::DynamicResolutionOptions options;
options.enabled = true; options.enabled = true;
@@ -179,7 +193,7 @@ void FilamentViewer::createImageRenderable() {
auto &em = EntityManager::get(); auto &em = EntityManager::get();
_imageMaterial = _imageMaterial =
Material::Builder() Material::Builder()
.package(IMAGEMATERIAL_IMAGE_DATA, IMAGEMATERIAL_IMAGE_SIZE) .package(IMAGEMATERIALS_IOS_IMAGE_FILAMAT_DATA, IMAGEMATERIALS_IOS_IMAGE_FILAMAT_SIZE)
.build(*_engine); .build(*_engine);
_imageVb = VertexBuffer::Builder() _imageVb = VertexBuffer::Builder()
@@ -252,7 +266,7 @@ void FilamentViewer::setBackgroundImage(const char *resourcePath) {
delete inputStream; delete inputStream;
_freeResource(bg); _freeResource(bg.id);
uint32_t channels = image->getChannels(); uint32_t channels = image->getChannels();
uint32_t w = image->getWidth(); uint32_t w = image->getWidth();
@@ -300,8 +314,12 @@ FilamentViewer::~FilamentViewer() { cleanup(); }
Renderer *FilamentViewer::getRenderer() { return _renderer; } Renderer *FilamentViewer::getRenderer() { return _renderer; }
void FilamentViewer::createSwapChain(void *surface) { void FilamentViewer::createSwapChain(void *surface) {
_swapChain = _engine->createSwapChain(surface); #if TARGET_OS_IPHONE
Log("swapchain created."); _swapChain = _engine->createSwapChain(surface, filament::backend::SWAP_CHAIN_CONFIG_APPLE_CVPIXELBUFFER);
#else
_swapChain = _engine->createSwapChain(surface);
#endif
Log("Swapchain created.");
} }
void FilamentViewer::destroySwapChain() { void FilamentViewer::destroySwapChain() {
@@ -448,7 +466,7 @@ void FilamentViewer::loadSkybox(const char *const skyboxPath) {
filament::Skybox::Builder().environment(_skyboxTexture).build(*_engine); filament::Skybox::Builder().environment(_skyboxTexture).build(*_engine);
_scene->setSkybox(_skybox); _scene->setSkybox(_skybox);
_freeResource(skyboxBuffer); _freeResource(skyboxBuffer.id);
} }
} }
@@ -480,7 +498,7 @@ void FilamentViewer::loadIbl(const char *const iblPath) {
.build(*_engine); .build(*_engine);
_scene->setIndirectLight(_indirectLight); _scene->setIndirectLight(_indirectLight);
_freeResource(iblBuffer); _freeResource(iblBuffer.id);
Log("Skybox/IBL load complete."); Log("Skybox/IBL load complete.");
} }