diff --git a/Seele.natvis b/Seele.natvis
index 462fe75..f2ef801 100644
--- a/Seele.natvis
+++ b/Seele.natvis
@@ -39,15 +39,18 @@
- value
-
+
{{ size={_size} }
- _size
- comp
-
+
_size
- nodeContainer._data
-
+ root
+ left
+ right
+ pair
+
diff --git a/external/vcpkg b/external/vcpkg
index 5c7c15b..50bffcc 160000
--- a/external/vcpkg
+++ b/external/vcpkg
@@ -1 +1 @@
-Subproject commit 5c7c15b964f9ceceb798cb154bc9ec2c68158462
+Subproject commit 50bffcc62d7f6571eb32bc1a0b1807e77af1166c
diff --git a/res/shaders/BasePass.slang b/res/shaders/BasePass.slang
index e2a8ce2..7dcfe30 100644
--- a/res/shaders/BasePass.slang
+++ b/res/shaders/BasePass.slang
@@ -18,8 +18,8 @@ ParameterBlock pLightCullingData;
float4 fragmentMain(in FragmentParameter params) : SV_Target
{
LightingParameter lightingParams = params.getLightingParameter();
-
- let brdf = pMaterial.prepare(params.getMaterialParameter());
+ MaterialParameter materialParams = params.getMaterialParameter();
+ let brdf = pMaterial.prepare(materialParams);
float3 result = float3(0, 0, 0);
for(int i = 0; i < pLightEnv.numDirectionalLights; ++i)
{
@@ -29,5 +29,5 @@ float4 fragmentMain(in FragmentParameter params) : SV_Target
{
result += pLightEnv.pointLights[i].illuminate(lightingParams, brdf);
}
- return float4(result, 1.0f);
+ return float4(materialParams.vertexColor, 1.0f);
}
diff --git a/res/shaders/MeshletBasePass.slang b/res/shaders/MeshletBasePass.slang
index 75847a9..3e0d977 100644
--- a/res/shaders/MeshletBasePass.slang
+++ b/res/shaders/MeshletBasePass.slang
@@ -29,19 +29,19 @@ void taskMain(
localToClip = mul(pViewParams.projectionMatrix, mul(pViewParams.viewMatrix, instance.transformMatrix));
// Left
viewFrustum.sides[0].n = float3(1, 0, 0);
- viewFrustum.sides[0].d = -0.8;
+ viewFrustum.sides[0].d = 0.7;
// Right
viewFrustum.sides[1].n = float3(-1, 0, 0);
- viewFrustum.sides[1].d = 0.8;
+ viewFrustum.sides[1].d = 0.7;
// Top
viewFrustum.sides[2].n = float3(0, -1, 0);
- viewFrustum.sides[2].d = 0.8;
+ viewFrustum.sides[2].d = 0.7;
// Bottom
- viewFrustum.sides[1].n = float3(0, 1, 0);
- viewFrustum.sides[1].d = -0.8;
+ viewFrustum.sides[3].n = float3(0, 1, 0);
+ viewFrustum.sides[3].d = 0.7;
// Base
viewFrustum.basePlane.n = float3(0, 0, 1);
- viewFrustum.basePlane.d = 0;
+ viewFrustum.basePlane.d = 0.2;
}
GroupMemoryBarrierWithGroupSync();
MeshData mesh = pScene.meshData[groupID];
@@ -51,7 +51,7 @@ void taskMain(
{
uint m = mesh.meshletOffset + i;
MeshletDescription meshlet = pScene.meshletInfos[m];
- //if(meshlet.boundingBox.insideFrustum(localToClip, viewFrustum))
+ if(meshlet.boundingBox.insideFrustum(localToClip, viewFrustum))
{
uint index;
InterlockedAdd(head, 1, index);
@@ -119,7 +119,9 @@ void meshMain(
uint v = min(i, m.vertexCount - 1);
{
uint vertexIndex = pScene.vertexIndices[m.vertexOffset + v];
- vertices[v] = pVertexData.getAttributes(md.indicesOffset + vertexIndex).getParameter(inst.transformMatrix);
+ VertexAttributes attr = pVertexData.getAttributes(md.indicesOffset + vertexIndex);
+ attr.vertexColor = m.color;
+ vertices[v] = attr.getParameter(inst.transformMatrix);
}
}
}
\ No newline at end of file
diff --git a/res/shaders/lib/AABB.slang b/res/shaders/lib/AABB.slang
index 89fe623..eba17d4 100644
--- a/res/shaders/lib/AABB.slang
+++ b/res/shaders/lib/AABB.slang
@@ -8,18 +8,18 @@ struct AABB
float pad1;
bool insideFrustum(float4x4 transform, Frustum frustum)
{
- float3 corners[8];
- corners[0] = mul(transform, float4(min.x, min.y, min.z, 1.0f)).xyz;
- corners[1] = mul(transform, float4(min.x, min.y, max.z, 1.0f)).xyz;
- corners[2] = mul(transform, float4(min.x, max.y, min.z, 1.0f)).xyz;
- corners[3] = mul(transform, float4(min.x, max.y, max.z, 1.0f)).xyz;
- corners[4] = mul(transform, float4(max.x, min.y, min.z, 1.0f)).xyz;
- corners[5] = mul(transform, float4(max.x, min.y, max.z, 1.0f)).xyz;
- corners[6] = mul(transform, float4(max.x, max.y, min.z, 1.0f)).xyz;
- corners[7] = mul(transform, float4(max.x, max.y, max.z, 1.0f)).xyz;
+ float4 corners[8];
+ corners[0] = mul(transform, float4(min.x, min.y, min.z, 1.0f));
+ corners[1] = mul(transform, float4(min.x, min.y, max.z, 1.0f));
+ corners[2] = mul(transform, float4(min.x, max.y, min.z, 1.0f));
+ corners[3] = mul(transform, float4(min.x, max.y, max.z, 1.0f));
+ corners[4] = mul(transform, float4(max.x, min.y, min.z, 1.0f));
+ corners[5] = mul(transform, float4(max.x, min.y, max.z, 1.0f));
+ corners[6] = mul(transform, float4(max.x, max.y, min.z, 1.0f));
+ corners[7] = mul(transform, float4(max.x, max.y, max.z, 1.0f));
for(int i = 0; i < 8; ++i)
{
- if(frustum.pointInside(corners[i]))
+ if(frustum.pointInside(corners[i].xyz / corners[i].w))
{
return true;
}
diff --git a/res/shaders/lib/Common.slang b/res/shaders/lib/Common.slang
index f6aa9f0..977c31d 100644
--- a/res/shaders/lib/Common.slang
+++ b/res/shaders/lib/Common.slang
@@ -35,15 +35,13 @@ struct Frustum
Plane basePlane;
bool pointInside(float3 point)
{
- float result = dot(basePlane.n, point) + basePlane.d;
- if (0.0f > result)
+ if (dot(basePlane.n, point) + basePlane.d < 0.0f)
{
return false;
}
for(int p = 0; p < 4; ++p)
{
- result = dot(sides[p].n, point) + sides[p].d;
- if(0.0f > result)
+ if(dot(sides[p].n, point) + sides[p].d < 0.0f)
{
return false;
}
diff --git a/res/shaders/lib/Scene.slang b/res/shaders/lib/Scene.slang
index 8200467..6a8dc5a 100644
--- a/res/shaders/lib/Scene.slang
+++ b/res/shaders/lib/Scene.slang
@@ -7,10 +7,13 @@ struct MeshletDescription
uint32_t primitiveCount;
uint32_t vertexOffset;
uint32_t primitiveOffset;
+ float3 color;
+ float pad;
};
struct MeshData
{
+ AABB boundingBox;
uint32_t numMeshlets;
uint32_t meshletOffset;
uint32_t firstIndex;
diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp
index f48b346..92dad4b 100644
--- a/src/Editor/Asset/MeshLoader.cpp
+++ b/src/Editor/Asset/MeshLoader.cpp
@@ -329,6 +329,7 @@ void MeshLoader::import(MeshImportArgs args, PMeshAsset meshAsset)
meshAsset->setStatus(Asset::Status::Loading);
Assimp::Importer importer;
importer.ReadFile(args.filePath.string().c_str(), (uint32)(
+ aiProcess_ImproveCacheLocality |
aiProcess_FlipUVs |
aiProcess_Triangulate |
aiProcess_SortByPType |
diff --git a/src/Engine/Component/Camera.cpp b/src/Engine/Component/Camera.cpp
index 73c250f..9323e13 100644
--- a/src/Engine/Component/Camera.cpp
+++ b/src/Engine/Component/Camera.cpp
@@ -12,7 +12,7 @@ Camera::Camera()
, bNeedsViewBuild(false)
, cameraPos(Vector())
{
- yaw = 3.1415f/2;
+ yaw = -3.1415f/2;
pitch = 0;
}
diff --git a/src/Engine/Graphics/Enums.h b/src/Engine/Graphics/Enums.h
index e710a16..1e5f25b 100644
--- a/src/Engine/Graphics/Enums.h
+++ b/src/Engine/Graphics/Enums.h
@@ -165,7 +165,7 @@ typedef uint32 KeyModifierFlags;
namespace Gfx
{
static constexpr bool useAsyncCompute = true;
-static constexpr bool waitIdleOnSubmit = true;
+static constexpr bool waitIdleOnSubmit = false;
static constexpr bool useMeshShading = true;
static constexpr uint32 numFramesBuffered = 3;
diff --git a/src/Engine/Graphics/VertexData.cpp b/src/Engine/Graphics/VertexData.cpp
index 6a91042..bf61dc1 100644
--- a/src/Engine/Graphics/VertexData.cpp
+++ b/src/Engine/Graphics/VertexData.cpp
@@ -38,7 +38,7 @@ void VertexData::updateMesh(PMesh mesh, Component::Transform& transform)
.instance = InstanceData {
.transformMatrix = transform.toMatrix(),
},
- .data = data
+ .data = data,
});
}
matInstanceData.materialInstance = mesh->referencedMaterial->getHandle();
@@ -109,10 +109,12 @@ void VertexData::loadMesh(MeshId id, Array loadedIndices, Array
primitiveIndices.resize(primitiveOffset + (m.numPrimitives * 3));
std::memcpy(primitiveIndices.data() + primitiveOffset, m.primitiveLayout, m.numPrimitives * 3 * sizeof(uint8));
meshlets.add(MeshletDescription{
+ .boundingBox = m.boundingBox,
.vertexCount = m.numVertices,
.primitiveCount = m.numPrimitives,
.vertexOffset = vertexOffset,
.primitiveOffset = primitiveOffset,
+ .color = Vector((float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX),
});
}
meshData[id].add(MeshData{
diff --git a/src/Engine/Graphics/VertexData.h b/src/Engine/Graphics/VertexData.h
index 40d6383..5be7026 100644
--- a/src/Engine/Graphics/VertexData.h
+++ b/src/Engine/Graphics/VertexData.h
@@ -98,6 +98,8 @@ protected:
uint32_t primitiveCount;
uint32_t vertexOffset;
uint32_t primitiveOffset;
+ Vector color;
+ float pad0;
};
Map materialData;
Map> meshData;
diff --git a/src/Engine/Graphics/Vulkan/Allocator.cpp b/src/Engine/Graphics/Vulkan/Allocator.cpp
index 4edc3b1..250395d 100644
--- a/src/Engine/Graphics/Vulkan/Allocator.cpp
+++ b/src/Engine/Graphics/Vulkan/Allocator.cpp
@@ -216,23 +216,35 @@ OSubAllocation Allocator::allocate(const VkMemoryRequirements2 &memRequirements2
return heaps[heapIndex].allocations.back()->getSuballocation(requirements.size, requirements.alignment);
}
-void Allocator::free(PAllocation allocation)
+void Allocator::free()
{
- //std::cout << "Freeing allocation" << std::endl;
for (uint32 heapIndex = 0; heapIndex < heaps.size(); ++heapIndex)
{
for (uint32 alloc = 0; alloc < heaps[heapIndex].allocations.size(); ++alloc)
{
- if (heaps[heapIndex].allocations[alloc] == allocation)
+ if (heaps[heapIndex].allocations[alloc]->bytesUsed == 0)
{
- heaps[heapIndex].inUse -= allocation->bytesAllocated;
+ heaps[heapIndex].inUse -= heaps[heapIndex].allocations[alloc]->bytesAllocated;
std::cout << "Heap " << heapIndex << ": " << (float)heaps[heapIndex].inUse / heaps[heapIndex].maxSize * 100 << "%" << std::endl;
heaps[heapIndex].allocations.removeAt(alloc, false);
- return;
+ alloc--;
}
}
}
}
+
+void Allocator::print()
+{
+ for (uint32 heapIndex = 0; heapIndex < heaps.size(); ++heapIndex)
+ {
+ std::cout << "Heap " << heapIndex << std::endl;
+ for (uint32 alloc = 0; alloc < heaps[heapIndex].allocations.size(); ++alloc)
+ {
+ std::cout << "[" << alloc << "]: " << (float)heaps[heapIndex].allocations[alloc]->bytesUsed / heaps[heapIndex].allocations[alloc]->bytesAllocated << std::endl;
+ }
+ }
+}
+
uint32 Allocator::findMemoryType(uint32 typeFilter, VkMemoryPropertyFlags properties)
{
for (uint32 i = 0; i < memProperties.memoryTypeCount; i++)
diff --git a/src/Engine/Graphics/Vulkan/Allocator.h b/src/Engine/Graphics/Vulkan/Allocator.h
index 82a72ec..589a2f6 100644
--- a/src/Engine/Graphics/Vulkan/Allocator.h
+++ b/src/Engine/Graphics/Vulkan/Allocator.h
@@ -122,7 +122,8 @@ public:
return allocate(requirements, props, &allocInfo);
}
- void free(PAllocation allocation);
+ void free();
+ void print();
private:
static constexpr VkDeviceSize DEFAULT_ALLOCATION = 16 * 1024 * 1024; // 16MB
struct HeapInfo
diff --git a/src/Engine/Graphics/Vulkan/Graphics.cpp b/src/Engine/Graphics/Vulkan/Graphics.cpp
index 5f17417..db90965 100644
--- a/src/Engine/Graphics/Vulkan/Graphics.cpp
+++ b/src/Engine/Graphics/Vulkan/Graphics.cpp
@@ -448,7 +448,7 @@ void Graphics::pickPhysicalDevice()
{
if (std::strcmp(VK_EXT_MESH_SHADER_EXTENSION_NAME, extensionProps[i].extensionName) == 0)
{
- //meshShadingEnabled = true;
+ meshShadingEnabled = true;
break;
}
}
diff --git a/src/Engine/Graphics/Vulkan/Resources.cpp b/src/Engine/Graphics/Vulkan/Resources.cpp
index 2e413ee..b9783e1 100644
--- a/src/Engine/Graphics/Vulkan/Resources.cpp
+++ b/src/Engine/Graphics/Vulkan/Resources.cpp
@@ -170,4 +170,5 @@ void DestructionManager::notifyCmdComplete(PCommand cmd)
sems[cmd].clear();
renderPasses[cmd].clear();
allocs[cmd].clear();
+ //graphics->getAllocator()->free();
}
diff --git a/src/Engine/Window/GameView.cpp b/src/Engine/Window/GameView.cpp
index 0336786..7ce637c 100644
--- a/src/Engine/Window/GameView.cpp
+++ b/src/Engine/Window/GameView.cpp
@@ -7,6 +7,8 @@
#include "System/LightGather.h"
#include "System/MeshUpdater.h"
#include "System/CameraUpdater.h"
+#include "Graphics/Vulkan/Graphics.h"
+#include "Graphics/Vulkan/Allocator.h"
using namespace Seele;
@@ -96,6 +98,10 @@ void GameView::reloadGame()
void GameView::keyCallback(KeyCode code, InputAction action, KeyModifier modifier)
{
+ if (code == KeyCode::KEY_P && action == InputAction::PRESS)
+ {
+ ((Vulkan::Graphics*)graphics.getHandle())->getAllocator()->print();
+ }
keyboardSystem->keyCallback(code, action, modifier);
}