//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: This module contains helper functions for use with scratch pads.
//
// $NoKeywords: $
//=============================================================================//

#ifndef SCRATCHPADUTILS_H
#define SCRATCHPADUTILS_H
#ifdef _WIN32
#pragma once
#endif


#include "iscratchpad3d.h"


// Use this to make a graph.
class CScratchPadGraph
{
public:

	typedef int LineID;

	CScratchPadGraph();

	// Initialze the orientation and scales of the two axes.
	// Axis indices are 0, 1, or 2 for x, y, and z.
	void Init( 
		IScratchPad3D *pPad,

		Vector vTimeAxis = Vector(0,-1,0),
		float flInchesPerSecond=1,
		Vector vTimeLineColor=Vector(0,0,1),
		float flTimeOrigin=0,				// Where the origin of the graph is.

		float flTimeLabelEveryNSeconds=1,
		
		Vector vValueAxis = Vector(0,0,1),
		float flInchesPerValue=1,
		Vector vValueLineColor=Vector(1,0,0),
		float flValueOrigin=0				// Where the origin of the graph is.

		);

	bool IsInitted() const;

	// Add another line into the graph.
	LineID AddLine( Vector vColor );
	void AddSample( LineID iLine, float flTime, float flValue );
	void AddVerticalLine( float flTime, float flMinValue, float flMaxValue, const CSPColor &vColor );
	
	// Get the 3D position of a sample on the graph (so you can draw other things there).
	Vector GetSamplePosition( float flTime, float flValue );


private:

	void UpdateTicksAndStuff( float flTime, float flValue );

		

private:
	class CLineInfo
	{
	public:
		bool m_bFirst;
		float m_flLastTime;
		float m_flLastValue;
		Vector m_vColor;
	};

	IScratchPad3D *m_pPad;

	CUtlVector<CLineInfo> m_LineInfos;

	Vector m_vTimeAxis;
	float m_flInchesPerSecond;

	Vector m_vValueAxis;
	float m_flInchesPerValue;

	// How often to make a time label.
	float m_flTimeLabelEveryNSeconds;
	int m_nTimeLabelsDrawn;

	Vector m_vTimeLineColor;
	Vector m_vValueLineColor;

	float m_flTimeOrigin;
	float m_flValueOrigin;
	
	// Used to extend the value border.
	float m_flHighestValue;
	float m_flHighestTime;
};



// Draw a cone.
void ScratchPad_DrawLitCone( 
	IScratchPad3D *pPad,
	const Vector &vBaseCenter,
	const Vector &vTip,
	const Vector &vBrightColor,
	const Vector &vDarkColor,
	const Vector &vLightDir,
	float baseWidth,
	int nSegments );


// Draw a cylinder.
void ScratchPad_DrawLitCylinder( 
	IScratchPad3D *pPad,
	const Vector &v1,
	const Vector &v2,
	const Vector &vBrightColor,
	const Vector &vDarkColor,
	const Vector &vLightDir,
	float width,
	int nSegments );


// Draw an arrow.
void ScratchPad_DrawArrow( 
	IScratchPad3D *pPad,
	const Vector &vPos, 
	const Vector &vDirection,
	const Vector &vColor, 
	float flLength=20, 
	float flLineWidth=3,
	float flHeadWidth=8,
	int nCylinderSegments=5,
	int nHeadSegments=8,
	float flArrowHeadPercentage = 0.3f	// How much of the line is the arrow head.
	);


// Draw an arrow with less parameters.. it generates parameters based on length
// automatically to make the arrow look good.
void ScratchPad_DrawArrowSimple( 
	IScratchPad3D *pPad,
	const Vector &vPos, 
	const Vector &vDirection,
	const Vector &vColor, 
	float flLength );

void ScratchPad_DrawSphere(
	IScratchPad3D *pPad,
	const Vector &vCenter,
	float flRadius,
	const Vector &vColor,
	int nSubDivs=7 );


void ScratchPad_DrawAABB(
	IScratchPad3D *pPad,
	const Vector &vMins,
	const Vector &vMaxs,
	const Vector &vColor = Vector( 1,1,1 ) );


#endif // SCRATCHPADUTILS_H