/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/********************************************************************/
// GLMeshTessDlg.cpp : 実装ファイル

#include "stdafx.h"
#include "fugen.h"
#include "GLMeshTessDlg.h"
#include "GLWndMsg.h"
#include "glmeshtessdlg.h"

// CGLMeshTessDlg ダイアログ

namespace{
	static double CurveTol = -1.;///<Maximum deviation allowed of the approximated polylines from
		///the original boundary curves.
	static double SurfaceTol = -1.;//<Maximum deviation allowed of the approximated facet(triangles) from
				///the original surface.
	static double MaximumEdgeLength = -1.;///<Maximum edge length of the facet(triangles) allowed.
}

IMPLEMENT_DYNAMIC(CGLMeshTessDlg, CDialog)

CGLMeshTessDlg::CGLMeshTessDlg(CWnd* pParent /*=NULL*/)
	 : CDialog(CGLMeshTessDlg::IDD, pParent),
	   m_ctol(CurveTol),
	   m_deviat(SurfaceTol),
	   //m_uvRatio(0),
	   //m_fan_kind(MGCL::SINGLE_TRIANGLE),
	   //m_minimum_triangles(0),
	   m_maxlen(MaximumEdgeLength){
}

CGLMeshTessDlg::~CGLMeshTessDlg(){
	CurveTol=m_ctol;
	SurfaceTol=m_deviat;
	MaximumEdgeLength=m_maxlen;
}

void CGLMeshTessDlg::DoDataExchange(CDataExchange* pDX){
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_TESSP_CTOLIN, m_ctol);
	DDX_Text(pDX, IDC_TESSP_STOLIN, m_deviat);
	//DDX_Text(pDX, IDC_TESSP_MIN_UVR, m_uvRatio);
	DDX_Text(pDX, IDC_TESSP_MAX_EDGE_LENIN, m_maxlen);
	//DDX_Text(pDX, IDC_TESSP_MINTRI, m_minimum_triangles);
}

BEGIN_MESSAGE_MAP(CGLMeshTessDlg, CDialog)
	ON_BN_CLICKED(IDC_REMESH, OnBnClickedRemesh)
END_MESSAGE_MAP()

BOOL CGLMeshTessDlg::OnInitDialog(){
	if(!CDialog::OnInitDialog()){
		return FALSE;
	}

	UpdateData(FALSE);
	return TRUE;
}

void CGLMeshTessDlg::GetTesselValue(mgTLInputParam& tp){
	UpdateData();

	// テセレーションパラメータを設定
	tp.set_max_edge_len(m_maxlen);// 三角形の辺の最大の長さ
	tp.set_crvTol(m_ctol);// 曲線と三角形の最大の離れ
	//tp.set_fanKind((MGCL::fan_kind)m_fan_kind);// 三角形の種類(ファン、もしくはストリップ)
	//tp.set_max_ratio(m_uvRatio);// 三角形の辺の比
	//tp.set_minimum_tri(m_minimum_triangles);// 最小の三角形の数
	tp.set_surfTol(m_deviat);// 面と三角形の最大の離れ
}

void CGLMeshTessDlg::SetTesselValue(const mgTLInputParam& tp){
	// テセレーションパラメータを設定
	m_maxlen = tp.max_edge_len(); // 三角形の辺の最大の長さ
	m_ctol = tp.crvTol(); // 曲線と三角形の最大の離れ
	//m_fan_kind = tp.fanKind(); // 三角形の種類(ファン、もしくはストリップ)
	//m_uvRatio = tp.max_ratio(); // 三角形の辺の比
	//m_minimum_triangles = tp.minimum_tri(); // 最小の三角形の数
	m_deviat = tp.surfTol(); // 面と三角形の最大の離れ

	UpdateData(FALSE);
}

void CGLMeshTessDlg::OnBnClickedRemesh(){
	if(!UpdateData()){
		return;
	}

	// 親ダイアログを経由してコマンドにイベントを投げる
	GetParent()->SendMessage(WM_FUGEN_MESH_PARAM_CHANGED);
}
