/*********************************************************************//**
*	Text ve 3D.
*	Zobrazi text ve 3D prostoru
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_env_text.cpp
**********************************************************************/

#include "ent_environments.h"


EnvText::EnvText() : CBaseEnvironment()
{
	m_iWidth = -1;
	m_uiDlist = 0;
	m_fSize = 0;
	m_sClassName = "env_text";
	m_iProperties = ENT_PARM_RENDER;
	m_pFont = NULL;
	m_pSortBoundingBox = &m_Bounds;
}

void EnvText::passFlags( int flags )
{
	if( flags & REMOTE_USAGE )
		m_bRemoteUsage = true;
}

void EnvText::setText( std::string text )
{
	if( m_pFont )
	{
		m_dsMessage = fontLibrary::DString( text, m_pFont, FONT_ALIGN_CENTER, m_iWidth );
		float size = 0;
		if( m_iWidth == -1 && m_dsMessage.m_pLineList && !m_dsMessage.m_pLineList->empty() )
			size = (float)m_dsMessage.m_pLineList->front().width;
		else
			size = (float)m_iWidth;

		size *= m_fSize;

		m_Bounds.setBasicValues( origin );
		m_Bounds.setRange( sqrt( (2.0f*size*size) ) );
		m_Bounds.m_fBounds[MIN_Z] -= m_dsMessage.m_iHeight;
	}
}


void EnvText::render( RenderData &renderData )
{
	glPushMatrix();
	glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT );
	
	glCallList( m_uiDlist );
			m_dsMessage.draw( 0,0 );
	glPopAttrib();
	glPopMatrix();
}

bool EnvText::renderCullTest( RenderData &renderData )
{
	return renderData.frustum->isBoundsInsideFrustum( m_Bounds );


	return true;
}



void EnvText::compile()
{
	CBaseEnvironment::compile();
	if( !m_bRemoteUsage )
		setText( m_sMessage );
	
	m_uiDlist = glGenLists( 1 );
	glNewList( m_uiDlist, GL_COMPILE );
		glDisable(GL_CULL_FACE);
		glDisable(GL_LIGHTING);
		glTranslatef( 0.0f, -1.0f, 0.0f );
		glTranslatef( origin[0], origin[1], origin[2] );
		glRotatef(angles[1],1.0f,0.0f,0.0f);
		glRotatef(angles[2]+90,0.0f,0.0f,1.0f);
		glRotatef(90,1.0f,0.0f,0.0f);
		glScalef( m_fSize,m_fSize,1.0f );
		glColor3fv( (float*)&rendercolor );
		//glDisable(GL_FOG);
		/*glPushAttrib(GL_FOG_BIT);
		GLfloat colors[4] = { 0.0f,0.0f,0.0f, 1.0f	};
		glFogfv(GL_FOG_COLOR, colors);*/
	glEndList();
}

void EnvText::setParameters( parameters_t &parametersMap )
{
	CBaseEnvironment::setParameters( parametersMap );
	m_sMessage = getParameterValue( parametersMap, "message" );

	std::string value = getParameterValue( parametersMap, "width" );
	if( !value.empty() )
		m_iWidth = atoi( value.c_str() );

	value = getParameterValue( parametersMap, "size" );
	if( !value.empty() )
		m_fSize = (float)atof( value.c_str() );
			
	value = getParameterValue( parametersMap, "font" );
	if( !value.empty() )
		m_pFont =  fontLibrary::getFont( value );

}


void EnvText::decompile()
{
	CBaseEnvironment::decompile();
	glDeleteLists( m_uiDlist, 1 );
}

