add depth texture to createRenderTarget, set stencil disabled by default
This commit is contained in:
@@ -6,21 +6,6 @@
|
|||||||
#pragma comment(lib, "Ws2_32.lib")
|
#pragma comment(lib, "Ws2_32.lib")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#include <filament/Camera.h>
|
#include <filament/Camera.h>
|
||||||
#include <filament/SwapChain.h>
|
#include <filament/SwapChain.h>
|
||||||
#include <backend/DriverEnums.h>
|
#include <backend/DriverEnums.h>
|
||||||
@@ -113,15 +98,14 @@ namespace thermion
|
|||||||
static constexpr filament::math::float4 sFullScreenTriangleVertices[3] = {
|
static constexpr filament::math::float4 sFullScreenTriangleVertices[3] = {
|
||||||
{-1.0f, -1.0f, 1.0f, 1.0f},
|
{-1.0f, -1.0f, 1.0f, 1.0f},
|
||||||
{3.0f, -1.0f, 1.0f, 1.0f},
|
{3.0f, -1.0f, 1.0f, 1.0f},
|
||||||
{-1.0f, 3.0f, 1.0f, 1.0f}
|
{-1.0f, 3.0f, 1.0f, 1.0f}};
|
||||||
};
|
|
||||||
|
|
||||||
static const uint16_t sFullScreenTriangleIndices[3] = {0, 1, 2};
|
static const uint16_t sFullScreenTriangleIndices[3] = {0, 1, 2};
|
||||||
|
|
||||||
FilamentViewer::FilamentViewer(const void *sharedContext, const ResourceLoaderWrapperImpl *const resourceLoader, void *const platform, const char *uberArchivePath)
|
FilamentViewer::FilamentViewer(const void *sharedContext, const ResourceLoaderWrapperImpl *const resourceLoader, void *const platform, const char *uberArchivePath)
|
||||||
: _resourceLoaderWrapper(resourceLoader)
|
: _resourceLoaderWrapper(resourceLoader)
|
||||||
{
|
{
|
||||||
|
|
||||||
ASSERT_POSTCONDITION(_resourceLoaderWrapper != nullptr, "Resource loader must be non-null");
|
ASSERT_POSTCONDITION(_resourceLoaderWrapper != nullptr, "Resource loader must be non-null");
|
||||||
|
|
||||||
#if TARGET_OS_IPHONE
|
#if TARGET_OS_IPHONE
|
||||||
@@ -139,7 +123,7 @@ namespace thermion
|
|||||||
_engine = Engine::create(Engine::Backend::VULKAN, (backend::Platform *)platform, (void *)sharedContext, &config);
|
_engine = Engine::create(Engine::Backend::VULKAN, (backend::Platform *)platform, (void *)sharedContext, &config);
|
||||||
#else
|
#else
|
||||||
_engine = Engine::create(Engine::Backend::OPENGL, (backend::Platform *)platform, (void *)sharedContext, nullptr);
|
_engine = Engine::create(Engine::Backend::OPENGL, (backend::Platform *)platform, (void *)sharedContext, nullptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_renderer = _engine->createRenderer();
|
_renderer = _engine->createRenderer();
|
||||||
|
|
||||||
@@ -526,7 +510,8 @@ namespace thermion
|
|||||||
|
|
||||||
_views.clear();
|
_views.clear();
|
||||||
TRACE("Destroying render targets");
|
TRACE("Destroying render targets");
|
||||||
for(auto rt : _renderTargets) {
|
for (auto rt : _renderTargets)
|
||||||
|
{
|
||||||
destroyRenderTarget(rt);
|
destroyRenderTarget(rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -581,28 +566,38 @@ namespace thermion
|
|||||||
return swapChain;
|
return swapChain;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderTarget *FilamentViewer::createRenderTarget(intptr_t texture, uint32_t width, uint32_t height)
|
RenderTarget *FilamentViewer::createRenderTarget(intptr_t colorTexture, intptr_t depthTexture, uint32_t width, uint32_t height)
|
||||||
{
|
{
|
||||||
Log("Creating render target with size %d x %d", width, height);
|
TRACE("Creating render target with size %d x %d", width, height);
|
||||||
// Create filament textures and render targets (note the color buffer has the import call)
|
auto colorBuilder = filament::Texture::Builder()
|
||||||
auto rtColor = filament::Texture::Builder()
|
.width(width)
|
||||||
.width(width)
|
.height(height)
|
||||||
.height(height)
|
.levels(1)
|
||||||
.levels(1)
|
.usage(filament::Texture::Usage::COLOR_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE | filament::Texture::Usage::BLIT_SRC)
|
||||||
.usage(filament::Texture::Usage::COLOR_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE)
|
.format(filament::Texture::InternalFormat::RGBA8);
|
||||||
.format(filament::Texture::InternalFormat::RGBA8)
|
if (colorTexture != 0)
|
||||||
.import(texture)
|
{
|
||||||
.build(*_engine);
|
TRACE("Using imported color texture %d", colorTexture);
|
||||||
auto rtDepth = filament::Texture::Builder()
|
colorBuilder.import(colorTexture);
|
||||||
.width(width)
|
}
|
||||||
.height(height)
|
|
||||||
.levels(1)
|
auto color = colorBuilder.build(*_engine);
|
||||||
.usage(filament::Texture::Usage::DEPTH_ATTACHMENT | filament::Texture::Usage::STENCIL_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE)
|
auto depthBuilder = filament::Texture::Builder()
|
||||||
.format(filament::Texture::InternalFormat::DEPTH24_STENCIL8)
|
.width(width)
|
||||||
.build(*_engine);
|
.height(height)
|
||||||
|
.levels(1)
|
||||||
|
.usage(filament::Texture::Usage::DEPTH_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE)
|
||||||
|
.format(filament::Texture::InternalFormat::DEPTH32F);
|
||||||
|
if (depthTexture != 0)
|
||||||
|
{
|
||||||
|
TRACE("Using imported depth texture %d", depthTexture);
|
||||||
|
depthBuilder.import(depthTexture);
|
||||||
|
}
|
||||||
|
auto depth = depthBuilder.build(*_engine);
|
||||||
|
|
||||||
auto rt = filament::RenderTarget::Builder()
|
auto rt = filament::RenderTarget::Builder()
|
||||||
.texture(RenderTarget::AttachmentPoint::COLOR, rtColor)
|
.texture(RenderTarget::AttachmentPoint::COLOR, color)
|
||||||
.texture(RenderTarget::AttachmentPoint::DEPTH, rtDepth)
|
.texture(RenderTarget::AttachmentPoint::DEPTH, depth)
|
||||||
.build(*_engine);
|
.build(*_engine);
|
||||||
_renderTargets.push_back(rt);
|
_renderTargets.push_back(rt);
|
||||||
return rt;
|
return rt;
|
||||||
@@ -656,7 +651,7 @@ namespace thermion
|
|||||||
view->setLayerEnabled(SceneManager::LAYERS::BACKGROUND, true); // skybox + image
|
view->setLayerEnabled(SceneManager::LAYERS::BACKGROUND, true); // skybox + image
|
||||||
view->setLayerEnabled(SceneManager::LAYERS::OVERLAY, false); // world grid + gizmo
|
view->setLayerEnabled(SceneManager::LAYERS::OVERLAY, false); // world grid + gizmo
|
||||||
view->setBlendMode(filament::View::BlendMode::TRANSLUCENT);
|
view->setBlendMode(filament::View::BlendMode::TRANSLUCENT);
|
||||||
view->setStencilBufferEnabled(true);
|
view->setStencilBufferEnabled(false);
|
||||||
view->setAmbientOcclusionOptions({.enabled = false});
|
view->setAmbientOcclusionOptions({.enabled = false});
|
||||||
view->setDynamicResolutionOptions({.enabled = true});
|
view->setDynamicResolutionOptions({.enabled = true});
|
||||||
ACESToneMapper tm;
|
ACESToneMapper tm;
|
||||||
@@ -666,7 +661,7 @@ namespace thermion
|
|||||||
view->setStereoscopicOptions({.enabled = false});
|
view->setStereoscopicOptions({.enabled = false});
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
view->setBloomOptions({.strength = 0, .enabled=false });
|
view->setBloomOptions({.strength = 0, .enabled = false});
|
||||||
view->setShadowingEnabled(false);
|
view->setShadowingEnabled(false);
|
||||||
view->setScreenSpaceRefractionEnabled(false);
|
view->setScreenSpaceRefractionEnabled(false);
|
||||||
view->setPostProcessingEnabled(false);
|
view->setPostProcessingEnabled(false);
|
||||||
@@ -894,41 +889,50 @@ namespace thermion
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilamentViewer::setRenderable(View* view, SwapChain* swapChain, bool renderable) {
|
void FilamentViewer::setRenderable(View *view, SwapChain *swapChain, bool renderable)
|
||||||
|
{
|
||||||
|
|
||||||
std::lock_guard lock(_renderMutex);
|
std::lock_guard lock(_renderMutex);
|
||||||
|
|
||||||
auto views = _renderable[swapChain];
|
auto views = _renderable[swapChain];
|
||||||
|
|
||||||
auto it = std::find(views.begin(), views.end(), view);
|
auto it = std::find(views.begin(), views.end(), view);
|
||||||
|
|
||||||
if(renderable) {
|
if (renderable)
|
||||||
if(it == views.end()) {
|
{
|
||||||
views.push_back(view);
|
if (it == views.end())
|
||||||
}
|
{
|
||||||
} else {
|
views.push_back(view);
|
||||||
if(it != views.end()) {
|
}
|
||||||
views.erase(it);
|
}
|
||||||
}
|
else
|
||||||
}
|
{
|
||||||
_renderable[swapChain] = views;
|
if (it != views.end())
|
||||||
|
{
|
||||||
|
views.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_renderable[swapChain] = views;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FilamentViewer::render(
|
void FilamentViewer::render(
|
||||||
uint64_t frameTimeInNanos)
|
uint64_t frameTimeInNanos)
|
||||||
{
|
{
|
||||||
|
|
||||||
_sceneManager->update();
|
_sceneManager->update();
|
||||||
|
|
||||||
for(auto swapChain : _swapChains) {
|
for (auto swapChain : _swapChains)
|
||||||
|
{
|
||||||
auto views = _renderable[swapChain];
|
auto views = _renderable[swapChain];
|
||||||
if(views.size() > 0) {
|
if (views.size() > 0)
|
||||||
|
{
|
||||||
bool beginFrame = _renderer->beginFrame(swapChain, frameTimeInNanos);
|
bool beginFrame = _renderer->beginFrame(swapChain, frameTimeInNanos);
|
||||||
if (beginFrame) {
|
if (beginFrame)
|
||||||
for(auto view : views) {
|
{
|
||||||
|
for (auto view : views)
|
||||||
|
{
|
||||||
_renderer->render(view);
|
_renderer->render(view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_renderer->endFrame();
|
_renderer->endFrame();
|
||||||
}
|
}
|
||||||
@@ -948,13 +952,14 @@ namespace thermion
|
|||||||
|
|
||||||
void FilamentViewer::capture(View *view, uint8_t *out, bool useFence, SwapChain *swapChain, void (*onComplete)())
|
void FilamentViewer::capture(View *view, uint8_t *out, bool useFence, SwapChain *swapChain, void (*onComplete)())
|
||||||
{
|
{
|
||||||
|
|
||||||
Viewport const &vp = view->getViewport();
|
Viewport const &vp = view->getViewport();
|
||||||
size_t pixelBufferSize = vp.width * vp.height * 4;
|
size_t pixelBufferSize = vp.width * vp.height * 4;
|
||||||
auto callback = [](void *buf, size_t size, void *data)
|
auto callback = [](void *buf, size_t size, void *data)
|
||||||
{
|
{
|
||||||
auto frameCallbackData = (std::vector<void *> *)data;
|
auto frameCallbackData = (std::vector<void *> *)data;
|
||||||
void *callbackPtr = frameCallbackData->at(1);
|
void *callbackPtr = frameCallbackData->at(1);
|
||||||
|
|
||||||
delete frameCallbackData;
|
delete frameCallbackData;
|
||||||
if (callbackPtr)
|
if (callbackPtr)
|
||||||
{
|
{
|
||||||
@@ -997,22 +1002,15 @@ namespace thermion
|
|||||||
void FilamentViewer::capture(View *view, uint8_t *out, bool useFence, SwapChain *swapChain, RenderTarget *renderTarget, void (*onComplete)())
|
void FilamentViewer::capture(View *view, uint8_t *out, bool useFence, SwapChain *swapChain, RenderTarget *renderTarget, void (*onComplete)())
|
||||||
{
|
{
|
||||||
|
|
||||||
if(swapChain && !_engine->isValid(swapChain)) {
|
if (_imageEntity.isNull())
|
||||||
Log("SwapChain exists, but is not valid");
|
{
|
||||||
return;
|
TRACE("NO IMAGE");
|
||||||
}
|
|
||||||
|
|
||||||
int i =0 ;
|
|
||||||
for(auto sc : _swapChains) {
|
|
||||||
if(sc == swapChain) {
|
|
||||||
Log("Using swapchain at index %d", i);
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Viewport const &vp = view->getViewport();
|
Viewport const &vp = view->getViewport();
|
||||||
|
|
||||||
size_t pixelBufferSize = vp.width * vp.height * 4;
|
size_t pixelBufferSize = vp.width * vp.height * 4;
|
||||||
|
|
||||||
auto callback = [](void *buf, size_t size, void *data)
|
auto callback = [](void *buf, size_t size, void *data)
|
||||||
{
|
{
|
||||||
auto frameCallbackData = (std::vector<void *> *)data;
|
auto frameCallbackData = (std::vector<void *> *)data;
|
||||||
@@ -1025,12 +1023,7 @@ namespace thermion
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create a fence
|
Fence *fence = useFence ? _engine->createFence() : nullptr;
|
||||||
Fence *fence = nullptr;
|
|
||||||
if (useFence)
|
|
||||||
{
|
|
||||||
fence = _engine->createFence();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto userData = new std::vector<void *>{out, (void *)onComplete};
|
auto userData = new std::vector<void *>{out, (void *)onComplete};
|
||||||
|
|
||||||
@@ -1040,7 +1033,11 @@ namespace thermion
|
|||||||
out, pixelBufferSize,
|
out, pixelBufferSize,
|
||||||
Texture::Format::RGBA,
|
Texture::Format::RGBA,
|
||||||
Texture::Type::UBYTE, dispatcher, callback, userData);
|
Texture::Type::UBYTE, dispatcher, callback, userData);
|
||||||
_renderer->beginFrame(swapChain, 0);
|
|
||||||
|
_renderer->beginFrame(
|
||||||
|
swapChain,
|
||||||
|
0);
|
||||||
|
|
||||||
_renderer->render(view);
|
_renderer->render(view);
|
||||||
_renderer->readPixels(renderTarget, 0, 0, vp.width, vp.height, std::move(pbd));
|
_renderer->readPixels(renderTarget, 0, 0, vp.width, vp.height, std::move(pbd));
|
||||||
_renderer->endFrame();
|
_renderer->endFrame();
|
||||||
@@ -1057,10 +1054,4 @@ namespace thermion
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Camera *FilamentViewer::getCamera(EntityId entity)
|
|
||||||
{
|
|
||||||
return _engine->getCameraComponent(Entity::import(entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace thermion
|
} // namespace thermion
|
||||||
|
|||||||
Reference in New Issue
Block a user