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;
};