source-engine/game/client/splinepatch.h

89 lines
2.1 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright 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