diff options
author | Daniel Genrich <daniel.genrich@gmx.net> | 2007-11-26 03:26:29 +0300 |
---|---|---|
committer | Daniel Genrich <daniel.genrich@gmx.net> | 2007-11-26 03:26:29 +0300 |
commit | bc2c9336fdb6baf21bba58e042cbd4b039e25971 (patch) | |
tree | 7ad70ab92bb30da5c8359b0e2b4dc9f044b4d15f /intern/elbeem | |
parent | c8a412cdcb4059990c2e23f42ee54691daedf13a (diff) |
ccherrett pre-alpha subsurf openmp code
Diffstat (limited to 'intern/elbeem')
-rw-r--r-- | intern/elbeem/intern/isosurface.cpp | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/intern/elbeem/intern/isosurface.cpp b/intern/elbeem/intern/isosurface.cpp index 9925565b85d..5d20e68ef34 100644 --- a/intern/elbeem/intern/isosurface.cpp +++ b/intern/elbeem/intern/isosurface.cpp @@ -156,13 +156,6 @@ void IsoSurface::triangulate( void ) mpEdgeVerticesZ[i] = -1; } - ntlVec3Gfx pos[8]; - float value[8]; - int cubeIndex; // index entry of the cube - int triIndices[12]; // vertex indices - int *eVert[12]; - IsoLevelVertex ilv; - // edges between which points? const int mcEdges[24] = { 0,1, 1,2, 2,3, 3,0, @@ -189,7 +182,12 @@ void IsoSurface::triangulate( void ) px = mStart[0]-gsx*0.5; for(int i=1;i<(mSizex-2);i++) { px += gsx; - + int cubeIndex; // index entry of the cube + float value[8]; + int triIndices[12]; // vertex indices + int *eVert[12]; + IsoLevelVertex ilv; + value[0] = *getData(i ,j ,k ); value[1] = *getData(i+1,j ,k ); value[2] = *getData(i+1,j+1,k ); @@ -235,6 +233,7 @@ void IsoSurface::triangulate( void ) eVert[11] = &mpEdgeVerticesZ[ ISOLEVEL_INDEX( i+0, j+1, edgek+0) ]; // grid positions + ntlVec3Gfx pos[8]; pos[0] = ntlVec3Gfx(px ,py ,pz); pos[1] = ntlVec3Gfx(px+gsx,py ,pz); pos[2] = ntlVec3Gfx(px+gsx,py+gsy,pz); @@ -340,10 +339,7 @@ void IsoSurface::triangulate( void ) if(mUseFullEdgeArrays) { errMsg("IsoSurface::triangulate","Disabling mUseFullEdgeArrays!"); } - - // subdiv local arrays - gfxReal orgval[8]; - gfxReal subdAr[2][11][11]; // max 10 subdivs! + ParticleObject* *arppnt = new ParticleObject*[mSizez*mSizey*mSizex]; // construct pointers @@ -404,13 +400,27 @@ void IsoSurface::triangulate( void ) debMsgStd("IsoSurface::triangulate",DM_MSG,"Starting. Parts in use:"<<pInUse<<", Subdivs:"<<mSubdivs, 9); pz = mStart[2]-(double)(0.*gsz)-0.5*orgGsz; +/* +#pragma omp parallel +{ + vector<IsoLevelVertex> mPoints; + */ +#pragma omp parallel for for(int ok=1;ok<(mSizez-2)*mSubdivs;ok++) { pz += gsz; const int k = ok/mSubdivs; if(k<=0) continue; // skip zero plane for(int j=1;j<(mSizey-2);j++) { for(int i=1;i<(mSizex-2);i++) { - + float value[8]; + ntlVec3Gfx pos[8]; + int cubeIndex; // index entry of the cube + int triIndices[12]; // vertex indices + int *eVert[12]; + IsoLevelVertex ilv; + gfxReal orgval[8]; + gfxReal subdAr[2][11][11]; // max 10 subdivs! + orgval[0] = *getData(i ,j ,k ); orgval[1] = *getData(i+1,j ,k ); orgval[2] = *getData(i+1,j+1,k ); // with subdivs @@ -422,6 +432,7 @@ void IsoSurface::triangulate( void ) // prebuild subsampled array slice const int sdkOffset = ok-k*mSubdivs; + for(int sdk=0; sdk<2; sdk++) for(int sdj=0; sdj<mSubdivs+1; sdj++) for(int sdi=0; sdi<mSubdivs+1; sdi++) { @@ -576,8 +587,11 @@ void IsoSurface::triangulate( void ) // init isolevel vertex ilv.v = p1 + (p2-p1)*mu; // with subdivs +#pragma omp critical + { mPoints.push_back( ilv ); triIndices[e] = (mPoints.size()-1); + } // store vertex *eVert[ e ] = triIndices[e]; } else { @@ -587,7 +601,8 @@ void IsoSurface::triangulate( void ) } // along all edges } // removed cutoff treatment... - +#pragma omp critical + { // Create the triangles... for(int e=0; mcTriTable[cubeIndex][e]!=-1; e+=3) { mIndices.push_back( triIndices[ mcTriTable[cubeIndex][e+0] ] ); @@ -595,7 +610,7 @@ void IsoSurface::triangulate( void ) mIndices.push_back( triIndices[ mcTriTable[cubeIndex][e+2] ] ); //errMsg("TTT"," i1"<<mIndices[mIndices.size()-3]<<" "<< " i2"<<mIndices[mIndices.size()-2]<<" "<< " i3"<<mIndices[mIndices.size()-1]<<" "<< mIndices.size() ); } - + } } // triangles in edge table? }//si @@ -603,7 +618,9 @@ void IsoSurface::triangulate( void ) }//i }// j - +#pragma omp barrier +#pragma omp critical + { // copy edge arrays for(int j=0;j<(mSizey-0)*mSubdivs;j++) for(int i=0;i<(mSizex-0)*mSubdivs;i++) { @@ -617,9 +634,13 @@ void IsoSurface::triangulate( void ) mpEdgeVerticesY[ src ]=-1; // with subdivs mpEdgeVerticesZ[ src ]=-1; } + } // */ } // ok, k subdiv loop + + // push_back()'s +// } //delete [] subdAr; delete [] arppnt; |