/** 
 * @file llviewerjointshape.cpp
 * @brief Implementation of LLViewerJointShape class
 *
 * $LicenseInfo:firstyear=2001&license=viewergpl$
 * 
 * Copyright (c) 2001-2008, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

//-----------------------------------------------------------------------------
// Header Files
//-----------------------------------------------------------------------------
#include "llviewerprecompiledheaders.h"

#include "llviewerjointshape.h"

#include "llbox.h"
#include "llsphere.h"
#include "llcylinder.h"
#include "llgldbg.h"
#include "llglheaders.h"

F32 LLViewerJointShape::sColorScale = 1.0f;

//-----------------------------------------------------------------------------
// LLViewerJointShape()
//-----------------------------------------------------------------------------
LLViewerJointShape::LLViewerJointShape()
{
	mType = ST_NULL;
	mColor[0] = 1.0f;
	mColor[1] = 1.0f;
	mColor[2] = 1.0f;
	mColor[3] = 1.0f;
	mTexture = NULL;
}


//-----------------------------------------------------------------------------
// LLViewerJointShape()
//-----------------------------------------------------------------------------
LLViewerJointShape::LLViewerJointShape( ShapeType type, F32 red, F32 green, F32 blue, F32 alpha )
{
	mType = type;
	mColor[0] = red * sColorScale;
	mColor[1] = green * sColorScale;
	mColor[2] = blue * sColorScale;
	mColor[3] = alpha;
	mTexture = NULL;
}


//-----------------------------------------------------------------------------
// ~LLViewerJointShape()
// Class Destructor
//-----------------------------------------------------------------------------
LLViewerJointShape::~LLViewerJointShape()
{
}


//--------------------------------------------------------------------
// getType()
//--------------------------------------------------------------------
LLViewerJointShape::ShapeType LLViewerJointShape::getType()
{
	return mType;
}


//--------------------------------------------------------------------
// setType()
//--------------------------------------------------------------------
void LLViewerJointShape::setType( ShapeType type )
{
	mType = type;
}


//--------------------------------------------------------------------
// getColor()
//--------------------------------------------------------------------
void LLViewerJointShape::getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha )
{
	*red   = mColor[0];
	*green = mColor[1];
	*blue  = mColor[2];
	*alpha = mColor[3];
}

//--------------------------------------------------------------------
// setColor()
//--------------------------------------------------------------------
void LLViewerJointShape::setColor( F32 red, F32 green, F32 blue, F32 alpha )
{
	mColor[0] = red  * sColorScale;
	mColor[1] = green * sColorScale;
	mColor[2] = blue * sColorScale;
	mColor[3] = alpha;
}


//--------------------------------------------------------------------
// getTexture()
//--------------------------------------------------------------------
LLViewerImage *LLViewerJointShape::getTexture()
{
	return mTexture;
}

//--------------------------------------------------------------------
// setTexture()
//--------------------------------------------------------------------
void LLViewerJointShape::setTexture( LLViewerImage *texture )
{
	mTexture = texture;
}


//--------------------------------------------------------------------
// drawBone()
//--------------------------------------------------------------------
void LLViewerJointShape::drawBone()
{
}


//--------------------------------------------------------------------
// isTransparent()
//--------------------------------------------------------------------
BOOL LLViewerJointShape::isTransparent()
{
	return (	(mColor[3] < 1.0f) ||
				(!mTexture.isNull() && (mTexture->getComponents()==4)) );
}

//--------------------------------------------------------------------
// drawShape()
//--------------------------------------------------------------------
U32 LLViewerJointShape::drawShape( F32 pixelArea, BOOL first_pass )
{
	U32 triangle_count = 0;

	//----------------------------------------------------------------
	// render ST_NULL
	//----------------------------------------------------------------
	if (mType == ST_NULL)
	{
		return triangle_count;
	}

	//----------------------------------------------------------------
	// setup current color
	//----------------------------------------------------------------
	glColor4fv(mColor.mV);

	//----------------------------------------------------------------
	// setup current texture
	//----------------------------------------------------------------
	glMatrixMode(GL_TEXTURE);
	glPushMatrix();
	glLoadIdentity();
	if (mType == ST_SPHERE)
	{
		glTranslatef(-0.25f, 0.0f, 0.0f);
	}
	glMatrixMode(GL_MODELVIEW);
	LLViewerImage::bindTexture(mTexture);

	//----------------------------------------------------------------
	// update pixel area
	//----------------------------------------------------------------
	F32 s1 = llmax( getScale().mV[VX], llmax( getScale().mV[VY], getScale().mV[VZ] ) );
	F32 s2 = llmin( getScale().mV[VX], llmax( getScale().mV[VY], getScale().mV[VZ] ) );
	pixelArea *= s1 * s2;

	//----------------------------------------------------------------
	// render shape
	//----------------------------------------------------------------
	switch ( mType )
	{
	case ST_CUBE:
		gBox.render();
		break;

	case ST_SPHERE:
		gSphere.render( pixelArea );
		break;

	case ST_CYLINDER:
		gCylinder.render( pixelArea );
		break;

	default:
		break;
	}

	//----------------------------------------------------------------
	// disable texture
	//----------------------------------------------------------------
	if ( mTexture )
	{
		glMatrixMode(GL_TEXTURE);
		glPopMatrix();
		glMatrixMode(GL_MODELVIEW);
	}

	return triangle_count;
}

// End