diff --git a/data/editor/icons/material.png b/data/editor/icons/material.png new file mode 100644 index 000000000..16728806a Binary files /dev/null and b/data/editor/icons/material.png differ diff --git a/data/editor/icons/material.svg b/data/editor/icons/material.svg new file mode 100644 index 000000000..7ba88f46c --- /dev/null +++ b/data/editor/icons/material.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/editor/icons/material_light.png b/data/editor/icons/material_light.png new file mode 100644 index 000000000..4191ce5d1 Binary files /dev/null and b/data/editor/icons/material_light.png differ diff --git a/data/editor/icons/meshSource.png b/data/editor/icons/meshSource.png new file mode 100644 index 000000000..eec21ebb5 Binary files /dev/null and b/data/editor/icons/meshSource.png differ diff --git a/data/editor/icons/meshSource.svg b/data/editor/icons/meshSource.svg new file mode 100644 index 000000000..6fa027ff6 --- /dev/null +++ b/data/editor/icons/meshSource.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/editor/icons/meshSource_light.png b/data/editor/icons/meshSource_light.png new file mode 100644 index 000000000..18b8ae6ad Binary files /dev/null and b/data/editor/icons/meshSource_light.png differ diff --git a/data/shader/globals.hsh b/data/shader/globals.hsh index 1f163e6c6..73d7bccbc 100644 --- a/data/shader/globals.hsh +++ b/data/shader/globals.hsh @@ -34,5 +34,5 @@ layout(set = 0, binding = 3) uniform texture2D bindlessTextures[TEXTURE_COUNT]; layout(set = 1, binding = 12) uniform sampler2D dfgTexture; -// Binding 2 is taken by materials buffer in common/material.hsh layout(set = 1, binding = 13) uniform sampler bindlessSampler; +layout(set = 1, binding = 15) uniform sampler bindlessNearestSampler; \ No newline at end of file diff --git a/data/shader/reflection/rtreflection.csh b/data/shader/reflection/rtreflection.csh index 23015618c..66efc078f 100644 --- a/data/shader/reflection/rtreflection.csh +++ b/data/shader/reflection/rtreflection.csh @@ -48,7 +48,7 @@ layout(std140, set = 3, binding = 9) uniform UniformBuffer { float bias; int textureLevel; float roughnessCutoff; - float padding; + int halfRes; ivec2 resolution; Shadow shadow; } uniforms; @@ -74,8 +74,12 @@ void main() { float depth = texelFetch(depthTexture, pixel, 0).r; - vec2 recontructTexCoord = (2.0 * (vec2(pixel)) + offset + 0.5) / (2.0 * vec2(resolution)); - //vec2 recontructTexCoord = (2.0 * vec2(pixel) + 0.5) / (2.0 * vec2(resolution)); + vec2 recontructTexCoord; + if (uniforms.halfRes > 0) + recontructTexCoord = (2.0 * (vec2(pixel)) + offset + 0.5) / (2.0 * vec2(resolution)); + else + recontructTexCoord = (vec2(pixel) + 0.5) / (vec2(resolution)); + vec3 viewPos = ConvertDepthToViewSpace(depth, recontructTexCoord); vec3 worldPos = vec3(globalData.ivMatrix * vec4(viewPos, 1.0)); vec3 viewVec = vec3(globalData.ivMatrix * vec4(viewPos, 0.0)); diff --git a/data/shader/rtgi/rtgi.csh b/data/shader/rtgi/rtgi.csh index 0f5b6796f..4155f9239 100644 --- a/data/shader/rtgi/rtgi.csh +++ b/data/shader/rtgi/rtgi.csh @@ -35,9 +35,6 @@ layout(set = 3, binding = 6) uniform sampler2DArrayShadow cascadeMaps; layout(set = 3, binding = 7) uniform sampler2D scramblingRankingTexture; layout(set = 3, binding = 8) uniform sampler2D sobolSequenceTexture; -#undef USE_SHADOW_MAP -#define OPACITY_CHECK - const ivec2 offsets[4] = ivec2[4]( ivec2(0, 0), ivec2(1, 0), @@ -51,7 +48,7 @@ layout(std140, set = 3, binding = 9) uniform UniformBuffer { float bias; int textureLevel; float roughnessCutoff; - float padding; + int halfRes; ivec2 resolution; Shadow shadow; } uniforms; @@ -77,8 +74,12 @@ void main() { float depth = texelFetch(depthTexture, pixel, 0).r; - // vec2 recontructTexCoord = (2.0 * (vec2(pixel) - 0.25 * globalData.jitterCurrent * vec2(resolution)) + offset + 0.5) / (2.0 * vec2(resolution)); - vec2 recontructTexCoord = (2.0 * vec2(pixel) + 0.5) / (2.0 * vec2(resolution)); + vec2 recontructTexCoord; + if (uniforms.halfRes > 0) + recontructTexCoord = (2.0 * (vec2(pixel)) + offset + 0.5) / (2.0 * vec2(resolution)); + else + recontructTexCoord = (vec2(pixel) + 0.5) / (vec2(resolution)); + vec3 viewPos = ConvertDepthToViewSpace(depth, recontructTexCoord); vec3 worldPos = vec3(globalData.ivMatrix * vec4(viewPos, 1.0)); vec3 viewVec = vec3(globalData.ivMatrix * vec4(viewPos, 0.0)); diff --git a/src/demo/App.cpp b/src/demo/App.cpp index 8183802cb..d5166037b 100644 --- a/src/demo/App.cpp +++ b/src/demo/App.cpp @@ -169,13 +169,13 @@ void App::Update(float deltaTime) { if (!meshComponent.mesh.IsLoaded()) continue; - if (meshComponent.mesh->name == "chromesphere.gltf") { + if (meshComponent.mesh->name == "chromesphere") { float height = (sinf(Atlas::Clock::Get() / 5.0f) + 1.0f) * 20.0f; auto matrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, height, .0f)); transformComponent.Set(matrix); } - else if (meshComponent.mesh->name == "metallicwall.gltf") { + else if (meshComponent.mesh->name == "metallicwall") { auto matrix = glm::translate(glm::mat4(1.0f), glm::vec3(-50.0f, 0.0f, -2.0f)); matrix = glm::rotate(matrix, Atlas::Clock::Get() / 2.0f, glm::vec3(0.0f, 1.0f, 0.0f)); diff --git a/src/editor/App.cpp b/src/editor/App.cpp index d6e28d54f..359e1e04e 100644 --- a/src/editor/App.cpp +++ b/src/editor/App.cpp @@ -349,7 +349,7 @@ namespace Atlas::Editor { ImGui::DockBuilderAddNode(dsID); ImGuiID dsIdUp, dsIdDown; - ImGui::DockBuilderSplitNode(dsID, ImGuiDir_Up, 0.8f, &dsIdUp, &dsIdDown); + ImGui::DockBuilderSplitNode(dsID, ImGuiDir_Up, 0.7f, &dsIdUp, &dsIdDown); for (auto& sceneWindow : sceneWindows) { ImGui::DockBuilderDockWindow(sceneWindow->GetNameID(), dsIdUp); diff --git a/src/editor/Content.cpp b/src/editor/Content.cpp index 1a07be4da..51cc43e5f 100644 --- a/src/editor/Content.cpp +++ b/src/editor/Content.cpp @@ -4,12 +4,14 @@ namespace Atlas::Editor { const std::map Content::contentTypeMapping = { { "wav", ContentType::Audio }, - { "gltf", ContentType::Mesh }, - { "glb", ContentType::Mesh }, - { "obj", ContentType::Mesh }, - { "fbx", ContentType::Mesh }, - { "usd", ContentType::Mesh }, - { "usda", ContentType::Mesh }, + { "aemesh", ContentType::Mesh }, + { "gltf", ContentType::MeshSource }, + { "glb", ContentType::MeshSource }, + { "obj", ContentType::MeshSource }, + { "fbx", ContentType::MeshSource }, + { "usd", ContentType::MeshSource }, + { "usda", ContentType::MeshSource }, + { "aematerial", ContentType::Material }, { "aeterrain", ContentType::Terrain }, { "aescene", ContentType::Scene }, { "lua", ContentType::Script }, diff --git a/src/editor/Content.h b/src/editor/Content.h index 96a5d1ec4..2c2216205 100644 --- a/src/editor/Content.h +++ b/src/editor/Content.h @@ -9,6 +9,8 @@ namespace Atlas::Editor { enum class ContentType { Audio = 0, Mesh, + MeshSource, + Material, Terrain, Scene, Script, diff --git a/src/editor/DataCreator.cpp b/src/editor/DataCreator.cpp index 2eeadef80..e39ffa5fd 100644 --- a/src/editor/DataCreator.cpp +++ b/src/editor/DataCreator.cpp @@ -71,10 +71,10 @@ namespace Atlas::Editor { } Ref DataCreator::CreateSceneFromMesh(const std::string& filename, vec3 min, vec3 max, - int32_t depth, bool invertUVs, bool addRigidBodies, bool combineMeshes, bool makeMeshesStatic) { + int32_t depth, bool invertUVs, bool addRigidBodies, bool makeMeshesStatic) { auto scene = Loader::ModelImporter::ImportScene(filename, min, max, depth, - combineMeshes, makeMeshesStatic, false, 2048); + true, makeMeshesStatic, invertUVs, 2048); auto rootEntity = scene->GetEntityByName("Root"); auto& mainHierarchy = rootEntity.GetComponent(); @@ -142,13 +142,6 @@ namespace Atlas::Editor { aabb.Grow(meshComponent.aabb); } - - if (invertUVs) { - auto meshes = scene->GetMeshes(); - - for (const auto& mesh : meshes) - mesh->invertUVs = true; - } if (addRigidBodies) { for (auto entity : meshSubset) { diff --git a/src/editor/DataCreator.h b/src/editor/DataCreator.h index 2e4e47493..4708860bb 100644 --- a/src/editor/DataCreator.h +++ b/src/editor/DataCreator.h @@ -10,7 +10,7 @@ namespace Atlas::Editor { static Ref CreateScene(const std::string& name, vec3 min, vec3 max, int32_t depth); static Ref CreateSceneFromMesh(const std::string& filename,vec3 min, vec3 max, int32_t depth, - bool invertUVs, bool addRigidBodies, bool combineMeshes, bool makeMeshesStatic); + bool invertUVs, bool addRigidBodies, bool makeMeshesStatic); }; diff --git a/src/editor/FileImporter.h b/src/editor/FileImporter.h index ec0aaf8eb..8ba97f7bd 100644 --- a/src/editor/FileImporter.h +++ b/src/editor/FileImporter.h @@ -14,13 +14,12 @@ #include "Font.h" #include "loader/ModelImporter.h" +#include "loader/MeshLoader.h" #include "Content.h" #include "Serializer.h" -namespace Atlas::Editor { - - +namespace Atlas::Editor { class FileImporter { @@ -42,13 +41,31 @@ namespace Atlas::Editor { ResourceHandle handle; + std::string fileType = Common::Path::GetFileType(filename); + std::transform(fileType.begin(), fileType.end(), fileType.begin(), ::tolower); + + if (!Content::contentTypeMapping.contains(fileType)) + return handle; + + auto type = Content::contentTypeMapping.at(fileType); + if constexpr (std::is_same_v) { handle = ResourceManager::GetOrLoadResourceAsync( filename, ResourceOrigin::User); } else if constexpr (std::is_same_v) { - handle = ResourceManager::GetOrLoadResourceWithLoaderAsync(filename, - ResourceOrigin::User, Loader::ModelImporter::ImportMesh, false, 2048); + if (type == ContentType::MeshSource) { + auto resourcePath = Common::Path::GetFileNameWithoutExtension(filename) + ".aemesh"; + auto loader = [filename](const std::string& resourcePath) -> auto { + return Loader::ModelImporter::ImportMesh(filename, true); + }; + handle = ResourceManager::GetOrLoadResourceWithLoaderAsync(resourcePath, + ResourceOrigin::User, std::function(loader)); + } + else { + handle = ResourceManager::GetOrLoadResourceWithLoaderAsync(filename, + ResourceOrigin::User, Loader::MeshLoader::LoadMesh, true); + } } else if constexpr (std::is_same_v) { handle = ResourceManager::GetOrLoadResourceWithLoaderAsync(filename, @@ -82,7 +99,7 @@ namespace Atlas::Editor { return type == ContentType::Audio; } else if constexpr (std::is_same_v) { - return type == ContentType::Mesh; + return type == ContentType::Mesh || type == ContentType::MeshSource; } else if constexpr (std::is_same_v) { return type == ContentType::Scene; diff --git a/src/editor/Icons.cpp b/src/editor/Icons.cpp index c140d088f..ff813f26e 100644 --- a/src/editor/Icons.cpp +++ b/src/editor/Icons.cpp @@ -50,6 +50,8 @@ namespace Atlas::Editor { { IconType::Scale, Texture::Texture2D("editor/icons/scale.png") }, { IconType::Rotate, Texture::Texture2D("editor/icons/rotate.png") }, { IconType::MoreHorizontal, Texture::Texture2D("editor/icons/more_horiz.png") }, + { IconType::Material, Texture::Texture2D("editor/icons/material.png") }, + { IconType::MeshSource, Texture::Texture2D("editor/icons/meshSource.png") }, }; } else { @@ -75,6 +77,8 @@ namespace Atlas::Editor { { IconType::Scale, Texture::Texture2D("editor/icons/scale_light.png") }, { IconType::Rotate, Texture::Texture2D("editor/icons/rotate_light.png") }, { IconType::MoreHorizontal, Texture::Texture2D("editor/icons/more_horiz_light.png") }, + { IconType::Material, Texture::Texture2D("editor/icons/material_light.png") }, + { IconType::MeshSource, Texture::Texture2D("editor/icons/meshSource_light.png") }, }; } diff --git a/src/editor/Icons.h b/src/editor/Icons.h index d2d7c4e9a..9e50e70b4 100644 --- a/src/editor/Icons.h +++ b/src/editor/Icons.h @@ -27,7 +27,9 @@ namespace Atlas::Editor { Move, Scale, Rotate, - MoreHorizontal + MoreHorizontal, + Material, + MeshSource }; class Icons { diff --git a/src/editor/Serialization.cpp b/src/editor/Serialization.cpp index d640654b1..8482e340c 100644 --- a/src/editor/Serialization.cpp +++ b/src/editor/Serialization.cpp @@ -77,6 +77,7 @@ namespace Atlas::Editor { { "scaleSnap", sceneWindow->scaleSnap }, { "cameraMovementSpeed", sceneWindow->cameraMovementSpeed }, { "cameraRotationSpeed", sceneWindow->cameraRotationSpeed }, + { "depthTestBoundingVolumes", sceneWindow->depthTestBoundingVolumes }, { "camera", camera } }; @@ -111,6 +112,7 @@ namespace Atlas::Editor { try_get_json(j, "scaleSnap", sceneWindow->scaleSnap); try_get_json(j, "cameraMovementSpeed", sceneWindow->cameraMovementSpeed); try_get_json(j, "cameraRotationSpeed", sceneWindow->cameraRotationSpeed); + try_get_json(j, "depthTestBoundingVolumes", sceneWindow->depthTestBoundingVolumes); try_get_json(j, "camera", camera); sceneWindow->cameraEntity = sceneWindow->scene->CreateEntity(); diff --git a/src/editor/ui/panels/PopupPanels.cpp b/src/editor/ui/panels/PopupPanels.cpp index 4d806f2d9..0ee812c64 100644 --- a/src/editor/ui/panels/PopupPanels.cpp +++ b/src/editor/ui/panels/PopupPanels.cpp @@ -91,7 +91,6 @@ namespace Atlas::Editor::UI { static int32_t octreeDepth = 5; static bool invertUVs = true; static bool addRigidBodies = true; - static bool combineMeshes = false; static bool makeMeshesStatic = false; SetupPopupSize(0.6f, 0.3f); @@ -121,7 +120,6 @@ namespace Atlas::Editor::UI { ImGui::Text("Import properties"); ImGui::Checkbox("Invert UVs", &invertUVs); ImGui::Checkbox("Attach mesh rigid body components", &addRigidBodies); - ImGui::Checkbox("Combine meshes", &combineMeshes); ImGui::Checkbox("Make meshes static", &makeMeshesStatic); if (ImGui::Button("Cancel")) { @@ -135,7 +133,7 @@ namespace Atlas::Editor::UI { Singletons::blockingOperation->Block("Importing scene. Please wait...", [&]() { auto scene = DataCreator::CreateSceneFromMesh(filename, minSize, maxSize, - octreeDepth, invertUVs, addRigidBodies, combineMeshes, makeMeshesStatic); + octreeDepth, invertUVs, addRigidBodies, makeMeshesStatic); scene->name = name; bool alreadyExisted; diff --git a/src/editor/ui/windows/ContentBrowserWindow.cpp b/src/editor/ui/windows/ContentBrowserWindow.cpp index 2be38d608..1babe4259 100644 --- a/src/editor/ui/windows/ContentBrowserWindow.cpp +++ b/src/editor/ui/windows/ContentBrowserWindow.cpp @@ -70,7 +70,7 @@ namespace Atlas::Editor::UI { ImGui::Separator(); - const char *items[] = {"Audio", "Mesh", "Terrain", "Scene", "Script", "Font", "Prefab"}; + const char *items[] = {"Audio", "Mesh", "Mesh source", "Material", "Terrain", "Scene", "Script", "Font", "Prefab"}; for (int i = 0; i < IM_ARRAYSIZE(items); i++) { bool isSelected = selectedFilter == i; ImGui::Selectable(items[i], &isSelected, ImGuiSelectableFlags_SpanAvailWidth); @@ -350,6 +350,8 @@ namespace Atlas::Editor::UI { switch (contentType) { case ContentType::Audio: return icons->Get(IconType::Audio); case ContentType::Mesh: return icons->Get(IconType::Mesh); + case ContentType::MeshSource: return icons->Get(IconType::MeshSource); + case ContentType::Material: return icons->Get(IconType::Material); case ContentType::Scene: return icons->Get(IconType::Scene); case ContentType::Font: return icons->Get(IconType::Font); case ContentType::Prefab: return icons->Get(IconType::Prefab); diff --git a/src/editor/ui/windows/SceneWindow.cpp b/src/editor/ui/windows/SceneWindow.cpp index ebf14f654..d5da90df6 100644 --- a/src/editor/ui/windows/SceneWindow.cpp +++ b/src/editor/ui/windows/SceneWindow.cpp @@ -264,6 +264,9 @@ namespace Atlas::Editor::UI { ImGui::DragFloat("Rotation snap", &rotationSnap, 0.1f, 0.1f, 10.0f); ImGui::DragFloat("Scale snap", &scaleSnap, 0.01f, 0.1f, 10.0f); + ImGui::Text("Bounding volumes"); + ImGui::Checkbox("Test depth", &depthTestBoundingVolumes); + ImGui::EndPopup(); } } @@ -505,6 +508,8 @@ namespace Atlas::Editor::UI { if (!entity.IsValid()) return; + viewportPanel.primitiveBatchWrapper.primitiveBatch->testDepth = depthTestBoundingVolumes; + if (entity.HasComponent()) { const auto& meshComponent = entity.GetComponent(); auto aabb = meshComponent.aabb; diff --git a/src/editor/ui/windows/SceneWindow.h b/src/editor/ui/windows/SceneWindow.h index 1e22584ab..10c3b9686 100644 --- a/src/editor/ui/windows/SceneWindow.h +++ b/src/editor/ui/windows/SceneWindow.h @@ -60,6 +60,8 @@ namespace Atlas::Editor::UI { int32_t guizmoMode = 7; bool needGuizmoEnabled = false; + bool depthTestBoundingVolumes = false; + bool hasMainCamera = false; bool hasPlayer = false; bool isPlaying = false; diff --git a/src/engine/loader/MeshLoader.cpp b/src/engine/loader/MeshLoader.cpp index ee0be12d4..86da3a32f 100644 --- a/src/engine/loader/MeshLoader.cpp +++ b/src/engine/loader/MeshLoader.cpp @@ -19,7 +19,7 @@ namespace Atlas::Loader { auto data = Loader::AssetLoader::GetFileContent(fileStream); // We don't want to keep the file stream open longer than we need fileStream.close(); - j = json::from_bjdata(data); + j = json::from_msgpack(data); } else { std::string serialized((std::istreambuf_iterator(fileStream)), @@ -50,7 +50,7 @@ namespace Atlas::Loader { to_json(j, *mesh); if (binaryJson) { - auto data = json::to_bjdata(j); + auto data = json::to_msgpack(j); fileStream.write(reinterpret_cast(data.data()), data.size()); } else { diff --git a/src/engine/loader/ModelImporter.cpp b/src/engine/loader/ModelImporter.cpp index 9ec0bdda4..6cdd3594d 100644 --- a/src/engine/loader/ModelImporter.cpp +++ b/src/engine/loader/ModelImporter.cpp @@ -18,15 +18,15 @@ namespace Atlas { namespace Loader { Ref ModelImporter::ImportMesh(const std::string& filename, - bool forceTangents, int32_t maxTextureResolution) { + bool saveToDisk, int32_t maxTextureResolution) { - return ImportMesh(filename, Mesh::MeshMobility::Stationary, forceTangents, + return ImportMesh(filename, Mesh::MeshMobility::Stationary, saveToDisk, maxTextureResolution); } Ref ModelImporter::ImportMesh(const std::string& filename, - Mesh::MeshMobility mobility, bool forceTangents, + Mesh::MeshMobility mobility, bool saveToDisk, int32_t maxTextureResolution) { ImporterState state; @@ -71,7 +71,6 @@ namespace Atlas { traverseNodeTree(state.scene->mRootNode, mat4(1.0f)); - hasTangents |= forceTangents; for (uint32_t i = 0; i < state.scene->mNumMaterials; i++) { if (state.scene->mMaterials[i]->GetTextureCount(aiTextureType_NORMALS) > 0) hasTangents = true; @@ -227,18 +226,21 @@ namespace Atlas { mesh->UpdateData(); auto meshFilename = state.paths.meshPath + mesh->name + ".aemesh"; - Loader::MeshLoader::SaveMesh(mesh, meshFilename, true); + if (saveToDisk) { + Log::Message("Imported mesh " + meshFilename); + Loader::MeshLoader::SaveMesh(mesh, meshFilename, true); + } return mesh; } Ref ModelImporter::ImportScene(const std::string& filename, vec3 min, vec3 max, - int32_t depth, bool combineMeshes, bool makeMeshesStatic, - bool forceTangents, int32_t maxTextureResolution) { + int32_t depth, bool saveToDisk, bool makeMeshesStatic, + bool invertUVs, int32_t maxTextureResolution) { ImporterState state; - InitImporterState(state, filename, combineMeshes); + InitImporterState(state, filename, false); auto materials = ImportMaterials(state, maxTextureResolution); @@ -274,7 +276,6 @@ namespace Atlas { auto mesh = CreateRef(); auto& meshData = mesh->data; - hasTangents |= forceTangents; if (material->HasNormalMap()) hasTangents = true; if (material->HasDisplacementMap()) @@ -388,13 +389,17 @@ namespace Atlas { meshData.name = std::string(assimpMesh->mName.C_Str()); mesh->name = meshData.name; + mesh->invertUVs = invertUVs; mesh->UpdateData(); auto meshFilename = state.paths.meshPath + mesh->name + "_" + std::to_string(i) + ".aemesh"; auto handle = ResourceManager::AddResource(meshFilename, mesh); meshes[i] = { handle, offset }; - Loader::MeshLoader::SaveMesh(mesh, meshFilename, true); + if (saveToDisk) { + Log::Message("Imported mesh " + meshFilename); + Loader::MeshLoader::SaveMesh(mesh, meshFilename, true); + } i = counter++; } diff --git a/src/engine/loader/ModelImporter.h b/src/engine/loader/ModelImporter.h index 00bc8e1ef..630ae85ae 100644 --- a/src/engine/loader/ModelImporter.h +++ b/src/engine/loader/ModelImporter.h @@ -20,15 +20,15 @@ namespace Atlas { public: static Ref ImportMesh(const std::string& filename, - bool forceTangents = false, int32_t maxTextureResolution = 4096); + bool saveToDisk = false, int32_t maxTextureResolution = 4096); static Ref ImportMesh(const std::string& filename, - Mesh::MeshMobility mobility, bool forceTangents = false, + Mesh::MeshMobility mobility, bool saveToDisk = false, int32_t maxTextureResolution = 4096); static Ref ImportScene(const std::string& filename, vec3 min, vec3 max, - int32_t depth, bool combineMeshes = true, bool makeMeshesStatic = false, - bool forceTangents = false, int32_t maxTextureResolution = 4096); + int32_t depth, bool saveToDisk = true, bool makeMeshesStatic = false, + bool invertUVs = false, int32_t maxTextureResolution = 4096); private: struct Paths { diff --git a/src/engine/mesh/MeshSerializer.h b/src/engine/mesh/MeshSerializer.h index 5257c8e75..0afd44763 100644 --- a/src/engine/mesh/MeshSerializer.h +++ b/src/engine/mesh/MeshSerializer.h @@ -57,7 +57,11 @@ namespace Atlas::Mesh { j.at("format").get_to(format); p.format = static_cast(format); - std::vector binaryData = j["data"]; + std::vector binaryData; + if (binary) + binaryData = j["data"].get_binary(); + else + j.at("data").get_to(binaryData); if (!binaryData.empty()) { p.data.resize(binaryData.size() / sizeof(T)); std::memcpy(p.data.data(), binaryData.data(), binaryData.size()); diff --git a/src/engine/renderer/MainRenderer.cpp b/src/engine/renderer/MainRenderer.cpp index 203e09072..0847df34f 100644 --- a/src/engine/renderer/MainRenderer.cpp +++ b/src/engine/renderer/MainRenderer.cpp @@ -128,6 +128,7 @@ namespace Atlas { commandList->BindBuffer(globalUniformBuffer, 1, 31); commandList->BindImage(dfgPreintegrationTexture.image, dfgPreintegrationTexture.sampler, 1, 12); commandList->BindSampler(globalSampler, 1, 13); + commandList->BindSampler(globalNearestSampler, 1, 15); commandList->BindBuffers(triangleBuffers, 0, 1); if (images.size()) commandList->BindSampledImages(images, 0, 3); @@ -473,6 +474,7 @@ namespace Atlas { commandList->BindBuffer(pathTraceGlobalUniformBuffer, 1, 31); commandList->BindImage(dfgPreintegrationTexture.image, dfgPreintegrationTexture.sampler, 1, 12); commandList->BindSampler(globalSampler, 1, 13); + commandList->BindSampler(globalNearestSampler, 1, 15); commandList->BindBuffers(triangleBuffers, 0, 1); commandList->BindSampledImages(images, 0, 3); @@ -910,6 +912,15 @@ namespace Atlas { }; globalSampler = device->CreateSampler(samplerDesc); + samplerDesc = Graphics::SamplerDesc{ + .filter = VK_FILTER_NEAREST, + .mode = VK_SAMPLER_ADDRESS_MODE_REPEAT, + .mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, + .maxLod = 12, + .anisotropicFiltering = false + }; + globalNearestSampler = device->CreateSampler(samplerDesc); + auto layoutDesc = Graphics::DescriptorSetLayoutDesc{ .bindings = { { diff --git a/src/engine/renderer/MainRenderer.h b/src/engine/renderer/MainRenderer.h index 9c77ce2d6..620183526 100644 --- a/src/engine/renderer/MainRenderer.h +++ b/src/engine/renderer/MainRenderer.h @@ -172,6 +172,7 @@ namespace Atlas { Ref ddgiUniformBuffer; Ref globalDescriptorSetLayout; Ref globalSampler; + Ref globalNearestSampler; Buffer::VertexArray vertexArray; Buffer::VertexArray cubeVertexArray; diff --git a/src/engine/renderer/RTGIRenderer.cpp b/src/engine/renderer/RTGIRenderer.cpp index 2bff9c486..5f3089601 100644 --- a/src/engine/renderer/RTGIRenderer.cpp +++ b/src/engine/renderer/RTGIRenderer.cpp @@ -135,6 +135,7 @@ namespace Atlas { uniforms.bias = rtgi->bias; uniforms.frameSeed = frameCount++; uniforms.textureLevel = rtgi->textureLevel; + uniforms.halfRes = target->GetGIResolution() == HALF_RES ? 1 : 0; uniforms.resolution = res; if (shadow && rtgi->useShadowMap) { diff --git a/src/engine/renderer/RTGIRenderer.h b/src/engine/renderer/RTGIRenderer.h index e7d18f6e4..8fc4a7a4b 100644 --- a/src/engine/renderer/RTGIRenderer.h +++ b/src/engine/renderer/RTGIRenderer.h @@ -25,7 +25,7 @@ namespace Atlas { float bias; int32_t textureLevel; float roughnessCutoff; - int32_t padding; + int32_t halfRes; ivec2 resolution; Shadow shadow; }; diff --git a/src/engine/renderer/RTReflectionRenderer.cpp b/src/engine/renderer/RTReflectionRenderer.cpp index 1bc8a7a0a..cb0dad4e5 100644 --- a/src/engine/renderer/RTReflectionRenderer.cpp +++ b/src/engine/renderer/RTReflectionRenderer.cpp @@ -130,6 +130,7 @@ namespace Atlas { uniforms.roughnessCutoff = reflection->roughnessCutoff; uniforms.frameSeed = frameCount++; uniforms.textureLevel = reflection->textureLevel; + uniforms.halfRes = target->GetReflectionResolution() == HALF_RES ? 1 : 0; uniforms.resolution = rayRes; if (shadow && reflection->useShadowMap) { diff --git a/src/engine/renderer/RTReflectionRenderer.h b/src/engine/renderer/RTReflectionRenderer.h index fc8a60c02..38ed51e00 100644 --- a/src/engine/renderer/RTReflectionRenderer.h +++ b/src/engine/renderer/RTReflectionRenderer.h @@ -25,7 +25,7 @@ namespace Atlas { float bias; int32_t textureLevel; float roughnessCutoff; - int32_t padding; + int32_t halfRes; ivec2 resolution; Shadow shadow; };