#ifndef PtexSeparableFilter_h
#define PtexSeparableFilter_h
#include "Ptexture.h"
class PtexSeparableKernel;
class PtexSeparableFilter : public PtexFilter, public Ptex
{
public:
virtual void release() { delete this; }
virtual void eval(float* result, int firstchan, int nchannels,
int faceid,
float u,
float v,
float uw1, float vw1, float uw2, float vw2,
float width,
float blur);
protected:
PtexSeparableFilter(PtexTexture* tx, const PtexFilter::Options& opts ) :
_tx(tx), _options(opts), _result(0), _weight(0),
_firstChanOffset(0), _nchan(0), _ntxchan(0),
_dt((DataType)0), _uMode(tx->uBorderMode()), _vMode(tx->vBorderMode()) {}
virtual ~PtexSeparableFilter() {}
virtual void buildKernel(PtexSeparableKernel& k,
float u,
float v,
float uw,
float vw,
Res faceRes) = 0;
void splitAndApply(PtexSeparableKernel& k,
int faceid,
const Ptex::FaceInfo&
f);
void applyAcrossEdge(PtexSeparableKernel& k,
int faceid,
const Ptex::FaceInfo&
f,
int eid);
void applyToCorner(PtexSeparableKernel& k,
int faceid,
const Ptex::FaceInfo&
f,
int eid);
void applyToCornerFace(PtexSeparableKernel& k,
const Ptex::FaceInfo&
f,
int eid,
int cfaceid, const Ptex::FaceInfo& cf, int ceid);
void apply(PtexSeparableKernel& k,
int faceid,
const Ptex::FaceInfo&
f);
PtexTexture* _tx;
Options _options;
double* _result;
double _weight;
int _firstChanOffset;
int _nchan;
int _ntxchan;
DataType _dt;
BorderMode _uMode, _vMode;
};
#endif