diff --git a/.gitmodules b/.gitmodules index 86389c8..1aa7bdf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,9 @@ [submodule "extlibs/liteviz-gs"] path = extlibs/liteviz-gs url = https://github.com/panxkun/liteviz-gs +[submodule "extlibs/tinyply"] + path = extlibs/tinyply + url = https://github.com/ddiakopoulos/tinyply +[submodule "extlibs/tbb"] + path = extlibs/tbb + url = https://github.com/uxlfoundation/oneTBB diff --git a/CMakeLists.txt b/CMakeLists.txt index 616f170..9e38d4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,10 +23,11 @@ set(HEADER_FILES ${SOFA_POINTCLOUD_SRC}/components/PointCloudVisualModel.h ${SOFA_POINTCLOUD_SRC}/components/PointCloudInspector.h ${SOFA_POINTCLOUD_SRC}/components/liteviz-dataloader.h - extlibs/liteviz-gs/liteviz/dataloader.h - extlibs/liteviz-gs/liteviz/renderer.h - extlibs/liteviz-gs/liteviz/shader.h - extlibs/liteviz-gs/liteviz/utils.h + # extlibs/liteviz-gs/liteviz/dataloader.h + # extlibs/liteviz-gs/liteviz/renderer.h + # extlibs/liteviz-gs/liteviz/shader.h + # extlibs/liteviz-gs/liteviz/utils.h + extlibs/tinyply/source/tinyply.h extlibs/diff-gaussian-rasterization/cuda_rasterizer/rasterizer.h extlibs/diff-gaussian-rasterization/cuda_rasterizer/rasterizer_impl.h extlibs/diff-gaussian-rasterization/cuda_rasterizer/forward.h @@ -44,15 +45,34 @@ set(SOURCE_FILES ${SOFA_POINTCLOUD_SRC}/components/PointCloudRendererCUDA.cpp ) +# Tinyply and liteviz +include_directories("extlibs/tinyply/source") + +# TBB +set(TBB_TEST OFF CACHE BOOL "" FORCE) +set(TBB_EXAMPLES OFF CACHE BOOL "" FORCE) +set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE) +set(TBB_ENABLE_IPO OFF CACHE BOOL "" FORCE) +add_subdirectory("extlibs/tbb") add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES}) -target_link_libraries(${PROJECT_NAME} PUBLIC Sofa.Core Sofa.Component.Visual Sofa.GL SofaPython3::Plugin tbb) -set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_ARCHITECTURES "native") +if(TARGET TBB::tbb) +add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + $ + ) + endif() + +target_link_libraries(${PROJECT_NAME} PUBLIC Sofa.Core Sofa.Component.Visual Sofa.GL SofaPython3::Plugin TBB::tbb) +set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_ARCHITECTURES 89) sofa_create_package_with_targets( PACKAGE_NAME ${PROJECT_NAME} PACKAGE_VERSION ${Sofa_VERSION} TARGETS ${PROJECT_NAME} AUTO_SET_TARGET_PROPERTIES - INCLUDE_SOURCE_DIR "src" "extlibs" + INCLUDE_SOURCE_DIR "src" INCLUDE_INSTALL_DIR "${PROJECT_NAME}" RELOCATABLE "plugins" ) diff --git a/src/sofa/pointcloud/components/PointCloudContainer.cpp b/src/sofa/pointcloud/components/PointCloudContainer.cpp index 010c4e2..96183e8 100644 --- a/src/sofa/pointcloud/components/PointCloudContainer.cpp +++ b/src/sofa/pointcloud/components/PointCloudContainer.cpp @@ -45,7 +45,7 @@ namespace sofa::core::objectmodel /// Specialization for reading strings template<> -bool Data::read( const std::string& str ){} +bool Data::read(const std::string& str) { return false; } /// Specialization for reading strings template<> diff --git a/src/sofa/pointcloud/components/PointCloudRenderer.cpp b/src/sofa/pointcloud/components/PointCloudRenderer.cpp index 3474fe1..fb5b7b3 100644 --- a/src/sofa/pointcloud/components/PointCloudRenderer.cpp +++ b/src/sofa/pointcloud/components/PointCloudRenderer.cpp @@ -96,7 +96,7 @@ void PointCloudRenderer::doInitVisual(const sofa::core::visual::VisualParams* vp { if (!sofa::gl::GLSLShader::InitGLSL()) { - msg_info() << "InitGLSL failed" ; + msg_warning() << "InitGLSL failed" ; return; } @@ -197,7 +197,8 @@ void append(GaussianData& dest, const GaussianData& src) std::vector range(int maxSize) { - std::vector tmp {maxSize}; + std::vector tmp; + tmp.reserve(maxSize); for(auto i=0;iupdateVisual(vparams); @@ -361,26 +363,18 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp if(!visual->l_geometry->data){ continue; } - int offset = renderingData.xyz.rows(); - - //if(isFirstRun) - //{ - // visual->initTransform(); - //} - - //if(visual->d_isStaticModel.getValue()) - // hasStaticData=true; + int modelBeginIndex = renderingData.xyz.rows(); // First build the reference geometry - int beginIndex = renderingData.size(); int size = visual->l_geometry->data->xyz.rows()*(3+4+3+1+visual->l_geometry->data->sh_dim()); - dataCache[visual] = std::make_tuple(beginIndex, size); + dataCache[visual] = std::make_tuple(modelBeginIndex, size); + + // only copy position, rotation and scale values + append(referenceData.xyz, visual->l_geometry->data->xyz); + append(referenceData.rot, visual->l_geometry->data->rot); + append(referenceData.scale, visual->l_geometry->data->scale); - append(renderingData.xyz, visual->l_geometry->data->xyz); - append(renderingData.sh, visual->l_geometry->data->sh); - append(renderingData.opacity, visual->l_geometry->data->opacity); - append(renderingData.scale, visual->l_geometry->data->scale); - append(renderingData.rot, visual->l_geometry->data->rot); + append(renderingData, *visual->l_geometry->data); auto scale = visual->d_uniformScale.getValue(); auto initFrames = visual->initFrames; @@ -390,17 +384,15 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp std::vector> frameMap{frames.size()}; for(size_t i=0;idoUpdateVisual(sofa::core::visual::VisualParams::defaultInstance()); - // Now we need to apply the transformation this->transform(scale, initFrames, frames, frameMap, renderingData.xyz, renderingData.rot, renderingData.scale); - msg_warning() << "Batching a new data set " << visual->getPathName() << " with frames " << frames.size(); - msg_warning() << " data set offset & size " << beginIndex << ", " << size; + msg_info() << "Batching a new data set " << visual->getPathName() << " with frames " << frames.size(); + msg_info() << " data set modelBeginIndex & modelSize " << modelBeginIndex << ", " << size; } }else{ SCOPED_TIMER("PointCloud::doDrawVisual::sceneParsing"); @@ -417,7 +409,8 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp if(visual->d_isStaticModel.getValue()) continue; - auto [offset, size] = dataCache[visual]; + auto [modelBeginIndex, modelSize] = dataCache[visual]; + int modelSplatsCount = visual->l_geometry->data->xyz.rows(); auto scale = visual->d_uniformScale.getValue(); auto initFrames = visual->initFrames; @@ -427,9 +420,14 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp std::vector> frameMap{frames.size()}; for(size_t i=0;igetPathName() << " with frames " << frames.size(); - msg_warning() << " data set offset & size " << offset << ", " << size; - updatesBufferParts.push_back({offset,size}); + msg_info() << "Updating a new data set " << visual->getPathName() << " with frames " << frames.size(); + msg_info() << " data set modelBeginIndex & modelSize " << modelBeginIndex << ", " << modelSize; + updatesBufferParts.push_back({modelBeginIndex,modelSize}); } } + msg_info() << " total number of splats to render: " << renderingData.size() << " splats "; isFirstRun=false; @@ -455,7 +454,7 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp // Here we have geometries to draw and a camera that look at it. // We first send the camera parameters to the gl rendering backend, then the geometries. auto c = l_camera->getPosition(); - Eigen::Vector3f cam_pos {c[0],c[1],c[2]}; + Eigen::Vector3f cam_pos {float(c[0]),float(c[1]), float(c[2])}; vparams->getModelViewMatrix(dviewmat.data()); vparams->getProjectionMatrix(dprojmat.data()); @@ -503,7 +502,6 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp static bool firstTime = true; if(firstTime) { - std::cout << "INTIIALIZE BUFFER " << std::endl; firstTime = false; glBindBuffer(GL_SHADER_STORAGE_BUFFER, _ssbo_splat[SplatProperty::SCALE]); glBufferData(GL_SHADER_STORAGE_BUFFER, renderingData.scale.rows() * sizeof(float) * 3, renderingData.scale.data(), GL_DYNAMIC_DRAW); @@ -531,7 +529,6 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, _ssbo_splat[SplatProperty::ROTATION]); } - std::cout << "UPDATE BUFFER PARTS " << updatesBufferParts.size() << std::endl; if(updatesBufferParts.size()) { SCOPED_TIMER("PointCloud::doDrawVisual::bufferUpdate"); @@ -546,7 +543,6 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp } if(depths.size()!=indices.size()){ - std::cout << "RESIZE DEPTH BUFFER" << std::endl; depths.resize(indices.size()); glBindBuffer(GL_SHADER_STORAGE_BUFFER, _ssbo_splat[SplatProperty::DEPTHS]); glBufferData(GL_SHADER_STORAGE_BUFFER, depths.size() * sizeof(float), depths.data(), GL_DYNAMIC_DRAW); @@ -564,6 +560,8 @@ void PointCloudRenderer::doDrawVisual(const sofa::core::visual::VisualParams* vp if(d_withCuda.getValue()) { + selectedIndices.resize(renderingData.size()); + std::iota(selectedIndices.begin(), selectedIndices.end(), 0); PointCloudRendererBackend::transform_and_sort_cuda(viewmat, interop_positions, interop_depths, interop_indices, renderingData.size()); }else { diff --git a/src/sofa/pointcloud/components/PointCloudRenderer.h b/src/sofa/pointcloud/components/PointCloudRenderer.h index 5a8e6f3..74fd35a 100644 --- a/src/sofa/pointcloud/components/PointCloudRenderer.h +++ b/src/sofa/pointcloud/components/PointCloudRenderer.h @@ -90,6 +90,7 @@ class PointCloudRenderer : public sofa::core::visual::VisualModel { std::vector depths; gl::GLSLShader shader; GaussianData renderingData; + GaussianData referenceData; // untransformed source data BaseGLBuffer *interop_positions; BaseGLBuffer *interop_depths; diff --git a/src/sofa/pointcloud/components/PointCloudRendererBackend.cu b/src/sofa/pointcloud/components/PointCloudRendererBackend.cu index 4a0b45e..a160110 100644 --- a/src/sofa/pointcloud/components/PointCloudRendererBackend.cu +++ b/src/sofa/pointcloud/components/PointCloudRendererBackend.cu @@ -110,7 +110,7 @@ public: void reset(int N_) { - std::cout << "RESET CUDA BUFFER " << std::endl; + //std::cout << "RESET CUDA BUFFER " << std::endl; N = N_; short* d_depths_out; diff --git a/src/sofa/pointcloud/components/PointCloudRendererBackend.h b/src/sofa/pointcloud/components/PointCloudRendererBackend.h index 520fe19..f27eed0 100644 --- a/src/sofa/pointcloud/components/PointCloudRendererBackend.h +++ b/src/sofa/pointcloud/components/PointCloudRendererBackend.h @@ -20,6 +20,10 @@ * Contact information: contact@sofa-framework.org * ******************************************************************************/ #pragma once +#ifdef _WIN32 + #include +#endif + #include #include diff --git a/src/sofa/pointcloud/components/PointCloudRendererCUDA.cpp b/src/sofa/pointcloud/components/PointCloudRendererCUDA.cpp index 4e96bf0..4df8147 100644 --- a/src/sofa/pointcloud/components/PointCloudRendererCUDA.cpp +++ b/src/sofa/pointcloud/components/PointCloudRendererCUDA.cpp @@ -110,7 +110,7 @@ void PointCloudRendererCUDA::doDrawVisual(const sofa::core::visual::VisualParams // Here we have geometries to draw and a camera that look at it. // We first send the camera parameters to the gl rendering backend, then the geometries. auto c = l_camera->getPosition(); - Eigen::Vector3f cam_pos {c[0],c[1],c[2]}; + Eigen::Vector3f cam_pos { float(c[0]),float(c[1]), float(c[2]) }; float fov = l_camera->getFieldOfView(); float tanHalfFov = tan((fov / 180.0 * M_PI) / 2.0f);