/// <summary>
/// Save Mesh to disk.
/// </summary>
/// <param name="mesh">The mesh to save.</param>
/// <returns>indicates success or failure</returns>
HRESULT DepthSensor::SaveFile(INuiFusionMesh* pMesh, KinectFusionMeshTypes *saveMeshType)
{
    HRESULT hr = S_OK;

    if (nullptr == pMesh)
    {
        return E_INVALIDARG;
    }

    //string filename;
    cout << "Please enter a file name to write: ";
    getline(cin, filename);
    

    if (filename.substr(filename.find_last_of(".") + 1) == "stl")
    {
        *saveMeshType = Stl;
    }
    else if (filename.substr(filename.find_last_of(".") + 1) == "obj")
    {
        *saveMeshType = Obj;
    }
    //with no extension name ,set default  type ***a.stl
    else
    {
        filename = filename +"a"+".stl";		
    }

    //change file name from string to char*
    char *cfilename = (char*)filename.c_str();

    
    if (Stl == *saveMeshType)
    {
        cout << "Creating and saving mesh in format stl,please waiting...... " << endl;
        hr = WriteBinarySTLMeshFile(pMesh, cfilename);
    }
    else if (Obj == *saveMeshType)
    {
        cout << "Creating and saving mesh in format obj,please waiting...... " << endl;
        hr = WriteAsciiObjMeshFile(pMesh, cfilename);
    }
    else
    {
        hr = E_FAIL;
    }
    return hr;
}
/// <summary>
/// Save Mesh to disk.
/// </summary>
/// <param name="mesh">The mesh to save.</param>
/// <returns>indicates success or failure</returns>
HRESULT CKinectFusionExplorer::SaveMeshFile(INuiFusionMesh* pMesh)
{
    HRESULT hr = S_OK;

    if (nullptr == pMesh)
    {
        return E_INVALIDARG;
    }

    CComPtr<IFileSaveDialog> pSaveDlg;

    // Create the file save dialog object.
    hr = pSaveDlg.CoCreateInstance(__uuidof(FileSaveDialog));

    if (FAILED(hr))
    {
        return hr;
    }

    // Set the dialog title
    hr = pSaveDlg->SetTitle(L"Save Kinect Fusion Mesh");
    if (SUCCEEDED(hr))
    {
        // Set the button text
        hr = pSaveDlg->SetOkButtonLabel (L"Save");
        if (SUCCEEDED(hr))
        {
            // Set a default filename
            if (m_bStlMeshFormat)
            {
                hr = pSaveDlg->SetFileName(L"MeshedReconstruction.stl");
            }
            else
            {
                hr = pSaveDlg->SetFileName(L"MeshedReconstruction.obj");
            }

            if (SUCCEEDED(hr))
            {
                // Set the file type extension
                if (m_bStlMeshFormat)
                {
                    hr = pSaveDlg->SetDefaultExtension(L"stl");
                }
                else
                {
                    hr = pSaveDlg->SetDefaultExtension(L"obj");
                }

                if (SUCCEEDED(hr))
                {
                    // Set the file type filters
                    if (m_bStlMeshFormat)
                    {
                        COMDLG_FILTERSPEC allPossibleFileTypes[] = {
                            { L"Stl mesh files", L"*.stl" },
                            { L"All files", L"*.*" }
                        };

                        hr = pSaveDlg->SetFileTypes(
                            ARRAYSIZE(allPossibleFileTypes),
                            allPossibleFileTypes);
                    }
                    else
                    {
                        COMDLG_FILTERSPEC allPossibleFileTypes[] = {
                            { L"Obj mesh files", L"*.obj" },
                            { L"All files", L"*.*" }
                        };

                        hr = pSaveDlg->SetFileTypes(
                            ARRAYSIZE(allPossibleFileTypes),
                            allPossibleFileTypes );
                    }

                    if (SUCCEEDED(hr))
                    {
                        // Show the file selection box
                        hr = pSaveDlg->Show(m_hWnd);

                        // Save the mesh to the chosen file.
                        if (SUCCEEDED(hr))
                        {
                            CComPtr<IShellItem> pItem;
                            hr = pSaveDlg->GetResult(&pItem);

                            if (SUCCEEDED(hr))
                            {
                                LPOLESTR pwsz = nullptr;
                                hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pwsz);

                                if (SUCCEEDED(hr))
                                {
                                    SetStatusMessage(L"Saving mesh file, please wait...");
                                    SetCursor(LoadCursor(nullptr, MAKEINTRESOURCE(IDC_WAIT)));

                                    if (m_bStlMeshFormat)
                                    {
                                        hr = WriteBinarySTLMeshFile(pMesh, pwsz);
                                    }
                                    else
                                    {
                                        hr = WriteAsciiObjMeshFile(pMesh, pwsz);
                                    }

                                    CoTaskMemFree(pwsz);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return hr;
}