/** 
 * @file llanimalcontrols.h
 * @brief LLAnimalControls class definition
 *
 * Copyright (c) 2005-2007, 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://secondlife.com/developers/opensource/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://secondlife.com/developers/opensource/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.
 */

#ifndef LL_LLANIMALCONTROLS_H
#define LL_LLANIMALCONTROLS_H

#include "llhudobject.h"
#include "llflexibleobject.h"

//-----------------------------------------------------------------------------------
// Default setting for the attributes of a animalControls object...
//-----------------------------------------------------------------------------------
//const LLVector3	ANIMAL_CONTROLS_DEFAULT_ANCHOR_DIRECTION		= LLVector3::z_axis;
//const LLVector3	ANIMAL_CONTROLS_DEFAULT_ANCHOR_POSITION_OFFSET	= LLVector3::zero;
//const LLColor4	ANIMAL_CONTROLS_DEFAULT_COLOR					= LLColor4( 1.0f, 1.0f, 1.0f, 1.0f );
//const F32		ANIMAL_CONTROLS_DEFAULT_GRAVITY					= 0.3f;
//const F32		ANIMAL_CONTROLS_DEFAULT_TENSION					= 10.0f;
//const F32		ANIMAL_CONTROLS_DEFAULT_AIR_FRICTION			= 10.0f;
//const F32		ANIMAL_CONTROLS_DEFAULT_LENGTH					= 1.0f;
//const int		ANIMAL_CONTROLS_DEFAULT_NUM_SECTIONS			= 4;
//const F32		ANIMAL_CONTROLS_DEFAULT_ANCHOR_RADIUS			= 0.05f;
//const F32		ANIMAL_CONTROLS_DEFAULT_RADIUS_CHANGE			= -0.01f;

class LLViewerObject;

/*struct LLAnimalControlsBodyBehavior
{
	LLVector3		mPosition;
	LLQuaternion	mHipRotation;
};

class LLAnimalControlsHeadBehavior
{
	private:
		LLVector3			mBodyPosition;
		LLQuaternion		mBodyRotation;
		LLHUDFlexibleObject	mFeather;
		LLVector3			mPosition;
		LLQuaternion		mRotation;
		LLVector3			mFocusPosition;
		bool				mEyesBlinking;
		F32					mEyeBlinkRate;

	public:
		LLAnimalControlsHeadBehavior();
		void setBodyPositionAndRotation( LLVector3 p, LLQuaternion r );
		void setFocusPosition( LLVector3 focusPosition );
		void update();
		void render();
};


class LLAnimalControlsLegBehavior
{
	private:
		LLVector3		mBodyPosition;
		LLQuaternion	mBodyRotation;
		LLVector3		mHipAnchorPosition; 
		bool			mWalking;
		bool			mIsLeft;

	public:
		LLAnimalControlsLegBehavior();
		void setBodyPositionAndRotation( LLVector3 p, LLQuaternion r );
		void update();
		void render();
};


class LLAnimalControlsVirtualServer
{
	private:
		int				fakeClock;
		LLVector3		focusPosition;
		bool			settingFocusPosition;
		LLVector3		animalPosition;
		LLQuaternion	animalRotation;

	public:
		LLAnimalControlsVirtualServer();
		bool		getSettingFocusPosition();
		LLVector3	getFocusPosition();
		void		update();
		void		setParentPositionAndRotation( LLVector3 p, LLQuaternion q );
};


//-------------------------------------------------
// This structure is also used in the part of the 
// code that creates new animalControls objects.
//-------------------------------------------------
struct LLAnimalControlsAttributes
{
	//LLVector3		mAnchorPositionOffset;
	//LLVector3		mAnchorDirection;
	//LLColor4		mColor;
	//F32				mAnchorRadius;
	//S32				mNumSections;
	//F32				mLength;
	//F32				mGravity;
	//F32				mAirFriction;
	//F32				mTension;
	//F32				mRadiusChange;	
	bool			mUsingBodyControls;
	bool			mUsingHeadControls;
	bool			mUsingTailControls;
	bool			mUsingLegControls;

	//------ the constructor for the structure ------------
	LLAnimalControlsAttributes()
	{
		//mAnchorPositionOffset	= ANIMAL_CONTROLS_DEFAULT_ANCHOR_DIRECTION;	
		//mAnchorDirection		= ANIMAL_CONTROLS_DEFAULT_ANCHOR_POSITION_OFFSET;
		//mAnchorRadius			= ANIMAL_CONTROLS_DEFAULT_ANCHOR_RADIUS;
		//mColor				= ANIMAL_CONTROLS_DEFAULT_COLOR;
		//mNumSections			= ANIMAL_CONTROLS_DEFAULT_NUM_SECTIONS;
		//mLength				= ANIMAL_CONTROLS_DEFAULT_LENGTH;
		//mGravity				= ANIMAL_CONTROLS_DEFAULT_GRAVITY;
		//mAirFriction			= ANIMAL_CONTROLS_DEFAULT_AIR_FRICTION;
		//mTension				= ANIMAL_CONTROLS_DEFAULT_TENSION;
		//mRadiusChange			= ANIMAL_CONTROLS_DEFAULT_RADIUS_CHANGE;	
	}
};// end of attributes structure



//---------------------------------------------------------
// The LLHUDAnimalControls class 
//---------------------------------------------------------
class LLHUDAnimalControls : public LLHUDObject
{
	public:
		LLHUDAnimalControls();
		void				setParentObject( LLViewerObject * );
		void				setAttributes( LLAnimalControlsAttributes );
		void				markAsDead();
		void				update();
		LLViewerObject *	getParentObject();
		void				render();

	private:
		//--------------------------------------
		// private members
		//--------------------------------------
		LLViewerObject*					mParentObject;
		LLAnimalControlsAttributes		mAttributes;
		LLAnimalControlsHeadBehavior	mHeadBehavior;
		LLAnimalControlsLegBehavior		mLeftLegBehavior;
		LLAnimalControlsLegBehavior		mRightLegBehavior;
		LLAnimalControlsVirtualServer	mVirtualServer;

		//--------------------------------------
		// private methods
		//--------------------------------------
		void updateVirtualServer();
		void updateBodyBehavior();
		void renderBodyBehavior();
		//void updateLegBehavior();
		//void renderLegBehavior();
		//void updateHeadBehavior();
		//void renderHeadBehavior();

		friend class LLHUDObject;

};// end of class definition

*/
#endif // LL_LLANIMALCONTROLS_H