//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: A little helper class that computes a spline patch
//
// $Workfile:     $
// $Date:         $
//
//-----------------------------------------------------------------------------
// $Log: $
//
// $NoKeywords: $
//=============================================================================//

#ifndef SPLINEPATCH_H
#define SPLINEPATCH_H
#pragma once

#include "mathlib/vector4D.h"

//-----------------------------------------------------------------------------
// Spline patch: 
//-----------------------------------------------------------------------------

class CSplinePatch
{
public:
	// The last argument represents the number of float channels in addition to position
	CSplinePatch( );
	~CSplinePatch();

	// Call this to initialize the patch
	void Init( int w, int h, int extraChannels );

	// 0 = linear, 1 = spliney!
	void SetLinearBlend( float factor );

	// Hooks the patch up to externally controlled data...
	void SetControlPositions( Vector const** pPositions );
	void SetChannelData( int channel, float* pChannel );

	// This interface isn't wonderful; it's limited by optimization issues...

	// Call this before querying the patch for data at (i,j)
	void SetupPatchQuery( float i, float j );

	// Gets the point and normal at (i,j) specified above
	void GetPointAndNormal( Vector& position, Vector& normal ) const;

	// Gets at other channels
	float GetChannel( int channel ) const;

	// Gets at the dimensions
	int	Width() const { return m_Width; }
	int Height() const { return m_Height; }

public:
	// The integer + float values for the patch query
	int		m_is, m_it;
	float	m_fs, m_ft;

private:
	enum
	{
		MAX_CHANNELS = 4
	};

	// no copy constructor
	CSplinePatch( const CSplinePatch& );

	// Computes indices of the samples to read for this interpolation
	void ComputeIndices( );

	// input data
	int m_Width;
	int m_Height;
	int m_ChannelCount;
	Vector const** m_ppPositions;
	float const* m_pChannel[MAX_CHANNELS];

	// temporary data used for a single patch query
	int		m_SampleIndices[4][4];
	Vector4D m_SVec;
	Vector4D m_TVec;

	float m_LinearFactor;
};

#endif // SPLINEPATCH_H
