/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/**
 * @file CPlaneUtil.h
 * @brief 作業平面コマンドで利用する共通関数
 */
#pragma once

struct IPlaneActionTarget;
class MGConstructionPlane;
class MGPosition;
class MGPlane;
class mgSysGL;
class fugenView;

/** 作業平面のプレビューのため、OpenGL 関数をいくつか呼ぶ。
 *  @param[in] cpl 編集する作業平面。
 *  @param[in] org 作業平面の原点の移動後の位置。
 *  @param[in] xend 作業平面の X 軸末端（原点でないほう）の移動後の位置。
 *  @param[in] yend 作業平面の Y 軸末端（原点でないほう）の移動後の位置。
 *  @param[in] zColor 作業平面の Z 軸の色を指定。=nullptrのとき描画しない。
 *  @param[in] draw_displacement 原点の変位を補助線で描画するならば true をセットする。
 *
 *  @throws 例外は投げない。
 *
 *  利用例としては、コマンドクラスの do_make_temporary_display
 *  から PreviewCPlane 関数を呼び出すことになるだろう。
 */

//Draw a temporal construction plane.
//The cplane to draw is the plane whose origin is org, and...
void PreviewCPlane(
	mgSysGL& vbo,
	const MGConstructionPlane& cplane,
		///<Input the old cplane, whose origin and attributes
		///<are used to draw the new construction plane.
	const MGPosition& org,
	const MGVector& xDir,
	const MGVector& yDir,
	const MGColor* zColor=nullptr,
		//Indicates if the normal line from the origin is necessary to draw.
		//If zColor!=nullptr, draw the line with the color zColor.
	bool draw_displacement=true
		//Indicates if the line from cpl.origin() to org is necessary to draw.
		//If draw_displacement is true, draw the displacement line.
);

/// CPlane 編集用補助関数
/// @param[in,out] pTarget 編集対象の作業平面を持つ何か。
/// @param[in] uderi 作業平面のU方向
/// @param[in] vderi 作業平面のV方向
/// @param[in] origin 作業平面の原点
void ExecPlaneAction(
	IPlaneActionTarget* pTarget,
	const MGVector& uderi,
	const MGVector& vderi,
	const MGPosition& origin
);

/// CPlane 編集用補助関数
/// @param[in,out] pTarget 編集対象の作業平面を持つ何か。
/// @param[in] plNew 編集後の作業平面の形状定義。
void ExecPlaneAction(
	IPlaneActionTarget* pTarget,
	const MGPlane& plNew
);

///Translation of CPlane to toPoint.
void execCPlaneTranslateAction(
		fugenView* view,
		const MGPosition& toPoint
);

/// Get the rotation angle from axes[(rotation_axis+1)%3] to the vector
/// (crsr-orign) around the normal axes[rotation_axis].
double getAngleUAxis(
	const MGPosition& crsr,	//Input the cursor position
	const MGPosition origin,
	int rotation_axis,
	const MGVector axes[3]
);
