void CUDAMarchingCubesHashSDF::extractIsoSurface(const HashData& hashData, const HashParams& hashParams, const RayCastData& rayCastData,  const vec3f& minCorner, const vec3f& maxCorner, bool boxEnabled)
{
    resetMarchingCubesCUDA(m_data);

    m_params.m_maxCorner = MatrixConversion::toCUDA(maxCorner);
    m_params.m_minCorner = MatrixConversion::toCUDA(minCorner);
    m_params.m_boxEnabled = boxEnabled;
    m_data.updateParams(m_params);

    extractIsoSurfaceCUDA(hashData, rayCastData, m_params, m_data);
    copyTrianglesToCPU();
}
bool MeshGeneratorMarchingcube::saveMesh(const string& filename)
{
	if(false==copyTrianglesToCPU())
	{
		cout<<"copy triangles to cpu failed"<<endl;
		return false;

	}
	//create index buffer (required for merging the triangle soup)
	_meshes.m_FaceIndicesVertices.resize(_meshes.m_Vertices.size());
	for (unsigned int i = 0; i < (unsigned int)_meshes.m_Vertices.size() / 3; i++) {
		_meshes.m_FaceIndicesVertices[i][0] = 3 * i + 0;
		_meshes.m_FaceIndicesVertices[i][1] = 3 * i + 1;
		_meshes.m_FaceIndicesVertices[i][2] = 3 * i + 2;
	}
	std::cout << "vertices:\t" << _meshes.m_Vertices.size() << std::endl;
	std::cout << "faces :\t" << _meshes.m_FaceIndicesVertices.size() << std::endl;
	std::cout << "merging close vertices... ";
	_meshes.mergeCloseVertices(0.0001f, true);
	std::cout << "done!" << std::endl;
	std::cout << "vertices e:\t" << _meshes.m_Vertices.size() << std::endl;
	std::cout << "faces :\t" << _meshes.m_FaceIndicesVertices.size() << std::endl;
	std::cout << "removing duplicate faces... ";
	_meshes.removeDuplicateFaces();
	std::cout << "done!" << std::endl;
	_meshes.computeVertexNormals();
	std::cout << "vertices :\t" << _meshes.m_Vertices.size() << std::endl;
	std::cout << "faces :\t" << _meshes.m_FaceIndicesVertices.size() << std::endl;

//	m_meshData.applyTransform(transform);

	std::cout << "saving mesh (" << filename << ") ...";
	ml::MeshIOf::saveToFile(filename, _meshes);
	std::cout << "done!" << std::endl;
	return 0;//textureMesh(filename);

}