diff --git a/CMakeLists.txt b/CMakeLists.txt index faee2fa..92a43e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,33 +34,48 @@ if (VULKAN_SDK) endif() set(VSG_MIN_VERSION 1.1.0) - -FetchContent_Declare(vsg - GIT_REPOSITORY https://github.com/vsg-dev/VulkanSceneGraph.git - GIT_TAG master - GIT_PROGRESS TRUE - FIND_PACKAGE_ARGS ${VSG_MIN_VERSION} -) - -FetchContent_MakeAvailable(vsg) -# find_package(vsg) includes vsgMacros -if (vsg_SOURCE_DIR) - SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${vsg_SOURCE_DIR}/cmake") - include("vsgMacros") +find_package(vsg ${VSG_MIN_VERSION}) +if (NOT vsg_FOUND) + FetchContent_Declare(vsg + GIT_REPOSITORY https://github.com/vsg-dev/VulkanSceneGraph.git + GIT_TAG master + GIT_PROGRESS TRUE + FIND_PACKAGE_ARGS ${VSG_MIN_VERSION} + ) + + FetchContent_MakeAvailable(vsg) + # find_package(vsg) includes vsgMacros + if (vsg_SOURCE_DIR) + SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${vsg_SOURCE_DIR}/cmake") + include("vsgMacros") + endif() endif() -#find_package(vsgXchange) +set(VSGXCHANGE_MIN_VERSION 1.0.5) +find_package(vsgXchange ${VSGXCHANGE_MIN_VERSION}) +if (NOT vsgXchange_FOUND) + FetchContent_Declare(vsgXchange + GIT_REPOSITORY https://github.com/vsg-dev/vsgXchange.git + GIT_TAG master + GIT_PROGRESS TRUE + FIND_PACKAGE_ARGS ${VSGXCHANGE_MIN_VERSION} + ) + + FetchContent_MakeAvailable(vsgXchange) +endif() set(VSGIMGUI_MIN_VERSION 0.1.0) - -FetchContent_Declare(vsgImGui - GIT_REPOSITORY https://github.com/vsg-dev/vsgImGui.git - GIT_TAG v0.1.0 - GIT_PROGRESS TRUE - FIND_PACKAGE_ARGS ${VSGIMGUI_MIN_VERSION} -) - -FetchContent_MakeAvailable(vsgImGui) +find_package(vsgImGui ${VSGIMGUI_MIN_VERSION}) +if (NOT vsgImGui_FOUND) + FetchContent_Declare(vsgImGui + GIT_REPOSITORY https://github.com/vsg-dev/vsgImGui.git + GIT_TAG v0.1.0 + GIT_PROGRESS TRUE + FIND_PACKAGE_ARGS ${VSGIMGUI_MIN_VERSION} + ) + + FetchContent_MakeAvailable(vsgImGui) +endif() # Wrangle Cesium's dependencies into shape i.e., install them! option(GSL_INSTALL "Generate and install GSL target" ON) diff --git a/src/applications/worldviewer/worldviewer.cpp b/src/applications/worldviewer/worldviewer.cpp index 9155e0c..e93f9aa 100644 --- a/src/applications/worldviewer/worldviewer.cpp +++ b/src/applications/worldviewer/worldviewer.cpp @@ -134,7 +134,9 @@ int main(int argc, char** argv) } } bool useHeadlight = arguments.read({"--headlight"}); - auto shadowMaps = arguments.value(0, "--shadow-maps"); + auto shadowMaps = arguments.value(0, "--shadow-maps"); + auto maxShadowDistance = arguments.value(10000.0, "--sd"); + if (arguments.errors()) { return arguments.writeErrorMessages(std::cerr); @@ -261,6 +263,7 @@ int main(int argc, char** argv) commandGraph->addChild(renderGraph); auto view = vsg::View::create(camera); + view->viewDependentState->maxShadowDistance = maxShadowDistance; if (useHeadlight) { view->addChild(vsg::createHeadlight()); @@ -270,14 +273,25 @@ int main(int argc, char** argv) // Attach the ImGui graphical interface renderGraph->addChild(ui->getImGui()); viewer->assignRecordAndSubmitTaskAndPresentation({commandGraph}); - // Compile everything we can at this point. - viewer->compile(); + // Perform any late initialization of TilesetNode objects. Most importantly, this tracks VSG // cameras so that they can be used by cesium-native to determine visible tiles. worldNode->initialize(viewer); + + // Compile everything we can at this point. + // + // best practice is to tell the viewer what resources to allocate in the viewer.compile() call via ResourceHints + // + // auto resourceHints = vsg::ResourceHints::create(); + // resourceHints->numShadowMapsRange = {shadowMaps, 64}; + // resourceHints->maxSlot = 4; + // viewer->compile(resourceHints); + viewer->compile(); + auto lastAct = gsl::finally([worldNode]() { vsgCs::shutdown(); worldNode->shutdown();}); + // rendering main loop while (viewer->advanceToNextFrame() && (numFrames < 0 || (numFrames--) > 0)) { diff --git a/src/vsgCs/WorldNode.cpp b/src/vsgCs/WorldNode.cpp index f1fc0f6..5817bd9 100644 --- a/src/vsgCs/WorldNode.cpp +++ b/src/vsgCs/WorldNode.cpp @@ -86,8 +86,6 @@ bool WorldNode::initialize(const vsg::ref_ptr& viewer) genv->overlayPipelineLayout, pbr::WORLD_DESCRIPTOR_SET, descriptorBuilder->descriptorSets[pbr::WORLD_DESCRIPTOR_SET]); stateGroup->add(bindDescriptorSet); - // Overkill; better to just compile the stateGroup - viewer->compile(); return result; }