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

class MGOpenGLView;

/// @class MGNamedViewItem NamedViewItem.h "ViewCmd/NamedViewItem.h"
/// 「名前付きビュー」コマンドで保存するためのデータクラス。
class MGNamedViewItem : public MGAttrib
{
	MGName m_name; ///< 名前
	MGglViewAttrib m_env; ///< カメラ

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

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

	/// 名前と値を指定してオブジェクトを初期化。
	/// @param[in] name 設定の名称
	/// @param[in] env ビューの情報
	/// @post m_name == name
	///       m_env == env
	MGNamedViewItem(const CString& name, const MGglViewAttrib& env);

	/// 名前と値を指定してオブジェクトを初期化。
	/// @param[in] name 設定の名称
	/// @param[in] view ビューの MGOpenGLView メンバーデータ。
	/// @post m_name == name
	MGNamedViewItem(const CString& name, const MGOpenGLView& view);

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

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

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

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

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

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

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

	/// ビュー情報を返す。
	/// @return m_env
	const MGglViewAttrib& view_env() const;

	/// ビュー情報を返す。
	/// @post m_env == view
	void set_view_env(const MGglViewAttrib& view);

	/// MGOpenGLView を基にビュー情報をセットする。
	void set_view_env(const MGOpenGLView& view);

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