tge/lib/maxsdk70/include/radiosity.h
2017-04-17 06:17:10 -06:00

248 lines
9.7 KiB
C++
Executable File

/**********************************************************************
*<
FILE: radiosity.h
DESCRIPTION: Definitions for radiosity plugin
CREATED BY: Cleve Ard
HISTORY:
[d.levesque | 21August2001]
Addition of IRadiosityEffectExtension interface.
*> Copyright (c) 2000, All Rights Reserved.
**********************************************************************/
#ifndef __RADIOSITY_H__
#define __RADIOSITY_H__
#include <render.h>
typedef SFXParamDlg RadiosityParamDlg;
/*=====================================================================
* Radiosity Interface class
*===================================================================*/
class RadiosityEffect : public SpecialFX {
public:
enum CompletionCode {
PROCESS_COMPLETED,
PROCESS_TIMED_OUT,
PROCESS_CANCELED,
PROCESS_ABORTED
};
RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget,
PartID& partID, RefMessage message) {return REF_SUCCEED;}
SClass_ID SuperClassID() {return RADIOSITY_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); }
virtual void SetActive(
bool active,
TimeValue t
) {
if (active ^ (TestAFlag(A_ATMOS_DISABLED) == 0)) {
if (active) {
ClearAFlag(A_ATMOS_DISABLED);
}
else {
SetAFlag(A_ATMOS_DISABLED);
}
NotifyDependents(FOREVER, PART_ALL, REFMSG_CHANGE);
}
}
// Merge a radiosity solution into the current solution. This
// method is called for the currently selected radiosity plugin, when
// merging objects from a file that also has a radiosity plugin. The
// class id identifies the class of the radiosity plugin being loaded.
// The default behaviour does not merge the solutions.
virtual IOResult Merge(ILoad* iload, const Class_ID& id) { return IO_OK; }
// Put up a modal dialog that lets the user edit the plug-ins parameters.
virtual RadiosityParamDlg *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(RadiosityParamDlg* dlg) { return FALSE; }
// Render access
// Should the light render it's illumination in the production render. This is
// used to allow the radiosity plugin to supply lighting for lights
// from its solution.
virtual bool UseLight(INode* node, bool recalcSolution = false) { return true; }
// Create light objects that the renderer can use to get the
// radiosity contribution. NumLightDesc returns the number of
// ObjLightDesc objects the radiosity plugin needs for
// rendering. CreateLightDesc creates all of the ObjLightDesc
// objects, and stores their addresses in buffer. Buffer must be
// large enough to hold all of the addresses.
virtual int NumLightDesc( ) const = 0;
virtual void CreateLightDesc(ObjLightDesc** buffer) = 0;
// Start the radiosity process running. This method may start
// the process at the beginning, or where it stopped previously.
// InteractiveRender is true, when RunProcess is called from an
// interactive renderer. The radiosity plugin should use this
// information to trade-off acceptable render quality and interactivity.
virtual void RunProcess(
TimeValue t,
RenderGlobalContext* rgc,
bool interactiveRender
) = 0;
// Stop the radiosity process. This method stops the global
// illumination process. This can take quite a while, and if allowAbort is
// true, may display a modeless dialog to allow the user to abort
// processing.
virtual void StopProcess(bool allowAbort = true) = 0;
// Abort the radiosity process. This method aborts the global
// illumination process quickly. If AbortProcess is called, RunProcess
// may start at the beginning the next time it is called.
virtual void AbortProcess() = 0;
// Wait for radiosity process to complete. The RendContext is
// used to provide progress reporting to the user, and to detect when the
// cancel button is pressed. If the process doesn't complete in timeout
// milliseconds, it is stopped and WaitForCompletion returns.
// Completion criteria is set by the user in the radiosity plugin
// UI. If the user cancels the render, the radiosity plugin should attempt
// to stop the process, but allow the user to abort, when stopping
// takes an excessive amount of time.
virtual CompletionCode WaitForCompletion(
RendContext* rc = NULL,
DWORD timeout = INFINITE
) = 0;
// Called right before RunProcess. Return true to have the camPos
// array built before running the process, return false to keep
// the array from being build. SaveMem is true if the renderer
// would like to save memory. Default returns false.
virtual bool NeedsCamVerts(
TimeValue t,
RenderGlobalContext* rgc,
bool interactiveRender,
bool saveMem
) { return false; }
};
/*=====================================================================
* Radisity Core Interface class
*===================================================================*/
// This class is used to get access to the radiosity plugin
// and UI.
#define RADIOSITY_INTERFACE Interface_ID(0x6711e7a, 0x5b504baa)
class RadiosityInterface : public FPStaticInterface {
public:
// Open and close the Radiosity Panel
virtual void OpenRadiosityPanel()=0;
virtual void CloseRadiosityPanel()=0;
virtual void MinimizeRadiosityPanel()=0;
// Get and Set the radiosity in the scene
virtual RadiosityEffect* GetRadiosity() const = 0;
virtual void SetRadiosity(RadiosityEffect* op) = 0;
};
/*=====================================================================
* Class IRadiosityEffectExtension
*
* Provides extended functionality to class RadiosityEffect. To use
* this functionality with a RadiosityEffect class, derive the class
* from both RadiosityEffect and IRadiosityEffectExtension, and implement
* RadiosityEffect::GetInterface() to return a pointer to this interface
* on request.
*===================================================================*/
#define IRADIOSITYEFFECT_EXTENSION_INTERFACE Interface_ID(0x703149db, 0x43ed63b8)
class IRadiosityEffectExtension : public BaseInterface {
public:
// Returns whether the specified default light should be used by the scanline
// renderer. The scanline renderer normally creates default lights when there
// are no lights in the scene. A radiosity plugin could override this if it
// uses objects other than lights as light sources (e.g. self-emitting
// surfaces)
virtual bool UseDefaultLight(const DefaultLight& defLight, bool recalcSolution = false) const = 0;
// Returns whether the the radiosity plugin is interested in any
// of the channels in the part id.
virtual bool IsInterestedInChannels(PartID part) const { return true; }
// -- from BaseInterface
virtual Interface_ID GetID() { return IRADIOSITYEFFECT_EXTENSION_INTERFACE; }
};
/*===========================================================================
*
* Class IRadiosityRenderParameters
*
* This interface provides access to our radiosity plug-in rendering parameters.
*
*===========================================================================*/
#define IRADIOSITY_RENDER_PARAMETERS_INTERFACE Interface_ID(0x39981beb, 0x38df21ad)
class IRadiosityRenderParameters : public BaseInterface {
public:
virtual bool GetReuseDirectIllumination(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetReuseDirectIllumination(bool in_reuse, TimeValue in_time = 0) = 0;
virtual bool GetRegather(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetRegather(bool in_gather, TimeValue in_time = 0) = 0;
virtual int GetRaysPerSample(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetRaysPerSample(int in_raysPerSample, TimeValue in_time = 0) = 0;
virtual float GetFilterRadius(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetFilterRadius(float in_radius, TimeValue in_time = 0) = 0;
virtual bool GetClampEnabled(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetClampEnabled(bool in_clamp, TimeValue in_time = 0) = 0;
virtual float GetClampValue(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetClampValue(float in_clampValue, TimeValue in_time = 0) = 0;
virtual bool GetAdaptiveEnabled(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetAdaptiveEnabled(bool in_adaptive, TimeValue in_time = 0) = 0;
virtual int GetSampleSpacing(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetSampleSpacing(int in_sampleSpacing, TimeValue in_time = 0) = 0;
virtual float GetSubdivionContrast(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetSubdivionContrast(float in_contrast, TimeValue in_time = 0) = 0;
virtual int GetMinSampleSpacing(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetMinSampleSpacing(int in_minSpacing, TimeValue in_time = 0) = 0;
virtual bool GetShowSamples(TimeValue in_time = 0, Interval *valid = NULL) const = 0;
virtual void SetShowSamples(bool in_show, TimeValue in_time = 0) = 0;
// -- from BaseInterface
virtual Interface_ID GetID() { return IRADIOSITY_RENDER_PARAMETERS_INTERFACE; }
};
#endif