diff options
author | Daniel Genrich <daniel.genrich@gmx.net> | 2008-01-30 00:01:12 +0300 |
---|---|---|
committer | Daniel Genrich <daniel.genrich@gmx.net> | 2008-01-30 00:01:12 +0300 |
commit | 77685023caaee092a4c1ed4a3da13ff67861a962 (patch) | |
tree | 6a516a1ef9deebed5d38586be310c00f0d01484f /intern/elbeem | |
parent | 3a3fe8a4805ca0f1db0eec3cca18e1c70b765080 (diff) |
Initial commit of cloth modifier from branch rev 13453
Diffstat (limited to 'intern/elbeem')
-rw-r--r-- | intern/elbeem/CMakeLists.txt | 4 | ||||
-rw-r--r-- | intern/elbeem/SConscript | 6 | ||||
-rw-r--r-- | intern/elbeem/intern/isosurface.cpp | 56 |
3 files changed, 48 insertions, 18 deletions
diff --git a/intern/elbeem/CMakeLists.txt b/intern/elbeem/CMakeLists.txt index 86a60180b05..ac35b8ce00f 100644 --- a/intern/elbeem/CMakeLists.txt +++ b/intern/elbeem/CMakeLists.txt @@ -36,5 +36,9 @@ IF(WINDOWS) ADD_DEFINITIONS(-DUSE_MSVC6FIXES) ENDIF(WINDOWS) +IF(WITH_OPENMP) + ADD_DEFINITIONS(-DPARALLEL) +ENDIF(WITH_OPENMP) + BLENDERLIB_NOLIST(bf_elbeem "${SRC}" "${INC}") #, libtype='blender', priority=0 ) diff --git a/intern/elbeem/SConscript b/intern/elbeem/SConscript index bb6637ba32d..bdcb0507987 100644 --- a/intern/elbeem/SConscript +++ b/intern/elbeem/SConscript @@ -5,7 +5,11 @@ Import('env') sources = env.Glob('intern/*.cpp') -defs = 'NOGUI ELBEEM_BLENDER=1' +defs = ' NOGUI ELBEEM_BLENDER=1' + +if env['WITH_BF_OPENMP'] == 1: + defs += ' PARALLEL' + if env['OURPLATFORM']=='win32-vc': defs += ' USE_MSVC6FIXES' incs = env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC'] + ' ' +env['BF_SDL_INC'] diff --git a/intern/elbeem/intern/isosurface.cpp b/intern/elbeem/intern/isosurface.cpp index 1b0ba13c707..f90621f3b73 100644 --- a/intern/elbeem/intern/isosurface.cpp +++ b/intern/elbeem/intern/isosurface.cpp @@ -22,6 +22,10 @@ #define round(x) (x) #endif +#if PARALLEL==1 +#include <omp.h> +#endif + /****************************************************************************** * Constructor *****************************************************************************/ @@ -160,13 +164,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, @@ -193,7 +190,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 ); @@ -239,6 +241,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); @@ -344,10 +347,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 @@ -408,13 +408,25 @@ 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; + for(int ok=1;ok<(mSizez-2)*mSubdivs;ok++) { pz += gsz; const int k = ok/mSubdivs; if(k<=0) continue; // skip zero plane +#if PARALLEL==1 +#pragma omp parallel for +#endif 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 @@ -426,6 +438,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++) { @@ -580,8 +593,13 @@ void IsoSurface::triangulate( void ) // init isolevel vertex ilv.v = p1 + (p2-p1)*mu; // with subdivs +#if PARALLEL==1 +#pragma omp critical +#endif + { mPoints.push_back( ilv ); triIndices[e] = (mPoints.size()-1); + } // store vertex *eVert[ e ] = triIndices[e]; } else { @@ -591,23 +609,27 @@ void IsoSurface::triangulate( void ) } // along all edges } // removed cutoff treatment... - + // Create the triangles... +#if PARALLEL==1 +#pragma omp critical +#endif + { for(int e=0; mcTriTable[cubeIndex][e]!=-1; e+=3) { mIndices.push_back( triIndices[ mcTriTable[cubeIndex][e+0] ] ); mIndices.push_back( triIndices[ mcTriTable[cubeIndex][e+1] ] ); // with subdivs 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 }// sj }//i }// j - + // copy edge arrays for(int j=0;j<(mSizey-0)*mSubdivs;j++) for(int i=0;i<(mSizex-0)*mSubdivs;i++) { |