[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12679] branches/cloth/blender/intern/ elbeem/intern: Segfault revert, MT should work fine again for subdiv fluids
Daniel Genrich
daniel.genrich at gmx.net
Mon Nov 26 15:50:27 CET 2007
Revision: 12679
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12679
Author: genscher
Date: 2007-11-26 15:50:27 +0100 (Mon, 26 Nov 2007)
Log Message:
-----------
Segfault revert, MT should work fine again for subdiv fluids
Modified Paths:
--------------
branches/cloth/blender/intern/elbeem/intern/isosurface.cpp
branches/cloth/blender/intern/elbeem/intern/loop_tools.h
branches/cloth/blender/intern/elbeem/intern/paraloopend.h
Modified: branches/cloth/blender/intern/elbeem/intern/isosurface.cpp
===================================================================
--- branches/cloth/blender/intern/elbeem/intern/isosurface.cpp 2007-11-26 06:55:17 UTC (rev 12678)
+++ branches/cloth/blender/intern/elbeem/intern/isosurface.cpp 2007-11-26 14:50:27 UTC (rev 12679)
@@ -18,32 +18,28 @@
#define round(x) (x)
#endif
-#if PARALLEL==1
-#include <omp.h>
-#endif
-
/******************************************************************************
* Constructor
*****************************************************************************/
IsoSurface::IsoSurface(double iso) :
- ntlGeometryObject(),
- mSizex(-1), mSizey(-1), mSizez(-1),
- mpData(NULL),
- mIsoValue( iso ),
- mPoints(),
- mUseFullEdgeArrays(false),
- mpEdgeVerticesX(NULL), mpEdgeVerticesY(NULL), mpEdgeVerticesZ(NULL),
- mEdgeArSize(-1),
- mIndices(),
+ ntlGeometryObject(),
+ mSizex(-1), mSizey(-1), mSizez(-1),
+ mpData(NULL),
+ mIsoValue( iso ),
+ mPoints(),
+ mUseFullEdgeArrays(false),
+ mpEdgeVerticesX(NULL), mpEdgeVerticesY(NULL), mpEdgeVerticesZ(NULL),
+ mEdgeArSize(-1),
+ mIndices(),
- mStart(0.0), mEnd(0.0), mDomainExtent(0.0),
- mInitDone(false),
- mSmoothSurface(0.0), mSmoothNormals(0.0),
- mAcrossEdge(), mAdjacentFaces(),
- mCutoff(-1), mCutArray(NULL), // off by default
- mpIsoParts(NULL), mPartSize(0.), mSubdivs(0),
- mFlagCnt(1),
- mSCrad1(0.), mSCrad2(0.), mSCcenter(0.)
+ mStart(0.0), mEnd(0.0), mDomainExtent(0.0),
+ mInitDone(false),
+ mSmoothSurface(0.0), mSmoothNormals(0.0),
+ mAcrossEdge(), mAdjacentFaces(),
+ mCutoff(-1), mCutArray(NULL), // off by default
+ mpIsoParts(NULL), mPartSize(0.), mSubdivs(0),
+ mFlagCnt(1),
+ mSCrad1(0.), mSCrad2(0.), mSCcenter(0.)
{
}
@@ -75,11 +71,11 @@
// init
mIndices.clear();
- mPoints.clear();
+ mPoints.clear();
int nodes = mSizez*mSizey*mSizex;
- mpData = new float[nodes];
- for(int i=0;i<nodes;i++) { mpData[i] = 0.0; }
+ mpData = new float[nodes];
+ for(int i=0;i<nodes;i++) { mpData[i] = 0.0; }
// allocate edge arrays (last slices are never used...)
int initsize = -1;
@@ -97,7 +93,7 @@
mpEdgeVerticesZ = new int[sliceNodes];
initsize = 3*sliceNodes;
}
- for(int i=0;i<mEdgeArSize;i++) { mpEdgeVerticesX[i] = mpEdgeVerticesY[i] = mpEdgeVerticesZ[i] = -1; }
+ for(int i=0;i<mEdgeArSize;i++) { mpEdgeVerticesX[i] = mpEdgeVerticesY[i] = mpEdgeVerticesZ[i] = -1; }
// WARNING - make sure this is consistent with calculateMemreqEstimate
// marching cubes are ready
@@ -110,7 +106,7 @@
/*! Reset all values */
void IsoSurface::resetAll(gfxReal val) {
int nodes = mSizez*mSizey*mSizex;
- for(int i=0;i<nodes;i++) { mpData[i] = val; }
+ for(int i=0;i<nodes;i++) { mpData[i] = val; }
}
@@ -134,9 +130,9 @@
*****************************************************************************/
void IsoSurface::triangulate( void )
{
- double gsx,gsy,gsz; // grid spacing in x,y,z direction
- double px,py,pz; // current position in grid in x,y,z direction
- IsoLevelCube cubie; // struct for a small subcube
+ double gsx,gsy,gsz; // grid spacing in x,y,z direction
+ double px,py,pz; // current position in grid in x,y,z direction
+ // IsoLevelCube cubie; // struct for a small subcube
myTime_t tritimestart = getTime();
if(!mpData) {
@@ -145,16 +141,16 @@
}
// get grid spacing (-2 to have same spacing as sim)
- gsx = (mEnd[0]-mStart[0])/(double)(mSizex-2.0);
- gsy = (mEnd[1]-mStart[1])/(double)(mSizey-2.0);
- gsz = (mEnd[2]-mStart[2])/(double)(mSizez-2.0);
+ gsx = (mEnd[0]-mStart[0])/(double)(mSizex-2.0);
+ gsy = (mEnd[1]-mStart[1])/(double)(mSizey-2.0);
+ gsz = (mEnd[2]-mStart[2])/(double)(mSizez-2.0);
// clean up previous frame
mIndices.clear();
mPoints.clear();
// reset edge vertices
- for(int i=0;i<mEdgeArSize;i++) {
+ for(int i=0;i<mEdgeArSize;i++) {
mpEdgeVerticesX[i] = -1;
mpEdgeVerticesY[i] = -1;
mpEdgeVerticesZ[i] = -1;
@@ -163,447 +159,418 @@
// edges between which points?
const int mcEdges[24] = {
0,1, 1,2, 2,3, 3,0,
- 4,5, 5,6, 6,7, 7,4,
- 0,4, 1,5, 2,6, 3,7 };
+ 4,5, 5,6, 6,7, 7,4,
+ 0,4, 1,5, 2,6, 3,7 };
- const int cubieOffsetX[8] = {
- 0,1,1,0, 0,1,1,0 };
- const int cubieOffsetY[8] = {
- 0,0,1,1, 0,0,1,1 };
- const int cubieOffsetZ[8] = {
- 0,0,0,0, 1,1,1,1 };
+ const int cubieOffsetX[8] = {
+ 0,1,1,0, 0,1,1,0 };
+ const int cubieOffsetY[8] = {
+ 0,0,1,1, 0,0,1,1 };
+ const int cubieOffsetZ[8] = {
+ 0,0,0,0, 1,1,1,1 };
- const int coAdd=2;
+ const int coAdd=2;
// let the cubes march
- if(mSubdivs<=1) {
+ if(mSubdivs<=1) {
- pz = mStart[2]-gsz*0.5;
- for(int k=1;k<(mSizez-2);k++) {
- pz += gsz;
- py = mStart[1]-gsy*0.5;
- for(int j=1;j<(mSizey-2);j++) {
- py += gsy;
- 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;
+ pz = mStart[2]-gsz*0.5;
+ for(int k=1;k<(mSizez-2);k++) {
+ pz += gsz;
+ py = mStart[1]-gsy*0.5;
+ for(int j=1;j<(mSizey-2);j++) {
+ py += gsy;
+ 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 );
- value[3] = *getData(i ,j+1,k );
- value[4] = *getData(i ,j ,k+1);
- value[5] = *getData(i+1,j ,k+1);
- value[6] = *getData(i+1,j+1,k+1);
- value[7] = *getData(i ,j+1,k+1);
+ value[0] = *getData(i ,j ,k );
+ value[1] = *getData(i+1,j ,k );
+ value[2] = *getData(i+1,j+1,k );
+ value[3] = *getData(i ,j+1,k );
+ value[4] = *getData(i ,j ,k+1);
+ value[5] = *getData(i+1,j ,k+1);
+ value[6] = *getData(i+1,j+1,k+1);
+ value[7] = *getData(i ,j+1,k+1);
// check intersections of isosurface with edges, and calculate cubie index
- cubeIndex = 0;
- if (value[0] < mIsoValue) cubeIndex |= 1;
- if (value[1] < mIsoValue) cubeIndex |= 2;
- if (value[2] < mIsoValue) cubeIndex |= 4;
- if (value[3] < mIsoValue) cubeIndex |= 8;
- if (value[4] < mIsoValue) cubeIndex |= 16;
- if (value[5] < mIsoValue) cubeIndex |= 32;
- if (value[6] < mIsoValue) cubeIndex |= 64;
- if (value[7] < mIsoValue) cubeIndex |= 128;
+ cubeIndex = 0;
+ if (value[0] < mIsoValue) cubeIndex |= 1;
+ if (value[1] < mIsoValue) cubeIndex |= 2;
+ if (value[2] < mIsoValue) cubeIndex |= 4;
+ if (value[3] < mIsoValue) cubeIndex |= 8;
+ if (value[4] < mIsoValue) cubeIndex |= 16;
+ if (value[5] < mIsoValue) cubeIndex |= 32;
+ if (value[6] < mIsoValue) cubeIndex |= 64;
+ if (value[7] < mIsoValue) cubeIndex |= 128;
// No triangles to generate?
- if (mcEdgeTable[cubeIndex] == 0) {
- continue;
- }
+ if (mcEdgeTable[cubeIndex] == 0) {
+ continue;
+ }
// where to look up if this point already exists
- int edgek = 0;
- if(mUseFullEdgeArrays) edgek=k;
- const int baseIn = ISOLEVEL_INDEX( i+0, j+0, edgek+0);
- eVert[ 0] = &mpEdgeVerticesX[ baseIn ];
- eVert[ 1] = &mpEdgeVerticesY[ baseIn + 1 ];
- eVert[ 2] = &mpEdgeVerticesX[ ISOLEVEL_INDEX( i+0, j+1, edgek+0) ];
- eVert[ 3] = &mpEdgeVerticesY[ baseIn ];
+ int edgek = 0;
+ if(mUseFullEdgeArrays) edgek=k;
+ const int baseIn = ISOLEVEL_INDEX( i+0, j+0, edgek+0);
+ eVert[ 0] = &mpEdgeVerticesX[ baseIn ];
+ eVert[ 1] = &mpEdgeVerticesY[ baseIn + 1 ];
+ eVert[ 2] = &mpEdgeVerticesX[ ISOLEVEL_INDEX( i+0, j+1, edgek+0) ];
+ eVert[ 3] = &mpEdgeVerticesY[ baseIn ];
- eVert[ 4] = &mpEdgeVerticesX[ ISOLEVEL_INDEX( i+0, j+0, edgek+1) ];
- eVert[ 5] = &mpEdgeVerticesY[ ISOLEVEL_INDEX( i+1, j+0, edgek+1) ];
- eVert[ 6] = &mpEdgeVerticesX[ ISOLEVEL_INDEX( i+0, j+1, edgek+1) ];
- eVert[ 7] = &mpEdgeVerticesY[ ISOLEVEL_INDEX( i+0, j+0, edgek+1) ];
+ eVert[ 4] = &mpEdgeVerticesX[ ISOLEVEL_INDEX( i+0, j+0, edgek+1) ];
+ eVert[ 5] = &mpEdgeVerticesY[ ISOLEVEL_INDEX( i+1, j+0, edgek+1) ];
+ eVert[ 6] = &mpEdgeVerticesX[ ISOLEVEL_INDEX( i+0, j+1, edgek+1) ];
+ eVert[ 7] = &mpEdgeVerticesY[ ISOLEVEL_INDEX( i+0, j+0, edgek+1) ];
- eVert[ 8] = &mpEdgeVerticesZ[ baseIn ];
- eVert[ 9] = &mpEdgeVerticesZ[ ISOLEVEL_INDEX( i+1, j+0, edgek+0) ];
- eVert[10] = &mpEdgeVerticesZ[ ISOLEVEL_INDEX( i+1, j+1, edgek+0) ];
- eVert[11] = &mpEdgeVerticesZ[ ISOLEVEL_INDEX( i+0, j+1, edgek+0) ];
+ eVert[ 8] = &mpEdgeVerticesZ[ baseIn ];
+ eVert[ 9] = &mpEdgeVerticesZ[ ISOLEVEL_INDEX( i+1, j+0, edgek+0) ];
+ eVert[10] = &mpEdgeVerticesZ[ ISOLEVEL_INDEX( i+1, j+1, edgek+0) ];
+ 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);
- pos[3] = ntlVec3Gfx(px ,py+gsy,pz);
- pos[4] = ntlVec3Gfx(px ,py ,pz+gsz);
- pos[5] = ntlVec3Gfx(px+gsx,py ,pz+gsz);
- pos[6] = ntlVec3Gfx(px+gsx,py+gsy,pz+gsz);
- pos[7] = ntlVec3Gfx(px ,py+gsy,pz+gsz);
+ ntlVec3Gfx pos[8];
+ pos[0] = ntlVec3Gfx(px ,py ,pz);
+ pos[1] = ntlVec3Gfx(px+gsx,py ,pz);
+ pos[2] = ntlVec3Gfx(px+gsx,py+gsy,pz);
+ pos[3] = ntlVec3Gfx(px ,py+gsy,pz);
+ pos[4] = ntlVec3Gfx(px ,py ,pz+gsz);
+ pos[5] = ntlVec3Gfx(px+gsx,py ,pz+gsz);
+ pos[6] = ntlVec3Gfx(px+gsx,py+gsy,pz+gsz);
+ pos[7] = ntlVec3Gfx(px ,py+gsy,pz+gsz);
// check all edges
- for(int e=0;e<12;e++) {
- if (mcEdgeTable[cubeIndex] & (1<<e)) {
+ for(int e=0;e<12;e++) {
+ if (mcEdgeTable[cubeIndex] & (1<<e)) {
// is the vertex already calculated?
- if(*eVert[ e ] < 0) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list