📄 render.h
字号:
/**********************************************************************
*<
FILE: render.h
DESCRIPTION:
CREATED BY: Dan Silva
HISTORY:
*> Copyright (c) 1994, All Rights Reserved.
**********************************************************************/
#ifndef __RENDER__H
#define __RENDER__H
#define FIELD_EVEN 0
#define FIELD_ODD 1
// Render Types RB: I didn't want to include render.h in MAXAPI.H...
#ifndef _REND_TYPE_DEFINED
#define _REND_TYPE_DEFINED
enum RendType {
RENDTYPE_NORMAL,
RENDTYPE_REGION,
RENDTYPE_BLOWUP,
RENDTYPE_SELECT,
RENDTYPE_REGIONCROP
};
#endif
class DefaultLight {
public:
LightState ls;
Matrix3 tm;
};
class ViewParams {
public:
Matrix3 prevAffineTM; // world space to camera space transform 2 ticks previous
Matrix3 affineTM; // world space to camera space transform
int projType; // PROJ_PERSPECTIVE or PROJ_PARALLEL
float hither,yon;
float distance; // to view plane
// Parallel projection params
float zoom; // Zoom factor
// Perspective params
float fov; // field of view
float nearRange; // for fog effects
float farRange; // for fog effects
// Generic expansion function
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
};
// Common renderer parameters
class Atmospheric;
#ifdef DESIGN_VER
// Even if rendering to another device (i.e., Printer) is supported in the renderer,
// render to a preview window instead if it is supported. This goes in the extraFlags
// field of RendParams.
#define RENDER_REDIRECT_TO_WINDOW (1L << 1)
#endif
// These parameters are passed to the renderer when the renderer is opend.
class RendParams {
public:
RendType rendType; // normal, region, blowup, selection
BOOL isNetRender; // is this a render on a network slave?
BOOL fieldRender;
int fieldOrder; // 0->even, 1-> odd
TimeValue frameDur; // duration of one frame
BOOL colorCheck;
int vidCorrectMethod; // 0->FLAG, 1->SCALE_LUMA 2->SCALE_SAT
int ntscPAL; // 0 ->NTSC, 1 ->PAL
BOOL superBlack; // impose superBlack minimum intensity?
int sbThresh; // value used for superBlack
BOOL rendHidden; // render hidden objects?
BOOL force2Side; // force two-sided rendering?
BOOL inMtlEdit; // rendering in the mtl editor?
float mtlEditTile; // if in mtl editor, scale tiling by this value
BOOL mtlEditAA; // if in mtl editor, antialias?
BOOL multiThread; // for testing only
BOOL useEnvironAlpha; // use alpha from the environment map.
BOOL dontAntialiasBG; // Don't antialias against background (for video games)
BOOL useDisplacement; // Apply displacment mapping
Texmap *envMap; // The environment map, may be NULL
Atmospheric *atmos; // The atmosphere effects, may be NULL.
Effect *effect; // The postprocessing effects, may be NULL.
TimeValue firstFrame; // The first frame that will be rendered
int scanBandHeight; // height of a scan band (default scanline renderer)
ULONG extraFlags; // for expansion
int width,height; // image width,height.
BOOL filterBG; // filter background
RendParams() {
rendType = RENDTYPE_NORMAL;
isNetRender = FALSE;
fieldRender = FALSE;
fieldOrder =0;
frameDur=0;
colorCheck=0;
vidCorrectMethod=0;
ntscPAL=0;
superBlack=0;
sbThresh=0;
rendHidden=0;
force2Side=0;
inMtlEdit=0;
mtlEditTile=0;
mtlEditAA=0;
multiThread=0;
useEnvironAlpha=0;
dontAntialiasBG=0;
useDisplacement=0;
envMap=NULL;
atmos=NULL;
effect=NULL;
firstFrame=0;
scanBandHeight=0;
extraFlags=0;
width=height=0;
filterBG = 0;
}
// Generic expansion function
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
};
// These are passed to the renderer on every frame
class FrameRendParams {
public:
Color ambient;
Color background;
Color globalLightLevel;
float frameDuration; // duration of one frame, in current frames
float relSubFrameDuration; // relative fraction of frameDuration used by subframe.
// boundaries of the region for render region or crop (device coords).
int regxmin,regxmax;
int regymin,regymax;
// parameters for render blowup.
Point2 blowupCenter;
Point2 blowupFactor;
FrameRendParams() { frameDuration = 1.0f; relSubFrameDuration = 1.0f; }
// Generic expansion function
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
};
// Since this dialog is modless and non-interactive, as the user changes
// parameters in the dialog, the renderer does not need to update it's
// state. When the user is through, they may choose 'OK' or 'Cancel'.
//
// If the user OKs the dialog, AcceptParams() will be called, at which time the
// renderer can read the parameter out of the UI and modify its state.
//
// If RejectParams() is called, typically the renderer will not have to do anything
// since it has not yet modify its state, but if for some reason it has, it
// should restore its state.
class RendParamDlg {
public:
virtual void AcceptParams()=0;
virtual void RejectParams() {}
virtual void DeleteThis()=0;
};
// Flag bits for DoMaterialBrowseDlg()
#define BROWSE_MATSONLY (1<<0)
#define BROWSE_MAPSONLY (1<<1)
#define BROWSE_INCNONE (1<<2) // Include 'None' as an option
#define BROWSE_INSTANCEONLY (1<<3) // Only allow instances, no copy
#define BROWSE_TO_MEDIT_SLOT (1<<4) // browsing to medit slot
// passed to SetPickMode. This is a callback that gets called as
// the user tries to pick objects in the scene.
class RendPickProc {
public:
// Called when the user picks something.
// return TRUE to end the pick mode.
virtual BOOL Pick(INode *node)=0;
// Return TRUE if this is an acceptable hit, FALSE otherwise.
virtual BOOL Filter(INode *node)=0;
// These are called as the mode is entered and exited
virtual void EnterMode() {}
virtual void ExitMode() {}
// Provides two cursor, 1 when over a pickable object and 1 when not.
virtual HCURSOR GetDefCursor() {return NULL;}
virtual HCURSOR GetHitCursor() {return NULL;}
// Return TRUE to allow the user to pick more than one thing.
// In this case the Pick method may be called more than once.
virtual BOOL AllowMultiSelect() {return FALSE;}
};
// This is the interface given to a renderer when it needs to display its parameters
// It is also given to atmospheric effects to display thier parameters.
class IRendParams {
public:
// The current position of the frame slider
virtual TimeValue GetTime()=0;
// Register a callback object that will get called every time the
// user changes the frame slider.
virtual void RegisterTimeChangeCallback(TimeChangeCallback *tc)=0;
virtual void UnRegisterTimeChangeCallback(TimeChangeCallback *tc)=0;
// Brings up the material browse dialog allowing the user to select a material.
// newMat will be set to TRUE if the material is new OR cloned.
// Cancel will be set to TRUE if the user cancels the dialog.
// The material returned will be NULL if the user selects 'None'
virtual MtlBase *DoMaterialBrowseDlg(HWND hParent,DWORD flags,BOOL &newMat,BOOL &cancel)=0;
// Adds rollup pages to the render params dialog. Returns the window
// handle of the dialog that makes up the page.
virtual HWND AddRollupPage(HINSTANCE hInst, TCHAR *dlgTemplate,
DLGPROC dlgProc, TCHAR *title, LPARAM param=0,DWORD flags=0)=0;
// Removes a rollup page and destroys it.
virtual void DeleteRollupPage(HWND hRollup)=0;
// When the user mouses down in dead area, the plug-in should pass
// mouse messages to this function which will pass them on to the rollup.
virtual void RollupMouseMessage(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)=0;
// This will set the command mode to a standard pick mode.
// The callback implements hit testing and a method that is
// called when the user actually picks an item.
virtual void SetPickMode(RendPickProc *proc)=0;
// If a plug-in is finished editing its parameters it should not
// leave the user in a pick mode. This will flush out any pick modes
// in the command stack.
virtual void EndPickMode()=0;
// When a plugin has a Texmap, clicking on the button
// associated with that map should cause this routine
// to be called.
virtual void PutMtlToMtlEditor(MtlBase *mb)=0;
// This is for use only by the scanline renderer.
virtual float GetMaxPixelSize() = 0;
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
// JBW 12/1/98: get interface to rollup window interface
virtual IRollupWindow* GetIRollup()=0;
};
//----------------------------------------------------------------
// Render Instance flags
#define INST_HIDE (1<<0) // instance is hidden
#define INST_CLIP (1<<1) // clip instance: ray tracers should skip it
#define INST_BLUR (1<<2) // secondary motion blur instance
#define INST_RCV_SHADOWS (1<<3) // instance receives shadows
#define INST_TM_NEGPARITY (1<<4) // mesh is inside-out: need to reverse normals on-the-fly
class RenderInstance {
public:
ULONG flags;
Mtl *mtl; // from inode, for convenience
float wireSize; // Mtl wireframe size
Mesh *mesh; // result of GetRenderMesh call
float vis; // Object visibility
int nodeID; // unique within scene during render- corresponds to ShadeContext::NodeID()
int objMotBlurFrame; // Object motion blur sub frame (= NO_MOTBLUR for non-blurred objects)
int objBlurID; // Blur instances for an object share a objBlurID value.
Matrix3 objToWorld; // transforms object coords to world coords
Matrix3 objToCam; // transforms object coords to cam coords
Matrix3 normalObjToCam; // for transforming surface normals from obj to camera space
Matrix3 camToObj; // transforms camera coords to object coords
Box3 obBox; // Object space extents
Point3 center; // Bounding sphere center (camera coords)
float radsq; // square of bounding sphere's radius
void SetFlag(ULONG f, BOOL b) { if (b) flags |= f; else flags &= ~f; }
void SetFlag(ULONG f) { flags |= f; }
void ClearFlag(ULONG f) { flags &= ~f; }
BOOL TestFlag(ULONG f) { return flags&f?1:0; }
BOOL Hidden() { return TestFlag(INST_HIDE); }
BOOL IsClip() { return TestFlag(INST_CLIP); }
virtual RenderInstance *Next()=0; // next in list
virtual Interval MeshValidity()=0;
virtual int NumLights()=0;
virtual LightDesc *Light(int n)=0;
virtual BOOL CastsShadowsFrom(const ObjLightDesc& lt)=0; // is lt shadowed by this instance?
virtual INode *GetINode()=0; // get INode for instance
virtual Object *GetEvalObject()=0; // evaluated object for instance
virtual ULONG MtlRequirements(int mtlNum)=0; // node's mtl requirements
virtual void MtlMapsRequired (BitArray & mapreq) { mapreq.SetSize(2); mapreq.Clear(0); mapreq.Set(1); }
virtual Point3 GetFaceNormal(int faceNum)=0; // geometric normal in camera coords
virtual Point3 GetFaceVertNormal(int faceNum, int vertNum)=0; // camera coords
virtual void GetFaceVertNormals(int faceNum, Point3 n[3])=0; // camera coords
virtual Point3 GetCamVert(int vertnum)=0; // coord for vertex in camera coords
virtual void GetObjVerts(int fnum, Point3 obp[3])=0; // vertices of face in object coords
virtual void GetCamVerts(int fnum, Point3 cp[3])=0; // vertices of face in camera(view) coords
// Generic expansion function
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
};
//----------------------------------------------------------------
// Values returned from Progress()
#define RENDPROG_CONTINUE 1
#define RENDPROG_ABORT 0
// Values passed to SetCurField()
#define FIELD_FIRST 0
#define FIELD_SECOND 1
#define FIELD_NONE -1
// A callback passed in to the renderer
class RendProgressCallback {
public:
virtual void SetTitle(const TCHAR *title)=0;
virtual int Progress(int done, int total)=0;
virtual void SetCurField(int which) {}
virtual void SetSceneStats(int nlights, int nrayTraced, int nshadowed, int nobj, int nfaces) {}
};
// RB: my version of a renderer...
class Renderer : public ReferenceTarget {
public:
// Reference/Animatable methods.
// In addition, the renderer would need to implement ClassID() and DeleteThis()
// Since a renderer will probably not itself have references, this implementation should do
RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget,
PartID& partID, RefMessage message) {return REF_SUCCEED;}
SClass_ID SuperClassID() {return RENDERER_CLASS_ID;}
virtual int Open(
INode *scene, // root node of scene to render
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -