00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef SOFA_GPU_CUDA_CUDASPATIALGRIDCONTAINER_INL
00038 #define SOFA_GPU_CUDA_CUDASPATIALGRIDCONTAINER_INL
00039
00040 #include <sofa/gpu/cuda/CudaSpatialGridContainer.h>
00041 #include <sofa/component/container/SpatialGridContainer.inl>
00042
00043 namespace sofa
00044 {
00045
00046 namespace gpu
00047 {
00048
00049 namespace cuda
00050 {
00051
00052 extern "C"
00053 {
00054 void SpatialGridContainer3f_updateGrid(int cellBits, float cellWidth, int nbPoints, void* particleHash, void* sortTmp, void* cellStart, const void* x);
00055 void SpatialGridContainer3f1_updateGrid(int cellBits, float cellWidth, int nbPoints, void* particleHash, void* sortTmp, void* cellStart, const void* x);
00056 void SpatialGridContainer3f_reorderData(int nbPoints, const void* particleHash, void* sorted, const void* x);
00057 void SpatialGridContainer3f1_reorderData(int nbPoints, const void* particleHash, void* sorted, const void* x);
00058 }
00059
00060 }
00061
00062 }
00063
00064 namespace component
00065 {
00066
00067 namespace container
00068 {
00069
00070 using namespace sofa::helper;
00071
00072
00073
00074
00075 template<class TCoord, class TDeriv, class TReal>
00076 SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::SpatialGrid(Real cellWidth)
00077 : cellWidth(cellWidth), invCellWidth(1/cellWidth), lastX(NULL)
00078 {
00079 cellBits = 16;
00080 nbCells = 1<<cellBits;
00081 }
00082
00083 template<class TCoord, class TDeriv, class TReal> template<class NeighborListener>
00084 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::findNeighbors(NeighborListener* , Real )
00085 {
00086 std::cerr << "TODO: SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::findNeighbors(NeighborListener* dest, Real dist)"<<std::endl;
00087 }
00088
00089 template<class TCoord, class TDeriv, class TReal>
00090 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::computeField(ParticleField* , Real )
00091 {
00092 std::cerr << "TODO: SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::computeField(ParticleField* field, Real dist)"<<std::endl;
00093 }
00094
00095 template<class TCoord, class TDeriv, class TReal>
00096 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::reorderIndices(helper::vector<unsigned int>* , helper::vector<unsigned int>* )
00097 {
00098 std::cerr << "TODO: SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::reorderIndices(helper::vector<unsigned int>* old2new, helper::vector<unsigned int>* new2old)"<<std::endl;
00099 }
00100
00101 template<>
00102 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVec3fTypes > >::kernel_updateGrid(int cellBits, float cellWidth, int nbPoints, void* particleHash, void* sortTmp, void* cellStart, const void* x)
00103 {
00104 gpu::cuda::SpatialGridContainer3f_updateGrid(cellBits, cellWidth, nbPoints, particleHash, sortTmp, cellStart, x);
00105 }
00106
00107 template<>
00108 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVec3f1Types > >::kernel_updateGrid(int cellBits, float cellWidth, int nbPoints, void* particleHash, void* sortTmp, void* cellStart, const void* x)
00109 {
00110 gpu::cuda::SpatialGridContainer3f1_updateGrid(cellBits, cellWidth, nbPoints, particleHash, sortTmp, cellStart, x);
00111 }
00112
00113 template<>
00114 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVec3fTypes > >::kernel_reorderData(int nbPoints, const void* particleHash, void* sorted, const void* x)
00115 {
00116 gpu::cuda::SpatialGridContainer3f_reorderData(nbPoints, particleHash, sorted, x);
00117 }
00118
00119 template<>
00120 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVec3f1Types > >::kernel_reorderData(int nbPoints, const void* particleHash, void* sorted, const void* x)
00121 {
00122 gpu::cuda::SpatialGridContainer3f1_reorderData(nbPoints, particleHash, sorted, x);
00123 }
00124
00125 template<class TCoord, class TDeriv, class TReal>
00126 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::update(const VecCoord& x)
00127 {
00128 lastX = &x;
00129 data.clear();
00130 int nbPoints = x.size();
00131 particleHash.fastResize(nbPoints);
00132 sortTmp.fastResize(nbPoints);
00133 cellStart.fastResize(nbCells);
00134 sortedPos.fastResize(nbPoints);
00135 kernel_updateGrid(cellBits, cellWidth, nbPoints, particleHash.deviceWrite(), sortTmp.deviceWrite(), cellStart.deviceWrite(), x.deviceRead());
00136 kernel_reorderData(nbPoints, particleHash.deviceRead(), sortedPos.deviceWrite(), x.deviceRead());
00137 }
00138
00139 template<class TCoord, class TDeriv, class TReal>
00140 void SpatialGrid< SpatialGridTypes < gpu::cuda::CudaVectorTypes<TCoord,TDeriv,TReal> > >::draw()
00141 {
00142 if (!lastX) return;
00143 int nbPoints = particleHash.size();
00144 glDisable(GL_LIGHTING);
00145 glColor4f(1,1,1,1);
00146 glPointSize(3);
00147 glBegin(GL_POINTS);
00148 for (int i=0;i<nbPoints;i++)
00149 {
00150 unsigned int cell = particleHash[i][0];
00151
00152
00153
00154 int r = cell&3;
00155 int g = (cell>>2)&3;
00156 int b = (cell>>4)&3;
00157 glColor4ub(63+r*64,63+g*64,63+b*64,255);
00158 glVertex3fv(sortedPos[i].ptr());
00159
00160 }
00161 glEnd();
00162 glPointSize(1);
00163 }
00164
00165 }
00166
00167 }
00168
00169 }
00170
00171 #endif