/////////////////////////////////////////////////////////////////////////
//
//
//	Sampler Plug-Ins
//
//	Created 11/30/98	Kells Elmquist
//

#ifndef	SAMPLERS_H
#define SAMPLERS_H

// Default Sampler ClassId
#define R25_SAMPLER_CLASS_ID			0x25773211
#define DEFAULT_SAMPLER_CLASS_ID		R25_SAMPLER_CLASS_ID


typedef	ULONG	MASK[2];

class ShadeContext;

typedef SFXParamDlg SamplerParamDlg;

class SamplingCallback {
	public:
	virtual BOOL SampleAtOffset( Color &col, Color &trans, Point2& sample, float sampleScale )=0;
};

class StdMat2;

class Sampler : public SpecialFX {
	public:
		RefResult NotifyRefChanged( Interval changeInt, 
									RefTargetHandle hTarget, 
							        PartID& partID, 
									RefMessage message ) { return REF_SUCCEED; }

		SClass_ID SuperClassID() { return SAMPLER_CLASS_ID; }
		
		// Saves and loads name. These should be called at the start of
		// a plug-in's save and load methods.
		IOResult Save(ISave *isave) { return SpecialFX::Save(isave); }
		IOResult Load(ILoad *iload) { return SpecialFX::Load(iload); }

		// this samples a sequence for the area
		virtual void DoSamples( Color& c, Color& t, SamplingCallback* cb, 
								ShadeContext* sc, MASK mask=NULL )=0;
		
		// integer number of samples for current quality
		virtual int GetNSamples()=0;	//what return when adaptive? n for max quality.

		// This is the one default parameter
		// Quality is nominal, 0...1, 
		// 0 is one sample, high about .75, 1.0 shd be awesome
		// for adaptive samplers, this sets the maximum quality
		virtual void SetQuality( float value )=0;
		virtual float GetQuality()=0;
		// returns 0 on "unchangeable", otherwise n quality levels
		virtual int SupportsQualityLevels()=0;

		virtual void SetEnable( BOOL samplingOn )=0;
		virtual BOOL GetEnable()=0;

		virtual TCHAR* GetDefaultComment()=0;

		// Adaptive Sampling, non-reqd methods
		// there are various optional params, this defines which ones to show/enable
		virtual ULONG SupportsStdParams(){ return 0; }

		// this determines whether to cut down the texture sample size of each sample, 
		// or whether to always use 1 pixel texture sample size
		virtual void SetTextureSuperSampleOn( BOOL on ){}
		virtual BOOL GetTextureSuperSampleOn(){ return FALSE; }

		virtual void SetAdaptiveOn( BOOL on ){}
		virtual BOOL IsAdaptiveOn(){ return FALSE; }

		virtual void SetAdaptiveThreshold( float value ){}
		virtual float GetAdaptiveThreshold(){ return 0.0f; }

		// there are 2 optional 0.0...max parameters, for whatever
		virtual long GetNOptionalParams(){ return 0; }
		virtual TCHAR * GetOptionalParamName( long nParam ){ return _T(""); }
		virtual float GetOptionalParamMax( long nParam ){ return 1.0f; }
		virtual float GetOptionalParam( long nParam ){ return 0.0f; };
		virtual void SetOptionalParam( long nParam, float val ){};

		// Put up a modal pop-up dialog that allows editing the sampler extended
		virtual void ExecuteParamDialog(HWND hWndParent, StdMat2* mtl ){}

		// Implement this if you are using the ParamMap2 AUTO_UI system and the 
		// effect has secondary dialogs that don't have the sampler as their 'thing'.
		// Called once for each secondary dialog for you to install the correct thing.
		// Return TRUE if you process the dialog, false otherwise.
		virtual BOOL SetDlgThing(EffectParamDlg* dlg) { return FALSE; }
	};

// There are the standard parameters for samplers
#define	IS_ADAPTIVE					0x1		// adaptive in some way
#define	ADAPTIVE_CHECK_BOX			0x2		// enable adaptive check box
#define	ADAPTIVE_THRESHOLD			0x4		// enable adaptive threshold spinner
#define	SUPER_SAMPLE_TEX_CHECK_BOX	0x8		// enable texture subsampling check box
#define	ADVANCED_DLG_BUTTON			0x10	// enable advanced button
#define	OPTIONAL_PARAM_0			0x20	// enable optional spinner
#define	OPTIONAL_PARAM_1			0x40	// enable optional spinner

#define	R3_ADAPTIVE					(IS_ADAPTIVE+ADAPTIVE_CHECK_BOX+ADAPTIVE_THRESHOLD)		

// Chunk IDs saved by base class
#define SAMPLERBASE_CHUNK	0x39bf
#define SAMPLERNAME_CHUNK	0x0100
#define SAMPLER_VERS_CHUNK  0x0200



#endif