diff --git a/.vscode/launch.json b/.vscode/launch.json index 6f4251c..7e0bf55 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,11 +6,12 @@ "configurations": [ { "name": "Launch", - "type": "lldb", + "type": "cppdbg", "request": "launch", "program": "${workspaceRoot}/build/FluidSimulation", "args": [], - "cwd": "${workspaceRoot}/build" + "cwd": "${workspaceRoot}/build", + "MIMode": "lldb" } ] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c608d7..1d93d49 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,8 +25,6 @@ target_link_libraries(FluidSimulation PRIVATE Engine) target_include_directories(FluidSimulation PRIVATE src/) add_subdirectory(src/) -add_custom_target(FluidSimulationAll ALL +add_custom_command(TARGET FluidSimulation POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_SOURCE_DIR}/res $ - COMMAND - DEPENDS FluidSimulation) + ${CMAKE_SOURCE_DIR}/res $) diff --git a/CMakePresets.json b/CMakePresets.json index 87c6a95..d833c3f 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -86,37 +86,37 @@ "name": "release", "displayName": "Release (no ASan)", "configurePreset": "release", - "jobs": 0 + "jobs": 14 }, { "name": "release-asan", "displayName": "Release (ASan)", "configurePreset": "release-asan", - "jobs": 0 + "jobs": 14 }, { "name": "debug", "displayName": "Debug (no ASan)", "configurePreset": "debug", - "jobs": 0 + "jobs": 14 }, { "name": "debug-mac", "displayName": "Debug Mac (no ASan)", "configurePreset": "debug-mac", - "jobs": 0 + "jobs": 14 }, { "name": "debug-mac-asan", "displayName": "Debug Mac (ASan)", "configurePreset": "debug-mac-asan", - "jobs": 0 + "jobs": 14 }, { "name": "debug-asan", "displayName": "Debug (ASan)", "configurePreset": "debug-asan", - "jobs": 0 + "jobs": 14 } ] } diff --git a/Seele b/Seele index 7271fe8..7af42b9 160000 --- a/Seele +++ b/Seele @@ -1 +1 @@ -Subproject commit 7271fe8a0b9814ab42efb069ce090f62a0b39de7 +Subproject commit 7af42b9bad92b91993808ee05456a6bef41d63ea diff --git a/res/shaders/FluidGridData.slang b/res/shaders/FluidGridData.slang index ba6f868..a7effd6 100644 --- a/res/shaders/FluidGridData.slang +++ b/res/shaders/FluidGridData.slang @@ -1,4 +1,4 @@ -static const uint3 gridSize = uint3(128, 128, 128); +static const uint3 gridSize = uint3(64, 64, 64); struct FluidGridData { RWStructuredBuffer dataGrid; diff --git a/src/FluidRenderPass.cpp b/src/FluidRenderPass.cpp index f7ed291..2949a65 100644 --- a/src/FluidRenderPass.cpp +++ b/src/FluidRenderPass.cpp @@ -1,4 +1,5 @@ #include "FluidRenderPass.h" +#include "Graphics/Command.h" #include "Graphics/Enums.h" #include "Graphics/Graphics.h" #include "Graphics/Initializer.h" @@ -7,7 +8,8 @@ using namespace Seele; -FluidRenderPass::FluidRenderPass(Seele::Gfx::PGraphics graphics) : RenderPass(graphics) { +FluidRenderPass::FluidRenderPass(Seele::Gfx::PGraphics graphics) + : RenderPass(graphics) { pipelineLayout = graphics->createPipelineLayout("FluidPipelineLayout"); descriptorLayout = graphics->createDescriptorLayout("params"); descriptorLayout->addDescriptorBinding(Gfx::DescriptorBinding{ @@ -31,7 +33,8 @@ FluidRenderPass::FluidRenderPass(Seele::Gfx::PGraphics graphics) : RenderPass(gr FluidRenderPass::~FluidRenderPass() {} -void FluidRenderPass::beginFrame(const Seele::Component::Camera &camera, const Seele::Component::Transform &transform) { +void FluidRenderPass::beginFrame(const Seele::Component::Camera &camera, + const Seele::Component::Transform &transform) { updateViewParameters(camera, transform); descriptorSet = descriptorLayout->allocateDescriptorSet(); descriptorSet->updateBuffer("density", 0, densityBuffer); @@ -40,6 +43,12 @@ void FluidRenderPass::beginFrame(const Seele::Component::Camera &camera, const S void FluidRenderPass::render() { graphics->beginRenderPass(renderPass); + Gfx::ORenderCommand renderCommand = graphics->createRenderCommand(); + renderCommand->setViewport(viewport); + renderCommand->bindPipeline(pipeline); + renderCommand->bindDescriptor(descriptorSet); + renderCommand->draw(3, 1, 0, 0); + graphics->executeCommands(std::move(renderCommand)); graphics->endRenderPass(); } @@ -50,19 +59,21 @@ void FluidRenderPass::publishOutputs() { .format = Gfx::SE_FORMAT_D32_SFLOAT, .width = viewport->getWidth(), .height = viewport->getHeight(), - .name = "FluidDepth", .usage = Gfx::SE_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + .name = "FluidDepth", }); } void FluidRenderPass::createRenderPass() { densityBuffer = resources->requestBuffer("DENSITY"); - colorAttachment = Gfx::RenderTargetAttachment(viewport->getOwner()->getBackBuffer()->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED, - Gfx::SE_IMAGE_LAYOUT_PRESENT_SRC_KHR, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, - Gfx::SE_ATTACHMENT_STORE_OP_STORE); - depthAttachment = Gfx::RenderTargetAttachment(depthTexture->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED, - Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, - Gfx::SE_ATTACHMENT_STORE_OP_DONT_CARE); + colorAttachment = Gfx::RenderTargetAttachment( + viewport, Gfx::SE_IMAGE_LAYOUT_UNDEFINED, + Gfx::SE_IMAGE_LAYOUT_PRESENT_SRC_KHR, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, + Gfx::SE_ATTACHMENT_STORE_OP_STORE); + depthAttachment = Gfx::RenderTargetAttachment( + depthTexture->getDefaultView(), Gfx::SE_IMAGE_LAYOUT_UNDEFINED, + Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_DONT_CARE); depthAttachment.clear.depthStencil.depth = 0.0f; Gfx::RenderTargetLayout layout = Gfx::RenderTargetLayout{ .colorAttachments = {colorAttachment}, @@ -72,29 +83,38 @@ void FluidRenderPass::createRenderPass() { { .srcSubpass = ~0U, .dstSubpass = 0, - .srcStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + .srcStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | Gfx::SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, - .dstStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + .dstStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | Gfx::SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, - .srcAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | + .srcAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, - .dstAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | + .dstAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, }, { .srcSubpass = 0, .dstSubpass = ~0U, - .srcStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + .srcStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | Gfx::SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, - .dstStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + .dstStage = Gfx::SE_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + Gfx::SE_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | Gfx::SE_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, - .srcAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | + .srcAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, - .dstAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | + .dstAccess = Gfx::SE_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | Gfx::SE_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, }, }; - renderPass = graphics->createRenderPass(layout, dependency, viewport->getRenderArea(), "FluidRenderPass"); + renderPass = graphics->createRenderPass( + layout, dependency, viewport->getRenderArea(), "FluidRenderPass"); pipeline = graphics->createGraphicsPipeline(Gfx::LegacyPipelineCreateInfo{ .vertexShader = vertexShader, .fragmentShader = fragmentShader, diff --git a/src/SimulationComputePass.cpp b/src/SimulationComputePass.cpp index 1e9a645..b8edb9c 100644 --- a/src/SimulationComputePass.cpp +++ b/src/SimulationComputePass.cpp @@ -208,10 +208,17 @@ SimulationComputePass::SimulationComputePass(Seele::Gfx::PGraphics graphics) : R } uint64_t bufferSize = gridSize * gridSize * gridSize * sizeof(float); + Array initialData(bufferSize / sizeof(float)); + for(int i = 0; i < 20; ++i) { + int x = rand() % gridSize; + int y = rand() % gridSize; + initialData[x + y * gridSize] = 1.0f; + } densityBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{ .sourceData = { .size = bufferSize, + .data = (uint8*)initialData.data(), }, .name = "DensityBuffer", }); diff --git a/src/SimulationComputePass.h b/src/SimulationComputePass.h index d05b875..9540ad7 100644 --- a/src/SimulationComputePass.h +++ b/src/SimulationComputePass.h @@ -25,7 +25,7 @@ private: float viscosity = 0.001f; float diffusion = 0.0001f; float dt = 0.1f; - constexpr static uint gridSize = 128; + constexpr static uint gridSize = 64; struct SetBounds { Seele::Gfx::OPipelineLayout pipelineLayout; diff --git a/src/main.cpp b/src/main.cpp index 5c7be73..f4cd27e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,13 +6,13 @@ using namespace Seele; int main() { + OWindowManager windowManager = new WindowManager(); Gfx::OGraphics graphics = new Vulkan::Graphics(); graphics->init(GraphicsInitializer()); - OWindowManager windowManager = new WindowManager(); auto window = windowManager->addWindow(graphics, WindowCreateInfo{ - .title = "Seele Fluid Simulation", .width = 1280, .height = 720, + .title = "FluidSimulation", }); auto view = new FluidSimulationView(graphics, window, ViewportCreateInfo{ diff --git a/vcpkg.json b/vcpkg.json deleted file mode 100644 index c467f19..0000000 --- a/vcpkg.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "dependencies": [ - { - "name": "vulkan" - }, - "vulkan-loader", - { - "name": "vulkan-memory-allocator" - }, - "assimp", - "stb", - "entt", - "freetype", - "glfw3", - "glm", - "ktx", - "nlohmann-json", - "fmt", - "gtest", - "lunasvg", - "harfbuzz", - "shader-slang", - "metis", - "meshoptimizer" - ] -} \ No newline at end of file diff --git a/vcpkg.json b/vcpkg.json new file mode 120000 index 0000000..d8eba01 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1 @@ +Seele/vcpkg.json \ No newline at end of file