/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/********************************************************************/
#pragma once
#include "mg/Attrib.h"
#include "mgGL/Name.h"
#include "mg/Plane.h"

/// @class MGNamedCPlaneItem NamedCPlaneItem.h "ViewCmd/NamedCPlaneItem.h"
/// 「名前付き作業平面」コマンドで保存するためのデータクラス。
class MGNamedCPlaneItem : public MGAttrib
{
	MGName m_name; ///< 名前
	MGPlane m_plane; ///< 平面そのもの

public:
	/// identify_type 用の値。
	enum{ TID = MGATTRIB_TID | 0x00FF0002};

	/// デフォルトコンストラクター
	/// @post m_name.empty()
	///       m_plane.is_null()
	MGNamedCPlaneItem();

	/// 名前と値を指定してオブジェクトを初期化。
	/// @param[in] name 設定の名称
	/// @param[in] plane 平面
	/// @post m_name == name
	///       m_plane == plane
	MGNamedCPlaneItem(const CString& name, const MGPlane& plane);

	/// コピーコンストラクターによるクローンオブジェクトを返す。
	/// @return クローンオブジェクト
	virtual MGNamedCPlaneItem* clone() const;

	virtual void drawAttrib(
		mgVBO& vbo,///<The target graphic object.
		bool no_color = false	///<if true, color attribute will be neglected.
	)const{		;	};

	/// @return TID
	virtual long identify_type() const;

	/// ストリームによる出力。
	/// @param[in,out] s 出力ストリーム
	/// @return s
	virtual std::ostream& toString(std::ostream& ostrm) const override;

	/// このクラス名称を返す。
	/// @return 文字列 "MGNamedCPlaneItem"
	virtual std::string whoami() const;

	/// 設定名称を返す。
	/// @return m_name
	const MGName& name() const;

	/// 設定名称をセットする。
	/// @post name == m_name
	void set_name(const CString& name);

	/// 作業平面の形状を返す。
	/// @return m_plane
	const MGPlane& plane() const;

	/// 作業平面の形状をセットする。
	/// @post plane == m_plane
	void set_plane(const MGPlane& plane);

protected:
	virtual void ReadMembers(MGIfstream& s);
	virtual void WriteMembers(MGOfstream& s) const;
};

