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

#include "stdafx.h"
#include "fugen.h"
#include "GLMeshInfoDlg.h"

#include "mg/MGStl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// CGLMeshInfoDlg ダイアログ

IMPLEMENT_DYNAMIC(CGLMeshInfoDlg, CDialog)
CGLMeshInfoDlg::CGLMeshInfoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGLMeshInfoDlg::IDD, pParent),
	  m_maxX(0.),
	  m_maxY(0.),
	  m_maxZ(0.),
	  m_minX(0.),
	  m_minY(0.),
	  m_minZ(0.),
	  m_nTriangle(0),
	  m_nVert(0)
{
}

CGLMeshInfoDlg::~CGLMeshInfoDlg()
{
}

void CGLMeshInfoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);

	// 図形の座標の最大値、最小値表示用エディットボックス
	DDX_Text(pDX, IDC_MAX_X, m_maxX);
	DDX_Text(pDX, IDC_MAX_Y, m_maxY);
	DDX_Text(pDX, IDC_MAX_Z, m_maxZ);
	DDX_Text(pDX, IDC_MIN_X, m_minX);
	DDX_Text(pDX, IDC_MIN_Y, m_minY);
	DDX_Text(pDX, IDC_MIN_Z, m_minZ);
	// 三角形数、頂点数表示用エディットボックス
	DDX_Text(pDX, IDC_TRIANGLE, m_nTriangle);
	DDX_Text(pDX, IDC_VERTEX, m_nVert);

	/*
	if(!pDX->m_bSaveAndValidate){
		CutEditBoxDigit();
	}*/
}

BEGIN_MESSAGE_MAP(CGLMeshInfoDlg, CDialog)
END_MESSAGE_MAP()

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

	// 特別な初期化が必要な場合にここに書くことになる

	return TRUE;
}

// ダイアログの[size information]の内部にある
// エディットボックスに図形のボックス枠の
// X, Y, Z座標の最大値、最小値を設定する
// 例外:no throw
void CGLMeshInfoDlg::SetBoxEdit(const MGBox& box)
{
	// ボックス枠の各座標の最大、最小値を取り出す
	const MGPosition& minPos = box.low();
	// コントロール変数に設定
	m_minX = MGCL::decimalAlign(minPos[0]);
	m_minY = MGCL::decimalAlign(minPos[1]);
	m_minZ = MGCL::decimalAlign(minPos[2]);

	const MGPosition& maxPos = box.high();
	m_maxX = MGCL::decimalAlign(maxPos[0]);
	m_maxY = MGCL::decimalAlign(maxPos[1]);
	m_maxZ = MGCL::decimalAlign(maxPos[2]);
}

// ボックス枠を指すエディットボックスに表示されている
// 文字列の8文字以降を表示しないようにする
void CGLMeshInfoDlg::CutEditBoxDigit()
{
	// エディットボックスに表示されている文字列を
	// 開始位置から終了位置まで削除する
	EraseEditString(8, -1, IDC_MIN_X);
	EraseEditString(8, -1, IDC_MIN_Y);
	EraseEditString(8, -1, IDC_MIN_Z);
	EraseEditString(8, -1, IDC_MAX_X);
	EraseEditString(8, -1, IDC_MAX_Y);
	EraseEditString(8, -1, IDC_MAX_Z);
}

// 指定したエディットボックスの文字列を
// 指定した範囲だけ削除し、カーソルをエディットボックスの先頭に戻す
void CGLMeshInfoDlg::EraseEditString(
	int start, // 削除する文字列の開始位置
	int end,   // 削除する文字列の終了位置
	int ID	   // 対象のエディットボックスのリソースID
	)
{
	CEdit* pEdit = (CEdit*)GetDlgItem(ID);
	// 指定した範囲の文字列を選択する
	pEdit->SetSel(start,end);
	// 選択した文字列を削除する
	pEdit->Clear();
	// カーソルの位置をエディットボックスの先頭に戻す
	pEdit->SetSel(0,0);
}

// 三角形の数、頂点数を表示するエディットボックスメンバに
// 三角形数、頂点数を設定する
void CGLMeshInfoDlg::SetTriangleEdit(const std::vector<UniqueStl>& stl){
	ASSERT(!stl.empty());

	size_t nStl = stl.size();

	const MGStl& stl0 = *stl.front();
	size_t TriangleCount = stl0.normals().size();
	size_t VertexCount = stl0.positions().size();
	MGBox TempBox = stl0.box();
	for(size_t i=1;i<nStl;i++){
		const MGStl& stli = *stl[i];

		TempBox |= stli.box();
		TriangleCount += stli.normals().size();
		VertexCount += stli.positions().size();
	}
	// DDX 付きのメンバーデータに値をセット
	SetBoxEdit(TempBox);
	SetTriangleCount(TriangleCount);
	SetVertexCount(VertexCount);

	// ダイアログの表示を更新
	UpdateData(FALSE);
}
