299 lines
11 KiB
C++
Executable File
299 lines
11 KiB
C++
Executable File
/* -----------------------------------------------------------------------------
|
|
// -----------------------------------------------------------------------------
|
|
|
|
FILE: sfx.h
|
|
|
|
DESCRIPTION: class declarations for the special effect class hierarchy
|
|
|
|
CREATED BY: michael malone (mjm)
|
|
|
|
HISTORY: created June 30, 2000
|
|
|
|
Copyright (c) 2000, All Rights Reserved
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// -------------------------------------------------------------------------- */
|
|
#ifndef __EFFECT__H
|
|
#define __EFFECT__H
|
|
|
|
// includes
|
|
#include "iFnPub.h"
|
|
|
|
// predeclarations
|
|
class IRendParams;
|
|
class ShadeContext;
|
|
class RenderGlobalContext;
|
|
class IReshadeFragment;
|
|
|
|
// ------------------------------
|
|
//
|
|
// check abort callback class
|
|
//
|
|
// used to check for abort during
|
|
// an extended operation
|
|
// and to update progress
|
|
//
|
|
// ------------------------------
|
|
|
|
#define CAC_INTERFACE Interface_ID(0x666534, 0x50101)
|
|
|
|
|
|
class CheckAbortCallback : public FPMixinInterface
|
|
{
|
|
public:
|
|
virtual BOOL Check()=0; // returns TRUE if user has done something to cause an abort.
|
|
virtual BOOL Progress(int done, int total)=0;
|
|
virtual void SetTitle(const TCHAR *title)=0;
|
|
|
|
// FPInterface stuff
|
|
enum { cac_check, cac_progress, cac_setTitle, };
|
|
|
|
BEGIN_FUNCTION_MAP
|
|
FN_0(cac_check, TYPE_BOOL, Check);
|
|
FN_2(cac_progress, TYPE_BOOL, Progress, TYPE_INT, TYPE_INT);
|
|
VFN_1(cac_setTitle, SetTitle, TYPE_STRING);
|
|
END_FUNCTION_MAP
|
|
|
|
FPInterfaceDesc* GetDesc() { return (FPInterfaceDesc*)GetCOREInterface(CAC_INTERFACE); }
|
|
};
|
|
|
|
// -------------------------------------------------------------
|
|
//
|
|
// special effect plug-in base class
|
|
//
|
|
// base class for Atmospherics, Effects, RenderElements, Shaders
|
|
//
|
|
// -------------------------------------------------------------
|
|
|
|
class SFXParamDlg : public InterfaceServer
|
|
{
|
|
public:
|
|
virtual Class_ID ClassID()=0;
|
|
virtual void SetThing(ReferenceTarget *m)=0;
|
|
virtual ReferenceTarget* GetThing()=0;
|
|
virtual void SetTime(TimeValue t) { }
|
|
virtual void DeleteThis()=0;
|
|
virtual INT_PTR Execute(int cmd, ULONG_PTR arg1=0, ULONG_PTR arg2=0, ULONG_PTR arg3=0) { return 0; }
|
|
virtual void InvalidateUI() { }
|
|
};
|
|
|
|
|
|
class SpecialFX: public ReferenceTarget
|
|
{
|
|
public:
|
|
TSTR name;
|
|
// This name will appear in the track view and the list of current atmospheric effects.
|
|
virtual TSTR GetName() { return _T(""); }
|
|
|
|
// Is effect active
|
|
virtual BOOL Active(TimeValue t) { return !TestAFlag(A_ATMOS_DISABLED); }
|
|
|
|
// Called when the render steps to a new frame
|
|
virtual void Update(TimeValue t, Interval& valid) { }
|
|
|
|
// Saves and loads name. These should be called at the start of
|
|
// a plug-in's save and load methods.
|
|
CoreExport IOResult Save(ISave *isave);
|
|
CoreExport IOResult Load(ILoad *iload);
|
|
|
|
// Put up a dialog that lets the user edit the plug-ins parameters.
|
|
virtual SFXParamDlg *CreateParamDialog(IRendParams *ip) { return NULL; }
|
|
// Implement this if you are using the ParamMap2 AUTO_UI system and the
|
|
// effect has secondary dialogs that don't have the effect 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(SFXParamDlg* dlg) { return FALSE; }
|
|
|
|
// If an atmospheric has references to gizmos or other objects in the scene it can optionally
|
|
// provide access to the object list.
|
|
virtual int NumGizmos() { return 0; }
|
|
virtual INode *GetGizmo(int i) { return NULL; }
|
|
virtual void DeleteGizmo(int i) { }
|
|
virtual void AppendGizmo(INode *node) { }
|
|
virtual BOOL OKGizmo(INode *node) { return FALSE; } // approve a node for possible use as gizmo
|
|
virtual void EditGizmo(INode *node) { } // selects this gizmo & displays params for it if any
|
|
virtual void InsertGizmo(int i, INode *node) { assert(0); } // must be defined to use DeleteGizmoRestore
|
|
|
|
// Animatable overides...
|
|
CoreExport SvGraphNodeReference SvTraverseAnimGraph(IGraphObjectManager *gom, Animatable *owner, int id, DWORD flags);
|
|
};
|
|
|
|
#define SFXBASE_CHUNK 0x39bf
|
|
#define SFXNAME_CHUNK 0x0100
|
|
|
|
|
|
// Classes used for implementing UNDO in Atmosphere and Effects classes.
|
|
class AppendGizmoRestore : public RestoreObj
|
|
{
|
|
public:
|
|
SpecialFX *fx;
|
|
INode *node;
|
|
AppendGizmoRestore(SpecialFX *f, INode *n) { fx= f; node = n; }
|
|
void Redo() { fx->AppendGizmo(node); }
|
|
void Restore(int isUndo) { fx->DeleteGizmo(fx->NumGizmos()-1); }
|
|
TSTR Description() { return TSTR("AppendGizmoRestore"); }
|
|
};
|
|
|
|
class DeleteGizmoRestore: public RestoreObj
|
|
{
|
|
public:
|
|
SpecialFX *fx;
|
|
INode *node;
|
|
int num;
|
|
DeleteGizmoRestore(SpecialFX *a, INode *n, int i) { fx = a; node = n; num = i; }
|
|
void Redo() { fx->DeleteGizmo(num); }
|
|
void Restore(int isUndo) { fx->InsertGizmo(num,node); }
|
|
TSTR Description() { return TSTR("DeleteGizmoRestore"); }
|
|
};
|
|
|
|
// ------------------------------
|
|
// atmospheric plug-in base class
|
|
// ------------------------------
|
|
|
|
// Returned by an Atmospheric when it is asked to put up its rollup page.
|
|
typedef SFXParamDlg AtmosParamDlg;
|
|
|
|
class Atmospheric : public SpecialFX
|
|
{
|
|
public:
|
|
RefResult NotifyRefChanged(Interval changeInt,
|
|
RefTargetHandle hTarget,
|
|
PartID& partID,
|
|
RefMessage message) { return REF_SUCCEED; }
|
|
SClass_ID SuperClassID() { return ATMOSPHERIC_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); }
|
|
|
|
// Put up a modal dialog that lets the user edit the plug-ins parameters.
|
|
virtual AtmosParamDlg *CreateParamDialog(IRendParams *ip) { return NULL; }
|
|
// Implement this if you are using the ParamMap2 AUTO_UI system and the
|
|
// atmosphere has secondary dialogs that don't have the effect 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(AtmosParamDlg* dlg) { return FALSE; }
|
|
|
|
// This is the function that is called to apply the effect.
|
|
virtual void Shade(ShadeContext& sc,const Point3& p0,const Point3& p1,Color& color, Color& trans, BOOL isBG=FALSE)=0;
|
|
// begin - ke/mjm - 03.16.00 - merge reshading code
|
|
// virtual void PreShade(ShadeContext& sc,const Point3& p0,const Point3& p1,Color& color, Color& trans, IReshadeFragment* pFrag, BOOL isBG=FALSE) { }
|
|
// virtual void ReShade(ShadeContext& sc,const Point3& p0,const Point3& p1,Color& color, Color& trans, IReshadeFragment* pFrag, BOOL isBG=FALSE) { Shade(sc,p0,p1,color,trans,isBG); }
|
|
// end - ke/mjm - 03.16.00 - merge reshading code
|
|
};
|
|
|
|
// Chunk IDs saved by base class
|
|
#define ATMOSHPERICBASE_CHUNK SFXBASE_CHUNK
|
|
#define ATMOSHPERICNAME_CHUNK SFXNAME_CHUNK
|
|
|
|
|
|
// --------------------------------
|
|
// render effect plug-in base class
|
|
// --------------------------------
|
|
|
|
// Returned by an effect when it is asked to put up its rollup page.
|
|
typedef SFXParamDlg EffectParamDlg;
|
|
|
|
class Effect : public SpecialFX
|
|
{
|
|
public:
|
|
RefResult NotifyRefChanged(Interval changeInt,
|
|
RefTargetHandle hTarget,
|
|
PartID& partID,
|
|
RefMessage message) {return REF_SUCCEED;}
|
|
SClass_ID SuperClassID() { return RENDER_EFFECT_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); }
|
|
|
|
// Put up a dialog that lets the user edit the plug-ins parameters.
|
|
virtual EffectParamDlg *CreateParamDialog(IRendParams *ip) { return NULL; }
|
|
// Implement this if you are using the ParamMap2 AUTO_UI system and the
|
|
// effect has secondary dialogs that don't have the effect 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; }
|
|
|
|
// What G-buffer channels does this Effect require in the output bitmap?
|
|
virtual DWORD GBufferChannelsRequired(TimeValue t) { return 0; }
|
|
|
|
// This is the function that is called to apply the effect.
|
|
virtual void Apply(TimeValue t, Bitmap *bm, RenderGlobalContext *gc, CheckAbortCallback *cb )=0;
|
|
|
|
};
|
|
|
|
// Chunk IDs saved by base class
|
|
#define EFFECTBASE_CHUNK SFXBASE_CHUNK
|
|
#define EFFECTNAME_CHUNK SFXNAME_CHUNK
|
|
|
|
|
|
// --------------------------------
|
|
// filter kernel plug-in base class
|
|
// --------------------------------
|
|
|
|
#define AREA_KERNEL_CLASS_ID 0x77912301
|
|
#define DEFAULT_KERNEL_CLASS_ID AREA_KERNEL_CLASS_ID
|
|
|
|
// Returned by a kernel when it is asked to put up its rollup page.
|
|
typedef SFXParamDlg FilterKernelParamDlg;
|
|
|
|
class FilterKernel : public SpecialFX
|
|
{
|
|
public:
|
|
RefResult NotifyRefChanged(Interval changeInt,
|
|
RefTargetHandle hTarget,
|
|
PartID& partID,
|
|
RefMessage message ) { return REF_SUCCEED; }
|
|
|
|
SClass_ID SuperClassID() { return FILTER_KERNEL_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); }
|
|
|
|
// Put up a dialog that lets the user edit the plug-ins parameters.
|
|
virtual FilterKernelParamDlg *CreateParamDialog( IRendParams *ip ) { return NULL; }
|
|
|
|
// filter kernel section
|
|
// This is the function that is called to sample kernel values.
|
|
virtual double KernelFn( double x, double y = 0.0 )=0;
|
|
|
|
// integer number of pixels from center to filter 0 edge, must not truncate filter
|
|
// x dimension for 2D filters
|
|
virtual long GetKernelSupport()=0;
|
|
// for 2d returns y support, for 1d returns 0
|
|
virtual long GetKernelSupportY()=0;
|
|
|
|
virtual bool Is2DKernel()=0;
|
|
virtual bool IsVariableSz()=0;
|
|
// 1-D filters ignore the y parameter
|
|
virtual void SetKernelSz( double x, double y = 0.0 )=0;
|
|
virtual void GetKernelSz( double& x, double& y )=0;
|
|
|
|
// returning true will disable the built-in normalizer
|
|
virtual bool IsNormalized(){ return FALSE; }
|
|
|
|
// this is for possible future optimizations, not sure its needed
|
|
virtual bool HasNegativeLobes()=0;
|
|
|
|
virtual TCHAR* GetDefaultComment()=0;
|
|
|
|
// there are 2 optional 0.0 ...1.0 parameters, for whatever
|
|
virtual long GetNFilterParams(){ return 0; }
|
|
virtual TCHAR * GetFilterParamName( long nParam ){ return _T(""); }
|
|
virtual double GetFilterParamMax( long nParam ){ return 1.0; }
|
|
virtual double GetFilterParam( long nParam ){ return 0.0; }
|
|
virtual void SetFilterParam( long nParam, double val ){};
|
|
};
|
|
|
|
// Chunk IDs saved by base class
|
|
#define FILTERKERNELBASE_CHUNK 0x39bf
|
|
#define FILTERKERNELNAME_CHUNK 0x0100
|
|
|
|
|
|
#endif
|