tge/lib/maxsdk40/stdmat.h
2025-02-17 23:17:30 -06:00

489 lines
16 KiB
C++
Executable File

/*******************************************************************
*
* DESCRIPTION: Standard materials, textures, and fog: generic interface
*
* AUTHOR: Dan Silva
*
* HISTORY: Created 3/5/96
* Modified for shiva 2/1/99, Kells Elmquist
*
*******************************************************************/
#ifndef __STDMAT__H
#define __STDMAT__H
// Shade values
#define NSHADES 4
#define SHADE_CONST 0
#define SHADE_PHONG 1
#define SHADE_METAL 2
#define SHADE_BLINN 3
// Transparency types
#define TRANSP_SUBTRACTIVE 0
#define TRANSP_ADDITIVE 1
#define TRANSP_FILTER 2
#define NTEXMAPS 12
// Old StdMtl Texture map indices, used by blinn, phong, constant, metal
#define ID_AM 0 // ambient
#define ID_DI 1 // diffuse
#define ID_SP 2 // specular
#define ID_SH 3 // shininesNs
#define ID_SS 4 // shininess strength
#define ID_SI 5 // self-illumination
#define ID_OP 6 // opacity
#define ID_FI 7 // filter color
#define ID_BU 8 // bump
#define ID_RL 9 // reflection
#define ID_RR 10 // refraction
#define ID_DP 11 // displacement
class Shader;
class Sampler;
class StdMat: public Mtl {
public:
virtual void SetSoften(BOOL onoff)=0;
virtual void SetFaceMap(BOOL onoff)=0;
virtual void SetTwoSided(BOOL onoff)=0;
virtual void SetWire(BOOL onoff)=0;
virtual void SetWireUnits(BOOL onOff)=0;
virtual void SetFalloffOut(BOOL onOff)=0; // 1: out, 0: in
virtual void SetTransparencyType(int type)=0;
virtual void SetAmbient(Color c, TimeValue t)=0;
virtual void SetDiffuse(Color c, TimeValue t)=0;
virtual void SetSpecular(Color c, TimeValue t)=0;
virtual void SetFilter(Color c, TimeValue t)=0;
virtual void SetShininess(float v, TimeValue t)=0;
virtual void SetShinStr(float v, TimeValue t)=0;
virtual void SetSelfIllum(float v, TimeValue t)=0;
virtual void SetOpacity(float v, TimeValue t)=0;
virtual void SetOpacFalloff(float v, TimeValue t)=0;
virtual void SetWireSize(float s, TimeValue t)=0;
virtual void SetIOR(float v, TimeValue t)=0;
virtual void LockAmbDiffTex(BOOL onOff)=0;
// begin - ke/mjm - 03.16.00 - merge reshading code
// virtual BOOL SupportsShaders(){ return FALSE; } // moved to class Mtl
// end - ke/mjm - 03.16.00 - merge reshading code
// >>>> Sampling
virtual void SetSamplingOn( BOOL on )=0;
virtual BOOL GetSamplingOn()=0;
// Obsolete Calls, not used in StdMat2....see shaders.h
virtual void SetShading(int s)=0;
virtual int GetShading()=0;
// texmaps, these only work for translated ID's of map channels,
// see stdMat2 for access to std ID channels translator
virtual void EnableMap(int id, BOOL onoff)=0;
virtual BOOL MapEnabled(int id)=0;
virtual void SetTexmapAmt(int id, float amt, TimeValue t)=0;
virtual float GetTexmapAmt(int id, TimeValue t)=0;
virtual BOOL GetSoften()=0;
virtual BOOL GetFaceMap()=0;
virtual BOOL GetTwoSided()=0;
virtual BOOL GetWire()=0;
virtual BOOL GetWireUnits()=0;
virtual BOOL GetFalloffOut()=0; // 1: out, 0: in
virtual int GetTransparencyType()=0;
virtual Color GetAmbient(TimeValue t)=0;
virtual Color GetDiffuse(TimeValue t)=0;
virtual Color GetSpecular(TimeValue t)=0;
virtual Color GetFilter(TimeValue t)=0;
virtual float GetShininess( TimeValue t)=0;
virtual float GetShinStr(TimeValue t)=0;
virtual float GetSelfIllum(TimeValue t)=0;
virtual float GetOpacity( TimeValue t)=0;
virtual float GetOpacFalloff(TimeValue t)=0;
virtual float GetWireSize(TimeValue t)=0;
virtual float GetIOR( TimeValue t)=0;
virtual BOOL GetAmbDiffTexLock()=0;
};
//////////////////////////////////////////////////////////////////////////////
//
// This is the base class for all materials that support plug-in shaders
//
class StdMat2 : public StdMat {
public:
BOOL SupportsShaders(){ return TRUE; }
// Shader/Material UI synchronization
virtual BOOL KeyAtTime(int id,TimeValue t) = 0;
virtual int GetMapState( int indx ) = 0; //returns 0 = no map, 1 = disable, 2 = mapon
virtual TSTR GetMapName( int indx ) = 0;
virtual void SyncADTexLock( BOOL lockOn ) = 0;
// Shaders
virtual BOOL SwitchShader( Class_ID id )= 0;
virtual Shader* GetShader()= 0;
virtual BOOL IsFaceted()= 0;
virtual void SetFaceted( BOOL on )= 0;
// texture channels from stdmat id's
virtual long StdIDToChannel( long id )=0;
// Obsolete Calls from StdMat, not used in StdMat2, except stdmtl2 provides
// support for translators: old shaders return correct id, all others return blinn
virtual void SetShading(int s){}
virtual int GetShading(){ return -1; }
// Samplers
virtual BOOL SwitchSampler( Class_ID id )=0;
virtual Sampler * GetPixelSampler(int mtlNum, BOOL backFace)=0;
// these params extend the UI approximation set in stdMat
virtual BOOL GetSelfIllumColorOn(int mtlNum=0, BOOL backFace=FALSE)=0;
virtual Color GetSelfIllumColor(int mtlNum, BOOL backFace)=0;
virtual Color GetSelfIllumColor(TimeValue t)=0;
virtual void SetSelfIllumColorOn( BOOL on )=0;
virtual void SetSelfIllumColor(Color c, TimeValue t)=0;
// these are used to simulate traditional 3ds shading by the default handlers
virtual float GetReflectionDim(float diffIllumIntensity ){ return 1.0f; }
virtual Color TranspColor( float opac, Color filt, Color diff )=0;
virtual float GetEffOpacity(ShadeContext& sc, float opac )=0;
};
// Mapping types for SetCoordMapping
#define UVMAP_EXPLICIT 0
#define UVMAP_SPHERE_ENV 1
#define UVMAP_CYL_ENV 2
#define UVMAP_SHRINK_ENV 3
#define UVMAP_SCREEN_ENV 4
class StdUVGen: public UVGen {
public:
void* m_geoRefInfo; // used in the GeoReferencing system in VIZ
BOOL IsStdUVGen() { return TRUE; } // method inherited from UVGen
virtual void SetCoordMapping(int)=0;
virtual void SetUOffs(float f, TimeValue t)=0;
virtual void SetVOffs(float f, TimeValue t)=0;
virtual void SetUScl(float f, TimeValue t)=0;
virtual void SetVScl(float f, TimeValue t)=0;
virtual void SetAng(float f, TimeValue t)=0; // angle in radians
virtual void SetUAng(float f, TimeValue t)=0; // angle in radians
virtual void SetVAng(float f, TimeValue t)=0; // angle in radians
virtual void SetWAng(float f, TimeValue t)=0; // angle in radians
virtual void SetBlur(float f, TimeValue t)=0;
virtual void SetBlurOffs(float f, TimeValue t)=0;
virtual void SetNoiseAmt(float f, TimeValue t)=0;
virtual void SetNoiseSize(float f, TimeValue t)=0;
virtual void SetNoiseLev(int i, TimeValue t)=0;
virtual void SetNoisePhs(float f, TimeValue t)=0;
virtual void SetTextureTiling(int tiling)=0;
virtual void SetMapChannel(int i)=0;
virtual void SetFlag(ULONG f, ULONG val)=0;
virtual void SetHideMapBackFlag(BOOL b)=0;
virtual int GetCoordMapping(int)=0;
virtual float GetUOffs( TimeValue t)=0;
virtual float GetVOffs( TimeValue t)=0;
virtual float GetUScl( TimeValue t)=0;
virtual float GetVScl( TimeValue t)=0;
virtual float GetAng( TimeValue t)=0; // angle in radians
virtual float GetUAng( TimeValue t)=0; // angle in radians
virtual float GetVAng( TimeValue t)=0; // angle in radians
virtual float GetWAng( TimeValue t)=0; // angle in radians
virtual float GetBlur( TimeValue t)=0;
virtual float GetBlurOffs( TimeValue t)=0;
virtual float GetNoiseAmt( TimeValue t)=0;
virtual float GetNoiseSize( TimeValue t)=0;
virtual int GetNoiseLev( TimeValue t)=0;
virtual float GetNoisePhs( TimeValue t)=0;
virtual int GetTextureTiling()=0;
virtual int GetMapChannel()=0;
virtual int GetFlag(ULONG f)=0;
virtual BOOL GetHideMapBackFlag()=0;
};
// Values returned by GetCoordSystem, and passed into
// SetCoordSystem
#define XYZ_COORDS 0
#define UVW_COORDS 1
#define UVW2_COORDS 2
#define XYZ_WORLD_COORDS 3
class StdXYZGen: public XYZGen {
public:
BOOL IsStdXYZGen() { return TRUE; }
virtual void SetCoordSystem(int s)=0;
virtual void SetBlur(float f, TimeValue t)=0;
virtual void SetBlurOffs(float f, TimeValue t)=0;
virtual void SetOffs(int axis, float f, TimeValue t)=0;
virtual void SetScl(int axis, float f, TimeValue t)=0;
virtual void SetAng(int axis, float f, TimeValue t)=0;
virtual int GetCoordSystem()=0;
virtual float GetBlur(TimeValue t)=0;
virtual float GetBlurOffs(TimeValue t)=0;
virtual float GetOffs(int axis, TimeValue t)=0;
virtual float GetScl(int axis, TimeValue t)=0;
virtual float GetAng(int axis, TimeValue t)=0;
virtual void SetMapChannel(int i)=0;
virtual int GetMapChannel()=0;
};
#define TEXOUT_XXXXX 1
#define TEXOUT_INVERT 2
#define TEXOUT_CLAMP 4
#define TEXOUT_ALPHA_RGB 8
#define TEXOUT_COLOR_MAP 16
#define TEXOUT_COLOR_MAP_RGB 32
class StdTexoutGen: public TextureOutput {
public:
BOOL IsStdTexoutGen() { return TRUE; }
virtual float GetOutputLevel(TimeValue t)=0;
virtual BOOL GetInvert()=0;
virtual BOOL GetClamp()=0;
virtual BOOL GetAlphaFromRGB()=0;
virtual float GetRGBAmt( TimeValue t)=0;
virtual float GetRGBOff( TimeValue t)=0;
virtual float GetOutAmt( TimeValue t)=0;
virtual float GetBumpAmt( TimeValue t)=0;
virtual BOOL GetFlag(ULONG f)=0;
virtual void SetOutputLevel(TimeValue t, float v)=0;
virtual void SetInvert(BOOL onoff)=0;
virtual void SetClamp(BOOL onoff)=0;
virtual void SetAlphaFromRGB(BOOL onoff)=0;
virtual void SetRGBAmt( float f, TimeValue t)=0;
virtual void SetRGBOff(float f, TimeValue t)=0;
virtual void SetOutAmt(float f, TimeValue t)=0;
virtual void SetBumpAmt(float f, TimeValue t)=0;
virtual void SetFlag(ULONG f, ULONG val)=0;
};
// Image filtering types
#define FILTER_PYR 0
#define FILTER_SAT 1
#define FILTER_NADA 2
// Alpha source types
#define ALPHA_FILE 0
#define ALPHA_RGB 2
#define ALPHA_NONE 3
// End conditions:
#define END_LOOP 0
#define END_PINGPONG 1
#define END_HOLD 2
//***************************************************************
//Function Publishing System stuff
//****************************************************************
#define BITMAPTEX_INTERFACE Interface_ID(0x55b4400e, 0x29ff7cc9)
#define GetIBitmapTextInterface(cd) \
(BitmapTex *)(cd)->GetInterface(BITMAPTEX_INTERFACE)
enum { bitmaptex_reload, bitmaptex_crop };
//****************************************************************
class BitmapTex: public Texmap, public FPMixinInterface {
public:
//Function Publishing System
//Function Map For Mixin Interface
//*************************************************
BEGIN_FUNCTION_MAP
VFN_0(bitmaptex_reload, fnReload);
VFN_0(bitmaptex_crop, fnViewImage);
END_FUNCTION_MAP
virtual void SetFilterType(int ft)=0;
virtual void SetAlphaSource(int as)=0;
virtual void SetEndCondition(int endcond)=0;
virtual void SetAlphaAsMono(BOOL onoff)=0;
virtual void SetAlphaAsRGB(BOOL onoff)=0;
virtual void SetPremultAlpha(BOOL onoff)=0;
virtual void SetMapName(TCHAR *name)=0;
virtual void SetStartTime(TimeValue t)=0;
virtual void SetPlaybackRate(float r)=0;
virtual int GetFilterType()=0;
virtual int GetAlphaSource()=0;
virtual int GetEndCondition()=0;
virtual BOOL GetAlphaAsMono(BOOL onoff)=0;
virtual BOOL GetAlphaAsRGB(BOOL onoff)=0;
virtual BOOL GetPremultAlpha(BOOL onoff)=0;
virtual TCHAR *GetMapName()=0;
virtual TimeValue GetStartTime()=0;
virtual float GetPlaybackRate()=0;
virtual StdUVGen* GetUVGen()=0;
virtual TextureOutput* GetTexout()=0;
virtual void SetBitmap(Bitmap *bm) {}
virtual Bitmap *GetBitmap(TimeValue t) { return NULL; }
//watje pops up a bitmap loader dlg
virtual void BitmapLoadDlg() { }
//watje forces the bitmap to reload and view to be redrawn
virtual void ReloadBitmapAndUpdate() { }
//watje
//published functions
FPInterfaceDesc* GetDesc(); // <-- must implement
virtual void fnReload()=0;
virtual void fnViewImage()=0;
};
class MultiMtl: public Mtl {
public:
virtual void SetNumSubMtls(int n)=0;
virtual void GetSubMtlName(int mtlid, TSTR &s)=0;
virtual void SetSubMtlAndName(int mtlid, Mtl *m, TSTR &subMtlName)=0;
};
class Tex3D: public Texmap {
public:
virtual void ReadSXPData(TCHAR *name, void *sxpdata)=0;
};
class MultiTex: public Texmap {
public:
virtual void SetNumSubTexmaps(int n) {}
virtual void SetColor(int i, Color c, TimeValue t=0){}
};
class GradTex: public MultiTex {
public:
virtual StdUVGen* GetUVGen()=0;
virtual TextureOutput* GetTexout()=0;
virtual void SetMidPoint(float m, TimeValue t=0) {}
};
//===============================================================================
// StdCubic
//===============================================================================
class StdCubic: public Texmap {
public:
virtual void SetSize(int n, TimeValue t)=0;
virtual void SetDoNth(BOOL onoff)=0;
virtual void SetNth(int n)=0;
virtual void SetApplyBlur(BOOL onoff)=0;
virtual void SetBlur(float b, TimeValue t)=0;
virtual void SetBlurOffset(float b, TimeValue t)=0;
virtual void UseHighDynamicRange(BOOL onoff)=0;
virtual int GetSize(TimeValue t)=0;
virtual BOOL GetDoNth()=0;
virtual int GetNth()=0;
virtual BOOL GetApplyBlur()=0;
virtual float GetBlur(TimeValue t)=0;
virtual float GetBlurOffset(TimeValue t)=0;
};
//===============================================================================
// StdMirror
//===============================================================================
class StdMirror: public Texmap {
public:
virtual void SetDoNth(BOOL onoff)=0;
virtual void SetNth(int n)=0;
virtual void SetApplyBlur(BOOL onoff)=0;
virtual void SetBlur(float b, TimeValue t)=0;
virtual void UseHighDynamicRange(BOOL onoff)=0;
virtual BOOL GetDoNth()=0;
virtual int GetNth()=0;
virtual BOOL GetApplyBlur()=0;
virtual float GetBlur(TimeValue t)=0;
};
//===============================================================================
// StdFog
//===============================================================================
// Fallof Types
#define FALLOFF_TOP 0
#define FALLOFF_BOTTOM 1
#define FALLOFF_NONE 2
class StdFog : public Atmospheric {
public:
virtual void SetColor(Color c, TimeValue t)=0;
virtual void SetUseMap(BOOL onoff)=0;
virtual void SetUseOpac(BOOL onoff)=0;
virtual void SetColorMap(Texmap *tex)=0;
virtual void SetOpacMap(Texmap *tex)=0;
virtual void SetFogBackground(BOOL onoff)=0;
virtual void SetType(int type)=0; // 0:Regular, 1:Layered
virtual void SetNear(float v, TimeValue t)=0;
virtual void SetFar(float v, TimeValue t)=0;
virtual void SetTop(float v, TimeValue t)=0;
virtual void SetBottom(float v, TimeValue t)=0;
virtual void SetDensity(float v, TimeValue t)=0;
virtual void SetFalloffType(int tv)=0;
virtual void SetUseNoise(BOOL onoff)=0;
virtual void SetNoiseScale(float v, TimeValue t)=0;
virtual void SetNoiseAngle(float v, TimeValue t)=0;
virtual void SetNoisePhase(float v, TimeValue t)=0;
virtual Color GetColor(TimeValue t)=0;
virtual BOOL GetUseMap()=0;
virtual BOOL GetUseOpac()=0;
virtual Texmap *GetColorMap()=0;
virtual Texmap *GetOpacMap()=0;
virtual BOOL GetFogBackground()=0;
virtual int GetType()=0; // 0:Regular, 1:Layered
virtual float GetNear(TimeValue t)=0;
virtual float GetFar(TimeValue t)=0;
virtual float GetTop(TimeValue t)=0;
virtual float GetBottom(TimeValue t)=0;
virtual float GetDensity(TimeValue t)=0;
virtual int GetFalloffType()=0;
virtual BOOL GetUseNoise()=0;
virtual float GetNoiseScale( TimeValue t)=0;
virtual float GetNoiseAngle( TimeValue t)=0;
virtual float GetNoisePhase( TimeValue t)=0;
};
// Subclasses of Tex3D call this on loading to register themselves
// as being able to read sxpdata for sxpName. (name includes ".SXP")
CoreExport void RegisterSXPReader(TCHAR *sxpName, Class_ID cid);
// When importing, this is called to get a "reader" for the sxp being loaded.
CoreExport Tex3D *GetSXPReaderClass(TCHAR *sxpName);
//==========================================================================
// Create new instances of the standard materials, textures, and atmosphere
//==========================================================================
CoreExport StdMat2 *NewDefaultStdMat();
CoreExport BitmapTex *NewDefaultBitmapTex();
CoreExport MultiMtl *NewDefaultMultiMtl();
CoreExport MultiTex *NewDefaultCompositeTex();
CoreExport MultiTex *NewDefaultMixTex();
CoreExport MultiTex *NewDefaultTintTex();
CoreExport GradTex *NewDefaultGradTex();
CoreExport StdCubic *NewDefaultStdCubic();
CoreExport StdMirror *NewDefaultStdMirror();
CoreExport StdFog *NewDefaultStdFog();
#endif