PeriDyno 1.0.0
Loading...
Searching...
No Matches
VtkSurfaceVisualModule.cpp
Go to the documentation of this file.
2
3// framework
4#include <Node.h>
5#include <SceneGraph.h>
6#include <Topology/TriangleSet.h>
7
8#include <vtkActor.h>
9#include <vtkCubeSource.h>
10#include <vtkOpenGLPolyDataMapper.h>
11#include <vtkOpenGLRenderWindow.h>
12#include <vtkOpenGLRenderer.h>
13#include <vtkOpenGLVertexBufferObjectCache.h>
14#include <vtkOpenGLVertexBufferObjectGroup.h>
15#include <vtkPolyData.h>
16#include <vtkFloatArray.h>
17#include <vtkOpenGLVertexBufferObject.h>
18#include <vtkOpenGLIndexBufferObject.h>
19
20#ifdef _WIN32
21#include <windows.h>
22#endif
23
24#include <cuda_gl_interop.h>
25
26using namespace dyno;
27
28class SurfaceMapper : public vtkOpenGLPolyDataMapper
29{
30public:
32 {
33 // create psedo data, required by the vtkOpenGLPolyDataMapper to render content
34 vtkNew<vtkCubeSource> psedoData;
35 SetInputConnection(psedoData->GetOutputPort());
36 }
37
38 void ComputeBounds() override
39 {
40 // TODO: we might need the accurate bound of the node
41 this->GetInput()->GetBounds(this->Bounds);
42 }
43
44 void UpdateBufferObjects(vtkRenderer *ren, vtkActor *act) override
45 {
46 if (!m_module->isDirty())
47 return;
48
49 if (!m_module->isInitialized()) return;
50
51 auto node = m_module->getParent();
52
53 if (node == NULL || !node->isVisible()) return;
54
55 auto mesh = m_module->inTriangleSet()->getDataPtr();
56 auto& faces = mesh->getTriangles();
57 auto& verts = mesh->getPoints();
58
59 cudaError_t error;
60
61 if (!m_initialized)
62 {
63 m_initialized = true;
64
65 // vertex buffer
66 vtkNew<vtkPoints> tempVertData;
67 tempVertData->SetNumberOfPoints(verts.size());
68
69 vtkOpenGLRenderWindow* renWin = vtkOpenGLRenderWindow::SafeDownCast(ren->GetRenderWindow());
70 vtkOpenGLVertexBufferObjectCache* cache = renWin->GetVBOCache();
71 this->VBOs->CacheDataArray("vertexMC", tempVertData->GetData(), cache, VTK_FLOAT);
72 this->VBOs->BuildAllVBOs(cache);
73 vtkOpenGLVertexBufferObject* vertexBuffer = this->VBOs->GetVBO("vertexMC");
74
75 // index buffer
76 this->Primitives[PrimitiveTris].IBO;
77 std::vector<unsigned int> indexArray(faces.size() * 3);
78 this->Primitives[PrimitiveTris].IBO->Upload(indexArray, vtkOpenGLIndexBufferObject::ElementArrayBuffer);
79 this->Primitives[PrimitiveTris].IBO->IndexCount = indexArray.size();
80 vtkOpenGLIndexBufferObject* indexBuffer = this->Primitives[PrimitiveTris].IBO;
81
82 // create memory mapper for CUDA
83 error = cudaGraphicsGLRegisterBuffer(&m_cudaVBO, vertexBuffer->GetHandle(), cudaGraphicsRegisterFlagsWriteDiscard);
84 //printf("%s\n", cudaGetErrorName(error));
85 error = cudaGraphicsGLRegisterBuffer(&m_cudaIBO, indexBuffer->GetHandle(), cudaGraphicsRegisterFlagsWriteDiscard);
86
87 // copy index buffer, maybe only need once...
88 {
89 size_t size;
90 void* cudaPtr = 0;
91 error = cudaGraphicsMapResources(1, &m_cudaIBO);
92 error = cudaGraphicsResourceGetMappedPointer(&cudaPtr, &size, m_cudaIBO);
93 error = cudaMemcpy(cudaPtr, faces.begin(), faces.size() * sizeof(unsigned int) * 3, cudaMemcpyDeviceToDevice);
94 error = cudaGraphicsUnmapResources(1, &m_cudaIBO);
95 }
96 }
97
98 // copy vertex memory
99 {
100 size_t size;
101 void* cudaPtr = 0;
102
103 // upload vertex
104 error = cudaGraphicsMapResources(1, &m_cudaVBO);
105 //printf("1, %s\n", cudaGetErrorName(error));
106 error = cudaGraphicsResourceGetMappedPointer(&cudaPtr, &size, m_cudaVBO);
107 error = cudaMemcpy(cudaPtr, verts.begin(), verts.size() * sizeof(float) * 3, cudaMemcpyDeviceToDevice);
108 error = cudaGraphicsUnmapResources(1, &m_cudaVBO);
109 }
110 }
111
112private:
114
115 bool m_initialized = false;
116
117 cudaGraphicsResource* m_cudaVBO;
118 cudaGraphicsResource* m_cudaIBO;
119};
120
122
124{
125 this->setName("surface_renderer");
126
127 m_actor = vtkActor::New();
128 m_actor->SetMapper(new SurfaceMapper(this));
129}
130
#define IMPLEMENT_CLASS_COMMON(name, func)
Definition Object.h:73
void UpdateBufferObjects(vtkRenderer *ren, vtkActor *act) override
cudaGraphicsResource * m_cudaVBO
void ComputeBounds() override
cudaGraphicsResource * m_cudaIBO
dyno::VtkSurfaceVisualModule * m_module
SurfaceMapper(VtkSurfaceVisualModule *v)
void setName(std::string name)
Definition Module.cpp:187
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25