TriangleMesh IsotropicParticleMesher::_polygonizeAll(FragmentedVector<MarkerParticle> &particles, 
	                                                 FluidMaterialGrid &materialGrid) {
	int subd = _subdivisionLevel;
	int width = _isize*subd;
	int height = _jsize*subd;
	int depth = _ksize*subd;
	double dx = _dx / (double)subd;

	ImplicitSurfaceScalarField field(width + 1, height + 1, depth + 1, dx);

	int origsubd = materialGrid.getSubdivisionLevel();
	materialGrid.setSubdivisionLevel(subd);
	field.setMaterialGrid(materialGrid);
	materialGrid.setSubdivisionLevel(origsubd);

	field.setPointRadius(_particleRadius);

    for (unsigned int i = 0; i < particles.size(); i++) {
        field.addPoint(particles[i].position);
    }

    Polygonizer3d polygonizer(&field);
    polygonizer.polygonizeSurface();

    return polygonizer.getTriangleMesh();
}
void IsotropicParticleMesher::_getSliceMaterialGrid(int startidx, int endidx,
		                       FluidMaterialGrid &materialGrid,
		                       FluidMaterialGrid &sliceMaterialGrid) {

	int origsubd = materialGrid.getSubdivisionLevel();
	materialGrid.setSubdivisionLevel(_subdivisionLevel);
	
	Material m;
	for (int k = 0; k < sliceMaterialGrid.depth; k++) {
		for (int j = 0; j < sliceMaterialGrid.height; j++) {
			for (int i = 0; i < sliceMaterialGrid.width; i++) {
				m = materialGrid(startidx + i, j, k);
				sliceMaterialGrid.set(i, j, k, m);
			}
		}
	}

	materialGrid.setSubdivisionLevel(origsubd);
}