/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/********************************************************************/
// EvalCSFold.h: MGEvalCSFoldTool クラスのインターフェイス

#if !defined(AFX_EVALCSFOLD_H__2B74EA06_D083_4D0F_A79F_2EA5F0819D64__INCLUDED_)
#define AFX_EVALCSFOLD_H__2B74EA06_D083_4D0F_A79F_2EA5F0819D64__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "Common/CommandStateOwner.h"
#include "Common/SelectState.h"

class MGCurve;
class MGFSurface;

// class MGEvalCSFoldTool
// 
// 曲線と曲面の折れを評価するコマンドである。
// 曲線 C と曲面 S が1点で共有点を持ち、かつ
// その点が C の端点であるような場合に
// このコマンドは意味を持つ。
//
// 共有点で評価するデータは次の通り：
// - 共有点の位置
// - 共有点における C の接ベクトル
// - 共有点における S の法線ベクトル
// - それらのベクトル積
class MGEvalCSFoldTool : public MGCommandStateOwner{
public:
	explicit MGEvalCSFoldTool(fugenDoc* pDoc);

	virtual MGCommandBase* initial_clone(fugenDoc* pDoc)const;
	virtual bool initiate_tool();
	virtual bool can_break_into()const{return true;};

private:
	bool evaluate();

	void displayInfoOnMessageBox(
		const MGFSurface& surf,
		const MGPosition& uv,
		const MGCurve& curve,
		double t
	);

	MGPickObject m_pocurve;// 離れを計測するための曲線
	MGPickObject m_posurf;// 離れを計測するための曲面
	//const MGCurve*    m_curve;  // 折れを計測する曲線
	//const MGFSurface* m_surf;   // surface or face

	friend class MGEvalCSFoldSCurve;
	friend class MGEvalCSFoldSSurf;
};

// class MGEvalCSFoldSCurve
//
// 曲線を一本だけ選択するstate
class MGEvalCSFoldSCurve : public MGSelectState{
public:
	MGEvalCSFoldSCurve(MGCommandStateOwner* owner);
	MGEvalCSFoldTool* state_owner(){
		return static_cast<MGEvalCSFoldTool*>(get_owner_command());
	}

	virtual bool initiate_tool();
	virtual bool OnSelected(
		fugenView* window,//The fugenView pointer where point input event took place.
		MGPickObjects&	objs,	//selected objects at this selection operation.
		MGPickObjects&	unselected_objects	//unselected objects at this selection operation.
		//unselected_objects.size()>=1 only when the already selected objects are selected
		//when add mode is set(or when operation is done with a crtl key pressed).
		);
};

// class MGEvalCSFoldSSurf
//
// 曲面をひとつだけ選択するstate
class MGEvalCSFoldSSurf : public MGSelectState{
public:
	MGEvalCSFoldSSurf(MGCommandStateOwner* owner);
	MGEvalCSFoldTool* state_owner(){
		return static_cast<MGEvalCSFoldTool*>(get_owner_command());
	}

	virtual bool initiate_tool();
	virtual bool OnSelected(
		fugenView* window,//The fugenView pointer where point input event took place.
		MGPickObjects&	objs,	//selected objects at this selection operation.
		MGPickObjects&	unselected_objects	//unselected objects at this selection operation.
		//unselected_objects.size()>=1 only when the already selected objects are selected
		//when add mode is set(or when operation is done with a crtl key pressed).
		);
};

#endif // !defined(AFX_EVALCSFOLD_H__2B74EA06_D083_4D0F_A79F_2EA5F0819D64__INCLUDED_)
