#pragma once

#ifdef OPENGLUT


#include "OpenGlutStringSigned.h"

#include <C2/lm/vector2.h>
#include <C2/lm/vector3.h>

#include <sstream>



//! 位置指定付の文字列描画
inline void glutBitmapString3f(const lm::vec3f& pos, void* font, const char* string)
{
	glRasterPos3f(pos.x, pos.y, pos.z);
	glutBitmapString(font, string);
}

//! 位置指定付の文字列描画
inline void glutBitmapString2f(const lm::vec2f& pos, void* font, const char* string)
{
	glRasterPos2f(pos.x, pos.y);
	glutBitmapString(font, string);
}

//! 値を文字列化して描画
template<typename T>
inline void glutBitmapStringVal(void* font, const T& val)
{
	std::ostringstream s;
	s << val;
	glutBitmapString(font, s.str().c_str());
}

//! 位置指定付の値出力
template<typename T>
inline void glutBitmapStringVal3f(const lm::vec3f& pos, void* font, const T& val)
{
	glRasterPos3f(pos.x, pos.y, pos.z);
	glutBitmapStringVal(font, val);
}

//! 位置指定付の値出力
template<typename T>
inline void glutBitmapStringVal2f(const lm::vec2f& pos, void* font, const T& val)
{
	glRasterPos2f(pos.x, pos.y);
	glutBitmapStringVal(font, val);
}


//! デフォルトフォントを使用した文字列描画
inline void glutBitmapString(const char* string)
{
	glutBitmapString(GLUT_BITMAP_HELVETICA_18, string);
}

//! 位置指定付のデフォルトフォントを使用した文字列描画
inline void glutBitmapString3f(const lm::vec3f& pos, const char* string)
{
	glutBitmapString3f(pos, GLUT_BITMAP_HELVETICA_18, string);
}

//! 位置指定付のデフォルトフォントを使用した文字列描画
inline void glutBitmapString2f(const lm::vec2f& pos, const char* string)
{
	glutBitmapString2f(pos, GLUT_BITMAP_HELVETICA_18, string);
}

template<typename T>
inline void glutBitmapStringVal(const T& val)
{
	glutBitmapStringVal(GLUT_BITMAP_HELVETICA_18, val);
}

template<typename T>
inline void glutBitmapStringVal3f(const lm::vec3f& pos, const T& val)
{
	glutBitmapStringVal3f(pos, GLUT_BITMAP_HELVETICA_18, val);
}

template<typename T>
inline void glutBitmapStringVal2f(const lm::vec2f& pos, const T& val)
{
	glutBitmapStringVal2f(pos, GLUT_BITMAP_HELVETICA_18, val);
}


inline void glutBitmapBillboardString(int view_width, int view_height, int line, void* font, const char* string)
{
	glPushAttrib(GL_TRANSFORM_BIT|GL_ENABLE_BIT);
	glDisable(GL_DEPTH_TEST);
	glDisable(GL_LIGHTING);

	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();

	float half_w = view_width * 0.5f;
	float half_h = view_height * 0.5f;
	glOrtho( -half_w , half_w , -half_h , half_h , 0 , 1 );

	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glLoadIdentity();
	
	lm::vec2f pos(-half_w + 10, half_h - 20 * (line + 1));
	glutBitmapString2f(pos, string);

	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();
	glMatrixMode(GL_MODELVIEW);

	glPopAttrib();
}

inline void glutBitmapBillboardString(int view_width, int view_height, int line, const char* string)
{
	glutBitmapBillboardString(view_width, view_height, line, GLUT_BITMAP_HELVETICA_18, string);
}

template<typename T>
inline void glutBitmapBillboardStringVal(int view_width, int view_height, int line, const T& val)
{
	std::ostringstream s;
	s << val;
	glutBitmapBillboardString(view_width, view_height, line, GLUT_BITMAP_HELVETICA_18, s.str().c_str());
}


#endif
