3 #include <vtkSmartPointer.h> 4 #include <vtkPolyData.h> 5 #include <vtkCellArray.h> 8 #include <vtkTriangle.h> 9 #include <vtkProperty.h> 10 #include <vtkImageData.h> 11 #include <vtkTexture.h> 12 #include <vtkFloatArray.h> 13 #include <vtkPointData.h> 14 #include <vtkCellData.h> 18 #include <vtkPolyDataMapper.h> 26 LVRChunkedMeshBridge::LVRChunkedMeshBridge(std::string
file, vtkSmartPointer<vtkRenderer> renderer, std::vector<std::string> layers,
size_t cache_size) : m_chunkManager(file, cache_size), m_renderer(renderer), m_layers(layers), m_cacheSize(cache_size)
39 std::unique_lock<std::mutex> l(
mutex);
71 for(
auto& index : visible_indices)
83 if(old_highRes.find(it.first) != old_highRes.end())
85 m_highRes.at(it.first) = old_highRes.at(it.first);
99 typedef std::pair<float, size_t> IndexPair;
100 typedef std::pair<float, BaseVector<float> > CentroidPair;
113 if(index_queue.size() < numCopy)
118 else if(index_queue.top().first > distance)
122 centroid_queue.pop();
132 for(
size_t i = 0; i < visible_indices.size(); ++i)
140 while(!index_queue.empty())
142 size_t index = index_queue.top().second;
146 m_highRes.insert({index, old_highRes[index]});
148 auto centroid = centroid_queue.top().second;
149 centroid_queue.pop();
155 std::unordered_map<size_t, vtkSmartPointer<vtkActor>> tmp_highResActors;
156 for(
auto it = m_highRes.begin(); it != m_highRes.end(); ++it)
159 size_t id = chunk.first;
175 for(
auto& it: visible_indices)
177 if(tmp_highResActors.find(it) == tmp_highResActors.end())
189 if(tmp_highResActors.find(it.first) == tmp_highResActors.end())
193 remove_actors.insert({it.first, it.second});
197 for(
auto& it: tmp_highResActors)
199 if(m_highResActors.find(it.first) == m_highResActors.end())
203 new_actors.insert({it.first, it.second});
212 m_highResActors = tmp_highResActors;
221 std::vector<size_t> indices,
225 std::unique_lock<std::mutex> l(
mutex);
237 std::cout <<
"Generating actors " << std::endl;
242 renderer->AddActor(bbridge.
getActor());
245 auto min = bb.getLongestSide();
251 Vector3d focal_point(centroid[0], centroid[1], centroid[2]);
253 renderer->GetActiveCamera()->SetPosition(cam_origin.x(), cam_origin.y(), cam_origin.z());
254 renderer->GetActiveCamera()->SetFocalPoint(focal_point.x(), focal_point.y(), focal_point.z());
255 renderer->GetActiveCamera()->SetViewUp(view_up.x(), view_up.y(), view_up.z());
270 std::vector<size_t> hashes;
274 std::vector<BaseVector<float> > centroids;
277 hashes.push_back(chunk.first);
278 FloatChannel vertices = *(chunk.second->getFloatChannel(
"vertices"));
290 minX = std::min(minX, p.
x);
291 minY = std::min(minY, p.
y);
292 minZ = std::min(minZ, p.
z);
294 maxX = std::max(maxX, p.
x);
295 maxY = std::max(maxY, p.
y);
296 maxZ = std::max(maxZ, p.
z);
306 hashes, centroids, bb);
311 std::cout <<
"Computing actors " << std::endl;
313 std::cout <<
"Adding actors." << std::endl;
316 renderer->AddActor(actor.second);
317 actor.second->VisibilityOff();
319 std::cout <<
"Added " << m_chunkActors.size() <<
" actors" << std::endl;
325 std::vector<size_t> & indices)
328 m_oct->intersect(planes, centroids, indices);
339 size_t id = chunk.first;
353 vtkSmartPointer<vtkActor> meshActor = vtkSmartPointer<vtkActor>::New();
357 vtkSmartPointer<vtkPolyData>
mesh = vtkSmartPointer<vtkPolyData>::New();
359 size_t n_v, n_i, n_c;
361 n_v = meshbuffer->numVertices();
362 floatArr vertices = meshbuffer->getVertices();
363 n_i = meshbuffer->numFaces();
364 indexArray indices = meshbuffer->getFaceIndices();
369 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
370 vtkSmartPointer<vtkFloatArray> pts_data = vtkSmartPointer<vtkFloatArray>::New();
371 pts_data->SetNumberOfComponents(3);
372 pts_data->SetVoidArray(meshbuffer->getVertices().get(), n_v * 3, 1);
373 points->SetData(pts_data);
376 vtkSmartPointer<vtkUnsignedCharArray> scalars = vtkSmartPointer<vtkUnsignedCharArray>::New();
377 scalars->SetNumberOfComponents(3);
378 scalars->SetName(
"Colors");
386 vtkSmartPointer<vtkCellArray> triangles = vtkSmartPointer<vtkCellArray>::New();
387 vtkSmartPointer<vtkIdTypeArray> tri_data = vtkSmartPointer<vtkIdTypeArray>::New();
389 vtkIdType* tri_buf =
new vtkIdType[n_i * 4];
390 for(
size_t i = 0; i < n_i; i++)
392 size_t index = 3 * i;
394 tri_buf[i2 + 0] =
static_cast<vtkIdType
>(3);
395 tri_buf[i2 + 1] =
static_cast<vtkIdType
>(indices[index + 0]);
396 tri_buf[i2 + 2] =
static_cast<vtkIdType
>(indices[index + 1]);
397 tri_buf[i2 + 3] =
static_cast<vtkIdType
>(indices[index + 2]);
404 tri_data->SetVoidArray(tri_buf, n_i * 4, 0, vtkIdTypeArray::VTK_DATA_ARRAY_DELETE);
406 triangles->SetCells(n_i, tri_data);
409 mesh->SetPoints(points);
410 mesh->SetPolys(triangles);
413 mesh->GetPointData()->SetScalars(scalars);
416 vtkSmartPointer<vtkPolyDataMapper> mesh_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
419 mesh_mapper->SetInput(mesh);
421 mesh_mapper->SetInputData(mesh);
423 meshActor->SetMapper(mesh_mapper);
424 meshActor->GetProperty()->BackfaceCullingOff();
425 vtkSmartPointer<vtkPolyDataMapper> wireframe_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
428 wireframe_mapper->SetInput(mesh);
430 wireframe_mapper->SetInputData(mesh);
443 vtkSmartPointer<vtkProperty>
p = meshActor->GetProperty();
444 p->SetColor(0.9, 0.9, 0.9);
445 meshActor->SetProperty(p);
453 mesh_mapper->Update();
lvr2::ChunkManager m_chunkManager
const BoundingBox< BaseVector< float > > & getBoundingBox() const
float getChunkSize() const
std::vector< BaseVector< float > > m_lastCentroids
void addInitialActors(vtkSmartPointer< vtkRenderer > renderer)
std::vector< size_t > m_highResIndices
std::shared_ptr< MeshBuffer > MeshBufferPtr
BoundingBox< BaseVector< float > > m_lastRegion
vtkSmartPointer< vtkActor > getActor()
BoundingBox< BaseVector< float > > m_region
std::unordered_map< size_t, vtkSmartPointer< vtkActor > > actorMap
static Timestamp timestamp
A global time stamp object for program runtime measurement.
MeshBufferPtr extractArea(const BoundingBox< BaseVector< float >> &area, std::string layer=std::string("mesh"))
extractArea creates and returns MeshBufferPtr of merged chunks for given area.
LVRChunkedMeshBridge(std::string file, vtkSmartPointer< vtkRenderer > renderer, std::vector< std::string > layers, size_t cache_size=1000)
boost::shared_array< unsigned char > ucharArr
void setVisibility(bool visible)
Eigen::Vector3d Vector3d
Eigen 3D vector, double precision.
void fetchHighRes(BoundingBox< BaseVector< float > > bb, std::vector< size_t > indices, std::vector< BaseVector< float >> centroids)
A dynamic bounding box class.
BaseVecT getCentroid() const
Returns the center Vector of the bounding box.
std::unique_ptr< MeshOctree< BaseVector< float > > > m_oct
std::vector< std::string > m_layers
vtkSmartPointer< vtkActor > computeMeshActor(size_t &id, MeshBufferPtr &chunk)
boost::shared_array< unsigned int > indexArray
boost::shared_array< float > floatArr
void getActors(double planes[24], std::vector< BaseVector< float > > ¢roids, std::vector< size_t > &indices)
std::unordered_map< size_t, MeshBufferPtr > m_chunks
std::condition_variable cond_
std::unordered_map< size_t, MeshBufferPtr > m_highRes
std::unordered_map< size_t, vtkSmartPointer< vtkActor > > m_highResActors
std::vector< size_t > m_lastIndices
std::unordered_map< size_t, vtkSmartPointer< vtkActor > > m_chunkActors
void updateHighRes(actorMap lowRes, actorMap highRes)
size_t numElements() const
std::vector< BaseVector< float > > m_highResCentroids