
/*
*************************************************************************************************

平面描画用のビューポート, 投影などを制御するクラス

*************************************************************************************************
*/


#pragma once


#include "Viewport.h"

#include <C2/lm/vector3.h>

#include "GlInclude.h"


namespace lib_gl
{


//! 2D描画用の投影行列制御
//! glutSolidSphere(100,32,32)で半径100ピクセルの円が表示されるような設定を
//! 自動で行う.
class FlatView
{
public:
	FlatView(void)
	{
		m_Origin.set_zero();
		m_Zoom = 1.0f;
	}

	void SetGLLookAt(void);
	void SetGLProjection(void);
	void SetGLLookAtProjection(void);

	lm::vec3f GetViewCenter(void) const;


public:
	lm::vec3f           m_Origin;    //!< ビューの原点(左下)
	double              m_Zoom;      //!< レンダリング時のズーム
	lib_gl::Viewport    m_Viewport;  //<! レンダリング先ビューポート
};



inline void FlatView::SetGLLookAt(void)
{
	// 視点
	double px = m_Origin.x;
	double py = m_Origin.y;
	double pz = 1.0;
	// 注視点
	double vx = m_Origin.x;
	double vy = m_Origin.y;
	double vz = 0.0;
	// 上
	double ox = 0.0;
	double oy = 1.0;
	double oz = 0.0;

	gluLookAt( px , py , pz , vx , vy , vz , ox , oy , oz );
}

inline void FlatView::SetGLProjection(void)
{
	GLdouble w = (GLdouble)m_Viewport.Width  * m_Zoom;
	GLdouble h = (GLdouble)m_Viewport.Height * m_Zoom;
	glOrtho( 0.0 , w , 0.0 , h , 0.0 , 2.0 );
}

inline void FlatView::SetGLLookAtProjection(void)
{
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	SetGLProjection();

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	SetGLLookAt();
}

inline lm::vec3f FlatView::GetViewCenter(void) const
{
	lm::vec3f center = m_Origin;
	center.x += (float)m_Viewport.Width  * 0.5f * m_Zoom;
	center.y += (float)m_Viewport.Height * 0.5f * m_Zoom;
	return center;
}


}
