Commit for 2023.01.06 12-19-28.7z

This commit is contained in:
mrq 2023-01-06 12:19:00 -06:00
parent 28cf6a7d8f
commit f3800abb21
20 changed files with 262 additions and 74 deletions

View File

@ -1,7 +1,7 @@
{
"engine": {
"scenes": {
"start": "SourceEngine",
"start": "StartMenu",
"matrix": { "reverseInfinite": true },
"meshes": { "interleaved": false },
"lights": { "enabled": true,
@ -54,7 +54,7 @@
"samples": 1,
"paths": 2,
"frameAccumulationMinimum": 0,
"readyTimer": 2
"readyTimer": 3
}
},
"graph": {
@ -64,7 +64,7 @@
"vulkan": {
"version": 1.3,
"validation": {
"enabled": true,
"enabled": false,
"messages": false,
"checkpoints": false,
"filters": [
@ -102,7 +102,7 @@
"invariant": {
"default stage buffers": true,
"default defer buffer destroy": true,
"default command buffer immediate": false,
"default command buffer immediate": true,
"multithreaded recording": true
},
"pipelines": {
@ -114,7 +114,7 @@
"bloom": true,
"rt": true,
"fsr": false,
"postProcess": false
"postProcess": false // "postProcess.chromab" // false
},
"formats": {
"depth": "D32_SFLOAT",
@ -153,7 +153,7 @@
"VK_EXT_memory_budget"
,"VK_EXT_descriptor_indexing"
,"VK_KHR_buffer_device_address"
// ,"VK_NV_device_diagnostic_checkpoints"
,"VK_NV_device_diagnostic_checkpoints"
]
},
"features": [

View File

@ -19,7 +19,7 @@
},
"info_player_spawn": { "action": "attach", "filename": "./player.json", "transform": { "orientation": [ 0, 1, 0, 0 ] } },
"light_environment": { "transform": { "orientation": [0,0,0,1] }, "light": {
"color": [0.1, 0.1, 0.1],
// "color": [0.1, 0.1, 0.1],
"power": 10000,
"global": true,
"bias": {

View File

@ -0,0 +1,80 @@
#version 450
#pragma shader_stage(fragment)
#extension GL_EXT_samplerless_texture_functions : require
layout (location = 0) in vec2 inUv;
layout (location = 1) flat in uint inPass;
layout (location = 0) out vec4 outColor;
layout (binding = 0) uniform sampler2D samplerColor;
layout (binding = 1) uniform UBO {
float curTime;
float gamma;
float exposure;
uint padding;
} ubo;
#define TONE_MAP 1
#define GAMMA_CORRECT 1
#define TEXTURES 1
#include "../../common/macros.h"
#include "../../common/structs.h"
#include "../../common/functions.h"
vec2 barrelDistortion(vec2 coord, float amt) {
vec2 cc = coord - 0.5;
float dist = dot(cc, cc);
return coord + cc * dist * amt;
}
float sat( float t ) {
return clamp( t, 0.0, 1.0 );
}
float linterp( float t ) {
return sat( 1.0 - abs( 2.0*t - 1.0 ) );
}
float remap( float t, float a, float b ) {
return sat( (t - a) / (b - a) );
}
vec4 spectrumOffset( float t ) {
vec4 ret;
float lo = step(t,0.5);
float hi = 1.0-lo;
float w = linterp( remap( t, 1.0/6.0, 5.0/6.0 ) );
ret = vec4(lo,1.0,hi, 1.) * vec4(1.0-w, w, 1.0-w, 1.);
return pow( ret, vec4(1.0/2.2) );
}
const float MAX_DISTORT = 0.125;
const int ITERATIONS = 32;
const float ITERATIONS_RECIP = 1.0 / float(ITERATIONS);
void main() {
const vec2 screenResolution = textureSize( samplerColor, 0 );
const vec2 uv = (inUv.xy); // * 2.0 - 1.0);
vec4 colorSigma = vec4(0.0);
vec4 wSigma = vec4(0.0);
for ( uint i=0; i < ITERATIONS;++i ) {
float t = float(i) * ITERATIONS_RECIP;
vec4 w = spectrumOffset( t );
wSigma += w;
colorSigma += w * texture(samplerColor, barrelDistortion(uv, MAX_DISTORT * t * 0.6 ));
}
outColor = colorSigma / wSigma;
#if TONE_MAP
toneMap(outColor, ubo.exposure);
#endif
#if GAMMA_CORRECT
gammaCorrect(outColor, ubo.gamma);
#endif
}

View File

@ -10,7 +10,7 @@
#include <uf/utils/memory/map.h>
#include <uf/ext/xatlas/xatlas.h>
#include <uf/ext/ffx/fsr.h>
#include <uf/ext/ext.h>
#if UF_ENV_DREAMCAST
#define UF_DEBUG_TIMER_MULTITRACE_START(...) UF_TIMER_MULTITRACE_START(__VA_ARGS__)
@ -374,9 +374,9 @@ void uf::graph::initializeGraphics( pod::Graph& graph, uf::Object& entity, uf::M
}
{
size_t maxTextures = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxCubemaps = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
size_t maxTextures = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxCubemaps = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
auto& shader = graphic.material.getShader("fragment", "baking");
shader.setSpecializationConstants({
@ -1553,6 +1553,30 @@ void uf::graph::tick() {
if ( rebuild ) {
UF_MSG_DEBUG("Graph buffers requesting renderer update");
uf::renderer::states::rebuild = true;
/*
if ( uf::renderer::hasRenderMode("", true) ) {
auto& renderMode = uf::renderer::getRenderMode("", true);
auto& blitter = renderMode.getBlitter();
auto& shader = blitter.material.getShader(blitter.material.hasShader("compute", "deferred") ? "compute" : "fragment", "deferred");
blitter.material.textures.clear();
auto moved = std::move( shader.buffers );
for ( auto& buffer : moved ) {
if ( buffer.aliased ) continue;
shader.buffers.emplace_back( buffer );
buffer.aliased = true;
}
shader.buffers.emplace_back( uf::graph::storage.buffers.drawCommands.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.instance.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.instanceAddresses.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.material.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.texture.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.light.alias() );
}
*/
}
}
void uf::graph::render() {

View File

@ -214,6 +214,9 @@ uf::Scene& uf::scene::loadScene( const uf::stl::string& name, const uf::stl::str
const uf::stl::string filename = _filename != "" ? _filename : (uf::stl::string("/") + uf::string::lowercase(name) + "/scene.json");
#endif
scene->load(filename);
auto& metadataJson = scene->getComponent<uf::Serializer>();
metadataJson["system"]["scene"] = name;
#if UF_USE_VULKAN
if ( uf::renderer::settings::pipelines::rt ) uf::instantiator::bind( "RayTraceSceneBehavior", *scene );
if ( uf::renderer::settings::pipelines::vxgi ) uf::instantiator::bind( "VoxelizerSceneBehavior", *scene );
@ -229,6 +232,9 @@ uf::Scene& uf::scene::loadScene( const uf::stl::string& name, const uf::Serializ
uf::Scene* scene = uf::instantiator::objects->has( name ) ? (uf::Scene*) &uf::instantiator::instantiate( name ) : new uf::Scene;
uf::scene::scenes.emplace_back( scene );
if ( data != "" ) scene->load(data);
auto& metadataJson = scene->getComponent<uf::Serializer>();
metadataJson["system"]["scene"] = name;
#if UF_USE_VULKAN
if ( uf::renderer::settings::pipelines::rt ) uf::instantiator::bind( "RayTraceSceneBehavior", *scene );
if ( uf::renderer::settings::pipelines::vxgi ) uf::instantiator::bind( "VoxelizerSceneBehavior", *scene );
@ -250,6 +256,14 @@ void uf::scene::unloadScene() {
auto graph = current->getGraph(true);
for ( auto entity : graph ) entity->destroy();
*/
auto graph = current->getGraph(true);
for ( auto entity : graph ) {
if ( !entity->hasComponent<uf::renderer::RenderTargetRenderMode>() ) continue;
auto& renderMode = entity->getComponent<uf::renderer::RenderTargetRenderMode>();
uf::renderer::removeRenderMode( &renderMode, false );
}
uf::scene::scenes.pop_back();
}
uf::Scene& uf::scene::getCurrentScene() {

View File

@ -244,6 +244,15 @@ void ext::reactphysics::tick( float delta ) {
}
void ext::reactphysics::terminate() {
if ( !::world ) return;
size_t count = ::world->getNbRigidBodies();
for ( size_t i = 0; i < count; ++i ) {
auto* body = ::world->getRigidBody(i); if ( !body ) continue;
uf::Object* object = (uf::Object*) body->getUserData(); if ( !object || !object->isValid() ) continue;
auto& state = object->getComponent<pod::PhysicsState>(); // if ( !state.shared ) continue;
state.body = NULL;
}
::common.destroyPhysicsWorld(::world);
::world = NULL;
}

View File

@ -210,7 +210,7 @@ bool ext::vulkan::Buffer::update( const void* data, VkDeviceSize length, bool st
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
);
auto commandBuffer = device->fetchCommandBuffer(QueueEnum::TRANSFER, false); // waits on finish
auto commandBuffer = device->fetchCommandBuffer(QueueEnum::TRANSFER); // waits on finish
VkBufferCopy region = {};
region.size = length;
device->UF_CHECKPOINT_MARK( commandBuffer, pod::Checkpoint::GENERIC, "copyBuffer" );

View File

@ -681,6 +681,7 @@ VkFence ext::vulkan::Device::getFence() {
return fence;
}
void ext::vulkan::Device::destroyFence( VkFence fence ) {
// vkDestroyFence( this->logicalDevice, fence, nullptr );
VK_CHECK_RESULT(vkResetFences( this->logicalDevice, 1, &fence ) );
this->reusable.fences.emplace( fence );
}

View File

@ -880,7 +880,7 @@ void ext::vulkan::Pipeline::update( const Graphic& graphic, const GraphicDescrip
}
// really needs some love
if ( this->metadata.built ) {
// renderMode.synchronize();
renderMode.synchronize();
bool locked = renderMode.tryMutex();
renderMode.rebuild = true;
// uf::renderer::flushCommandBuffers();

View File

@ -420,11 +420,9 @@ void ext::vulkan::RenderMode::initialize( Device& device ) {
}
void ext::vulkan::RenderMode::tick() {
/*
if ( ext::vulkan::states::resized || uf::renderer::states::rebuild || rebuild ) {
cleanupAllCommands();
}
*/
this->synchronize();
if ( metadata.limiter.frequency > 0 ) {

View File

@ -13,6 +13,7 @@
#include <uf/ext/vulkan/graphic.h>
#include <uf/engine/graph/graph.h>
#include <uf/ext/ext.h>
#define BARYCENTRIC 0
#if BARYCENTRIC
@ -216,9 +217,11 @@ void ext::vulkan::DeferredRenderMode::initialize( Device& device ) {
{
uf::stl::string vertexShaderFilename = uf::io::root+"/shaders/display/renderTarget/vert.spv";
uf::stl::string fragmentShaderFilename = uf::io::root+"/shaders/display/renderTarget/frag.spv";
uf::stl::string postProcess = ::fmt::format("{}.frag", metadata.json["postProcess"].as<uf::stl::string>("postProcess"));
{
std::pair<bool, uf::stl::string> settings[] = {
{ settings::pipelines::postProcess /*&& !settings::pipelines::rt*/, "postProcess.frag" },
{ settings::pipelines::postProcess /*&& !settings::pipelines::rt*/, postProcess },
// { msaa > 1, "msaa.frag" },
};
FOR_ARRAY( settings ) if ( settings[i].first ) fragmentShaderFilename = uf::string::replace( fragmentShaderFilename, "frag", settings[i].second );
@ -264,11 +267,11 @@ void ext::vulkan::DeferredRenderMode::initialize( Device& device ) {
auto& shader = blitter.material.getShader(DEFERRED_MODE, "deferred");
size_t maxLights = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
shader.setSpecializationConstants({
{ "TEXTURES", maxTextures2D },
@ -498,6 +501,24 @@ void ext::vulkan::DeferredRenderMode::tick() {
}
// update blitter descriptor set
if ( rebuild && blitter.initialized ) {
if ( true ) {
auto& shader = blitter.material.getShader(DEFERRED_MODE, "deferred");
auto moved = std::move( shader.buffers );
for ( auto& buffer : moved ) {
if ( buffer.aliased ) continue;
shader.buffers.emplace_back( buffer );
buffer.aliased = true;
}
shader.buffers.emplace_back( uf::graph::storage.buffers.drawCommands.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.instance.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.instanceAddresses.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.material.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.texture.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.light.alias() );
}
if ( blitter.hasPipeline( blitter.descriptor ) ){
blitter.getPipeline( blitter.descriptor ).update( blitter, blitter.descriptor );
} else {
@ -652,7 +673,7 @@ void ext::vulkan::DeferredRenderMode::createCommandBuffers( const uf::stl::vecto
}
}
}
bool shouldRecord = true; // ( settings::pipelines::rt && !sceneMetadataJson["system"]["config"]["engine"]["scenes"]["rt"]["full"].as<bool>() ) || !settings::pipelines::rt;
bool shouldRecord = true; // ( settings::pipelines::rt && !ext::config["engine"]["scenes"]["rt"]["full"].as<bool>() ) || !settings::pipelines::rt;
for (size_t i = 0; i < commands.size(); ++i) {
auto commandBuffer = commands[i];
VK_CHECK_RESULT( vkBeginCommandBuffer(commandBuffer, &cmdBufInfo) );

View File

@ -9,6 +9,7 @@
#include <uf/ext/vulkan/graphic.h>
#include <uf/engine/graph/graph.h>
#include <uf/utils/camera/camera.h>
#include <uf/ext/ext.h>
const uf::stl::string ext::vulkan::RenderTargetRenderMode::getType() const {
return "RenderTarget";
@ -301,8 +302,10 @@ void ext::vulkan::RenderTargetRenderMode::initialize( Device& device ) {
} else {
uf::stl::string vertexShaderFilename = uf::io::root+"/shaders/display/renderTarget/vert.spv";
uf::stl::string fragmentShaderFilename = uf::io::root+"/shaders/display/renderTarget/frag.spv"; {
uf::stl::string postProcess = ::fmt::format("{}.frag", metadata.json["postProcess"].as<uf::stl::string>("postProcess"));
std::pair<bool, uf::stl::string> settings[] = {
{ settings::pipelines::postProcess, "postProcess.frag" },
{ settings::pipelines::postProcess, postProcess },
// { msaa > 1, "msaa.frag" },
};
FOR_ARRAY( settings ) if ( settings[i].first ) fragmentShaderFilename = uf::string::replace( fragmentShaderFilename, "frag", settings[i].second );
@ -318,11 +321,11 @@ void ext::vulkan::RenderTargetRenderMode::initialize( Device& device ) {
auto& shader = blitter.material.getShader("compute");
size_t maxLights = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
shader.setSpecializationConstants({
{ "TEXTURES", maxTextures2D },

View File

@ -573,7 +573,7 @@ void ext::vulkan::Texture::fromBuffers(
VK_CHECK_RESULT(vkCreateImageView(device.logicalDevice, &viewCreateInfo, nullptr, &view));
{
auto commandBuffer = device.fetchCommandBuffer(uf::renderer::QueueEnum::GRAPHICS, true);
auto commandBuffer = device.fetchCommandBuffer(uf::renderer::QueueEnum::GRAPHICS);
device.UF_CHECKPOINT_MARK( commandBuffer, pod::Checkpoint::GENERIC, "setImageLayout" );
uf::renderer::Texture::setImageLayout( commandBuffer, image, VK_IMAGE_LAYOUT_UNDEFINED, (this->imageLayout = imageLayout), viewCreateInfo.subresourceRange );
device.flushCommandBuffer(commandBuffer);

View File

@ -140,6 +140,7 @@ VKAPI_ATTR VkBool32 VKAPI_CALL ext::vulkan::debugCallback(
}
uf::stl::string ext::vulkan::retrieveCheckpoint( VkQueue queue ) {
if ( !ext::vulkan::settings::validation::checkpoints || !vkGetQueueCheckpointDataNV ) return "";
uint32_t size = 0;
vkGetQueueCheckpointDataNV(queue, &size, 0);
@ -183,7 +184,7 @@ uf::stl::string ext::vulkan::errorString( VkResult result ) {
STR(ERROR_INVALID_SHADER_NV);
#undef STR
default:
return "UNKNOWN_ERROR";
return ::fmt::format("UNKNOWN_ERROR: {}", result);
}
}
VkSampleCountFlagBits ext::vulkan::sampleCount( uint8_t count ) {
@ -614,8 +615,21 @@ void ext::vulkan::flushCommandBuffers() {
auto queue = device.getQueue( queueType, threadId );
VkResult res = vkWaitForFences( device, tuple.fences.size(), tuple.fences.data(), VK_TRUE, VK_DEFAULT_FENCE_TIMEOUT );
VK_CHECK_QUEUE_CHECKPOINT( queue, res );
// AMD driver has a limitation on how many fences to wait on at once
constexpr size_t totalFences = 64;
if ( tuple.fences.size() < totalFences ) {
VkResult res = vkWaitForFences( device, tuple.fences.size(), tuple.fences.data(), VK_TRUE, VK_DEFAULT_FENCE_TIMEOUT );
VK_CHECK_QUEUE_CHECKPOINT( queue, res );
} else {
auto it = tuple.fences.begin();
auto end = tuple.fences.end();
while ( it != end ) {
size_t advance = MIN(end - it, totalFences);
VkResult res = vkWaitForFences( device, advance, &(*it), VK_TRUE, VK_DEFAULT_FENCE_TIMEOUT );
VK_CHECK_QUEUE_CHECKPOINT( queue, res );
it += advance;
}
}
for ( auto& commandBuffer : tuple.commandBuffers ) {
uf::checkpoint::deallocate(device.checkpoints[commandBuffer]);

View File

@ -56,7 +56,7 @@ void ext::LightBehavior::initialize( uf::Object& self ) {
#if UF_USE_OPENGL
metadataJson["light"]["shadows"] = false;
#endif
if ( !sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["shadows"]["enabled"].as<bool>(true) ) {
if ( !sceneMetadataJson["lights"]["shadows"]["enabled"].as<bool>(true) ) {
metadataJson["light"]["shadows"] = false;
}
if ( metadataJson["light"]["shadows"].as<bool>() ) {
@ -236,6 +236,7 @@ void ext::LightBehavior::render( uf::Object& self ){}
void ext::LightBehavior::destroy( uf::Object& self ){
if ( this->hasComponent<uf::renderer::RenderTargetRenderMode>() ) {
auto& renderMode = this->getComponent<uf::renderer::RenderTargetRenderMode>();
uf::renderer::removeRenderMode( &renderMode, false );
this->deleteComponent<uf::renderer::RenderTargetRenderMode>();
}

View File

@ -188,11 +188,11 @@ void ext::RayTraceSceneBehavior::tick( uf::Object& self ) {
//
auto& scene = uf::scene::getCurrentScene();
auto& sceneMetadataJson = scene.getComponent<uf::Serializer>();
size_t maxLights = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
shader.buffers.emplace_back( uf::graph::storage.buffers.instance.alias() );
shader.buffers.emplace_back( uf::graph::storage.buffers.instanceAddresses.alias() );

View File

@ -128,6 +128,7 @@ void ext::ExtSceneBehavior::initialize( uf::Object& self ) {
uf::hooks.call("window:Mouse.CursorVisibility", payload);
uf::hooks.call("window:Mouse.Lock");
}
auto& sceneTextures = this->getComponent<pod::SceneTextures>();
// initialize perlin noise
#if UF_USE_VULKAN
@ -208,6 +209,14 @@ void ext::ExtSceneBehavior::initialize( uf::Object& self ) {
}
}
#endif
if ( false ) {
uf::physics::terminate();
uf::graph::destroy();
uf::physics::initialize();
uf::graph::initialize();
}
}
void ext::ExtSceneBehavior::tick( uf::Object& self ) {
// auto& assetLoader = this->getComponent<uf::asset>();

View File

@ -254,6 +254,7 @@ void ext::VoxelizerSceneBehavior::destroy( uf::Object& self ){
#if UF_USE_VULKAN
if ( this->hasComponent<uf::renderer::RenderTargetRenderMode>() ) {
auto& renderMode = this->getComponent<uf::renderer::RenderTargetRenderMode>();
uf::renderer::removeRenderMode( &renderMode, false );
this->deleteComponent<uf::renderer::RenderTargetRenderMode>();
}

View File

@ -254,7 +254,7 @@ void EXT_API ext::load( ext::json::Value& json ) {
uf::renderer::settings::defaultDeferBufferDestroy = configRenderInvariantJson["default defer buffer destroy"].as( uf::renderer::settings::defaultDeferBufferDestroy );
#if 1
uf::renderer::settings::defaultCommandBufferImmediate = true;
::requestDeferredCommandBufferSubmit = configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
::requestDeferredCommandBufferSubmit = !configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
#else
uf::renderer::settings::defaultCommandBufferImmediate = configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
#endif
@ -412,7 +412,7 @@ void EXT_API ext::initialize() {
uf::Scene& scene = uf::instantiator::instantiate<uf::Scene>(); //new uf::Scene;
uf::scene::scenes.emplace_back(&scene);
auto& metadata = scene.getComponent<uf::Serializer>();
metadata["system"]["config"] = ::json;
// metadata["system"]["config"] = ::json;
}
ext::load( ::json );
@ -499,6 +499,10 @@ void EXT_API ext::initialize() {
uf::renderer::settings::pipelines::bloom = configRenderPipelinesJson["bloom"].as( uf::renderer::settings::pipelines::bloom );
uf::renderer::settings::pipelines::rt = configRenderPipelinesJson["rt"].as( uf::renderer::settings::pipelines::rt );
uf::renderer::settings::pipelines::postProcess = configRenderPipelinesJson["postProcess"].as( uf::renderer::settings::pipelines::postProcess );
if ( configRenderPipelinesJson["postProcess"].is<uf::stl::string>() ) {
uf::renderer::settings::pipelines::postProcess = true;
}
#if UF_USE_FFX_FSR
uf::renderer::settings::pipelines::fsr = configRenderPipelinesJson["fsr"].as( uf::renderer::settings::pipelines::fsr );
@ -566,6 +570,9 @@ void EXT_API ext::initialize() {
if ( ::json["engine"]["render modes"]["deferred"].as<bool>(true) ) {
auto* renderMode = new uf::renderer::DeferredRenderMode;
if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
renderMode->metadata.json["postProcess"] = ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
renderMode->blitter.descriptor.renderMode = "Swapchain";
renderMode->blitter.descriptor.subpass = 0;
#if UF_USE_FFX_FSR
@ -606,6 +613,9 @@ void EXT_API ext::initialize() {
if ( ::json["engine"]["render modes"]["gui"].as<bool>(true) ) {
auto* renderMode = new uf::renderer::RenderTargetRenderMode;
if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
renderMode->metadata.json["postProcess"] = ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
uf::stl::string name = "Gui";
renderMode->blitter.descriptor.renderMode = "Swapchain";
renderMode->blitter.descriptor.subpass = 0;
@ -705,11 +715,8 @@ void EXT_API ext::initialize() {
uf::hooks.addHook( "game:Scene.Load", [&](ext::json::Value& json){
auto function = [json](){
uf::hooks.call("game:Scene.Cleanup");
/*
auto& scene = uf::scene::loadScene( json["scene"].as<uf::stl::string>() );
auto& metadata = scene.getComponent<uf::Serializer>();
metadata["system"]["config"] = ::json;
*/
};
@ -718,31 +725,30 @@ void EXT_API ext::initialize() {
});
uf::hooks.addHook( "game:Scene.Cleanup", [&](){
if ( ::requestDedicatedRenderThread ) {
::requestDedicatedRenderThread = true;
uf::renderer::settings::experimental::dedicatedThread = false;
}
if ( ::requestDeferredCommandBufferSubmit ) {
::requestDeferredCommandBufferSubmit = true;
uf::renderer::settings::defaultCommandBufferImmediate = true;
}
uf::renderer::synchronize();
uf::renderer::flushCommandBuffers();
uf::scene::unloadScene();
/*
// do GC
{
size_t collected = uf::instantiator::collect( ::config.engine.gc.mode );
if ( collected > 0 ) {
if ( ::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
// uf::renderer::states::rebuild = true;
uf::renderer::states::rebuild = true;
}
}
// reset physics world
{
uf::physics::terminate();
uf::physics::initialize();
}
// reset graph state
{
uf::graph::destroy();
uf::graph::initialize();
}
uf::renderer::states::rebuild = true;
uf::renderer::tick();
uf::renderer::synchronize();
*/
});
#endif
uf::hooks.addHook( "game:Scene.Load", [&](ext::json::Value& json){
@ -765,7 +771,6 @@ void EXT_API ext::initialize() {
*/
auto& scene = uf::scene::loadScene( ::json["engine"]["scenes"]["start"] );
auto& metadata = scene.getComponent<uf::Serializer>();
metadata["system"]["config"] = ::json;
}
/*
@ -780,43 +785,51 @@ void EXT_API ext::initialize() {
}
void EXT_API ext::tick() {
#if 1
if ( !ext::json::isNull( ::sceneTransition ) ) {
auto target = ::sceneTransition["scene"].as<uf::stl::string>();
::sceneTransition = ext::json::null();
UF_MSG_DEBUG("STARTING SCENE TRANSITION: {}", target);
/*
if ( ::requestDedicatedRenderThread ) {
::requestDedicatedRenderThread = true;
uf::renderer::settings::experimental::dedicatedThread = false;
}
if ( ::requestDeferredCommandBufferSubmit ) {
::requestDeferredCommandBufferSubmit = true;
uf::renderer::settings::defaultCommandBufferImmediate = true;
}
uf::renderer::synchronize();
uf::renderer::flushCommandBuffers();
uf::scene::unloadScene();
/*
// do GC
{
size_t collected = uf::instantiator::collect( ::config.engine.gc.mode );
if ( collected > 0 ) {
if ( ::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
// uf::renderer::states::rebuild = true;
uf::renderer::states::rebuild = true;
}
}
// reset physics world
{
uf::physics::terminate();
uf::physics::initialize();
}
// reset graph state
{
uf::graph::destroy();
uf::graph::initialize();
}
*/
auto& scene = uf::scene::loadScene( target );
auto& metadata = scene.getComponent<uf::Serializer>();
metadata["system"]["config"] = ::json;
// metadata["system"]["config"] = ::json;
::sceneTransition = ext::json::null();
UF_MSG_DEBUG("FINISHED SCENE TRANSITION: {}", target);
uf::physics::terminate();
uf::graph::destroy();
uf::physics::initialize();
uf::graph::initialize();
}
#endif
/* Tick controllers */ {
spec::controller::tick();