1 /********************************************************************** 2 *< 3 FILE: stdmtl.h 4 5 DESCRIPTION: 6 7 CREATED BY: Dan Silva 8 9 HISTORY: 10 11 *> Copyright (c) 1994, All Rights Reserved. 12 **********************************************************************/ 13 14 #ifndef __STDMTL__H 15 #define __STDMTL__H 16 17 #include "stdmat.h" 18 #include "texmaps.h" 19 20 // StdMtl flags values 21 #define STDMTL_ADD_TRANSP (1<<0) 22 #define STDMTL_FALLOFF_OUT (1<<1) 23 #define STDMTL_WIRE (1<<2) 24 #define STDMTL_2SIDE (1<<3) 25 #define STDMTL_SOFTEN (1<<4) 26 #define STDMTL_FILT_TRANSP (1<<5) 27 #define STDMTL_WIRE_UNITS (1<<6) 28 #define STDMTL_LOCK_AD (1<<8) 29 #define STDMTL_LOCK_DS (1<<9) 30 #define STDMTL_UNUSED1 (1<<10) 31 #define STDMTL_LOCK_ADTEX (1<<11) 32 #define STDMTL_FACEMAP (1<<12) 33 #define STDMTL_OLDSPEC (1<<13) 34 #define STDMTL_SSAMP (1<<14) 35 36 #define STDMTL_ROLLUP1_OPEN (1<<28) 37 #define STDMTL_ROLLUP2_OPEN (1<<29) 38 #define STDMTL_ROLLUP3_OPEN (1<<30) 39 #define STDMTL_ROLLUP4_OPEN (1<<27) 40 41 #define STDMTL_ROLLUP_FLAGS (STDMTL_ROLLUP1_OPEN|STDMTL_ROLLUP2_OPEN|STDMTL_ROLLUP3_OPEN|STDMTL_ROLLUP4_OPEN) 42 43 44 class StdMtlDlg; 45 class Sampler; 46 struct SIllumParams; 47 48 class SShader { 49 public: 50 virtual void Illum(ShadeContext &sc, SIllumParams &ip)=0; 51 virtual void AffectReflMap(ShadeContext &sc, SIllumParams &ip, Color &rcol)=0; 52 virtual void SetShininess(float shininess, float shineStr)=0; 53 virtual float EvalHilite(float x)=0; 54 }; 55 56 class StdMtl: public StdMat { 57 // Animatable parameters 58 public: 59 IParamBlock *pblock; // ref 0 60 Texmaps* maps; // ref 1 61 Interval ivalid; 62 StdMtlDlg *paramDlg; 63 ULONG flags; 64 int rollScroll; 65 int shading; 66 SShader *curShader; 67 68 // Cache values: must call Update() when change frame. 69 Color ambient; 70 Color diffuse; 71 Color specular; 72 Color filter; 73 float shininess; 74 float shine_str; 75 float self_illum; 76 float opacity; 77 float opfall; 78 float phongexp; 79 float wireSize; 80 float ioRefract; 81 float dimIntens; 82 float dimMult; 83 float softThresh; 84 BOOL dimReflect; 85 86 void SetFlag(ULONG f, ULONG val); 87 void EnableMap(int i, BOOL onoff); IsMapEnabled(int i)88 BOOL IsMapEnabled(int i) { return (*maps)[i].mapOn; } KeyAtTime(int id,TimeValue t)89 BOOL KeyAtTime(int id,TimeValue t) { return pblock->KeyFrameAtTime(id,t); } 90 BOOL AmtKeyAtTime(int i, TimeValue t); 91 void SetShadingNoNotify( int s); 92 93 // from StdMat 94 void SetAmbient(Color c, TimeValue t); 95 void SetDiffuse(Color c, TimeValue t); 96 void SetSpecular(Color c, TimeValue t); 97 void SetFilter(Color c, TimeValue t); 98 void SetShininess(float v, TimeValue t); 99 void SetShinStr(float v, TimeValue t); 100 void SetSelfIllum(float v, TimeValue t); 101 void SetTexmapAmt(int imap, float amt, TimeValue t); 102 void SetWireSize(float s, TimeValue t); SetSelfIllumColor(class Color,int)103 void SetSelfIllumColor(class Color,int){} SetSelfIllumColorOn(BOOL)104 void SetSelfIllumColorOn(BOOL){} IsSelfIllumColorOn()105 int IsSelfIllumColorOn(){ return FALSE; } 106 // >>>> sampling SetSamplingOn(BOOL on)107 void SetSamplingOn( BOOL on ){} GetSamplingOn()108 BOOL GetSamplingOn(){ return FALSE; } SetSamplingQuality(float quality)109 void SetSamplingQuality( float quality ) { } GetSamplingQuality()110 float GetSamplingQuality(){ return 1.0f; } SetPixelSampler(Sampler * sampler)111 void SetPixelSampler( Sampler * sampler ){} GetPixelSampler(int mtlId,BOOL backFace)112 Sampler * GetPixelSampler(int mtlId, BOOL backFace){ return NULL; } 113 114 // >>>Shaders 115 void SetShaderId( long shaderId ); 116 long GetShaderId(); SetShader(Shader * pShader)117 void SetShader( Shader* pShader ){} GetShader()118 Shader* GetShader(){ return NULL; } 119 SetShading(int s)120 void SetShading(int s){ SetShaderId(s); } SetSoften(BOOL onoff)121 void SetSoften(BOOL onoff) { SetFlag(STDMTL_SOFTEN,onoff); } SetFaceMap(BOOL onoff)122 void SetFaceMap(BOOL onoff) { SetFlag(STDMTL_FACEMAP,onoff); } SetTwoSided(BOOL onoff)123 void SetTwoSided(BOOL onoff) { SetFlag(STDMTL_2SIDE,onoff); } SetWire(BOOL onoff)124 void SetWire(BOOL onoff){ SetFlag(STDMTL_WIRE,onoff); } SetWireUnits(BOOL onoff)125 void SetWireUnits(BOOL onoff) { SetFlag(STDMTL_WIRE_UNITS,onoff); } SetFalloffOut(BOOL onoff)126 void SetFalloffOut(BOOL onoff) { SetFlag(STDMTL_FALLOFF_OUT,onoff); } 127 void SetTransparencyType(int type); LockAmbDiffTex(BOOL onoff)128 void LockAmbDiffTex(BOOL onoff) { SetFlag(STDMTL_LOCK_ADTEX,onoff); } 129 void SetOpacity(float v, TimeValue t); 130 void SetOpacFalloff(float v, TimeValue t); 131 void SetIOR(float v, TimeValue t); 132 void SetDimIntens(float v, TimeValue t); 133 void SetDimMult(float v, TimeValue t); 134 void SetSoftenLevel(float v, TimeValue t); 135 GetFlag(ULONG f)136 int GetFlag(ULONG f) { return (flags&f)?1:0; } 137 138 139 // from Mtl 140 Color GetAmbient(int mtlNum=0, BOOL backFace=FALSE); 141 Color GetDiffuse(int mtlNum=0, BOOL backFace=FALSE); 142 Color GetSpecular(int mtlNum=0, BOOL backFace=FALSE); 143 float GetShininess(int mtlNum=0, BOOL backFace=FALSE) { return shininess; } 144 float GetShinStr(int mtlNum=0, BOOL backFace=FALSE) { return shine_str; } 145 float GetXParency(int mtlNum=0, BOOL backFace=FALSE) { if(opacity>0.9f && opfall>0.0f) return 0.1f; return 1.0f-opacity; } 146 float WireSize(int mtlNum=0, BOOL backFace=FALSE) { return wireSize; } 147 float GetSelfIllum(int mtlNum=0, BOOL backFace=FALSE) { return self_illum; } 148 149 // Dynamics properties 150 float GetDynamicsProperty(TimeValue t, int mtlNum, int propID); 151 void SetDynamicsProperty(TimeValue t, int mtlNum, int propID, float value); 152 153 // from StdMat GetShading()154 int GetShading(){ return GetShaderId(); } GetSoften()155 BOOL GetSoften() { return GetFlag(STDMTL_SOFTEN); } GetFaceMap()156 BOOL GetFaceMap() { return GetFlag(STDMTL_FACEMAP); } GetTwoSided()157 BOOL GetTwoSided() { return GetFlag(STDMTL_2SIDE); } GetWire()158 BOOL GetWire() { return GetFlag(STDMTL_WIRE); } GetWireUnits()159 BOOL GetWireUnits() { return GetFlag(STDMTL_WIRE_UNITS); } GetFalloffOut()160 BOOL GetFalloffOut() { return GetFlag(STDMTL_FALLOFF_OUT); } // 1: out, 0: in GetAmbDiffTexLock()161 BOOL GetAmbDiffTexLock(){ return GetFlag(STDMTL_LOCK_ADTEX); } GetTransparencyType()162 int GetTransparencyType() { 163 return (flags&STDMTL_FILT_TRANSP)?TRANSP_FILTER: 164 flags&STDMTL_ADD_TRANSP ? TRANSP_ADDITIVE: TRANSP_SUBTRACTIVE; 165 } 166 Color GetAmbient(TimeValue t); 167 Color GetDiffuse(TimeValue t); 168 Color GetSpecular(TimeValue t); 169 Color GetFilter(TimeValue t); 170 float GetShininess( TimeValue t); 171 float GetShinStr(TimeValue t); 172 float GetSelfIllum(TimeValue t); 173 float GetOpacity( TimeValue t); 174 float GetOpacFalloff(TimeValue t); 175 float GetWireSize(TimeValue t); 176 float GetIOR( TimeValue t); 177 float GetDimIntens( TimeValue t); 178 float GetDimMult( TimeValue t); 179 float GetSoftenLevel( TimeValue t); 180 BOOL MapEnabled(int i); 181 float GetTexmapAmt(int imap, TimeValue t); 182 183 // internal GetSelfIll()184 float GetSelfIll() { return self_illum; } GetOpacity()185 float GetOpacity() { return opacity; } GetOpacFalloff()186 float GetOpacFalloff() { return opfall; } 187 float GetTexmapAmt(int imap); 188 Color GetFilter(); GetIOR()189 float GetIOR() { return ioRefract; } 190 StdMtl(BOOL loading = FALSE); SetParamDlg(StdMtlDlg * pd)191 void SetParamDlg( StdMtlDlg *pd) { paramDlg = pd; } 192 INT_PTR ParamWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); 193 ParamDlg* CreateParamDlg(HWND hwMtlEdit, IMtlParams *imp); 194 Color TranspColor(ShadeContext& sc, float opac, Color& diff); 195 void Shade(ShadeContext& sc); 196 float EvalDisplacement(ShadeContext& sc); 197 Interval DisplacementValidity(TimeValue t); 198 void Update(TimeValue t, Interval& validr); 199 void Reset(); 200 void OldVerFix(int loadVer); 201 Interval Validity(TimeValue t); 202 void NotifyChanged(); 203 void UpdateShader(); 204 205 206 // Requirements 207 ULONG Requirements(int subMtlNum); 208 209 // Methods to access texture maps of material NumSubTexmaps()210 int NumSubTexmaps() { return NTEXMAPS; } GetSubTexmap(int i)211 Texmap* GetSubTexmap(int i) { return (*maps)[i].map; } MapSlotType(int i)212 int MapSlotType(int i) { 213 if (i==ID_DP) return MAPSLOT_DISPLACEMENT; 214 return (i==ID_RL||i==ID_RR)?MAPSLOT_ENVIRON:MAPSLOT_TEXTURE; 215 } 216 void SetSubTexmap(int i, Texmap *m); 217 TSTR GetSubTexmapSlotName(int i); SubTexmapOn(int i)218 int SubTexmapOn(int i) { return MAPACTIVE(i); } 219 220 Class_ID ClassID(); SuperClassID()221 SClass_ID SuperClassID() { return MATERIAL_CLASS_ID; } GetClassName(TSTR & s)222 void GetClassName(TSTR& s) { s = GetString(IDS_DS_STANDARD); } 223 224 void DeleteThis(); 225 NumSubs()226 int NumSubs() { return 2; } 227 Animatable* SubAnim(int i); 228 TSTR SubAnimName(int i); SubNumToRefNum(int subNum)229 int SubNumToRefNum(int subNum) {return subNum; } 230 231 // From ref NumRefs()232 int NumRefs() { return 2; } 233 RefTargetHandle GetReference(int i); 234 void SetReference(int i, RefTargetHandle rtarg); 235 236 RefTargetHandle Clone(RemapDir &remap = DefaultRemapDir()); 237 RefResult NotifyRefChanged( Interval changeInt, RefTargetHandle hTarget, 238 PartID& partID, RefMessage message ); 239 240 // IO 241 IOResult Save(ISave *isave); 242 IOResult Load(ILoad *iload); 243 244 }; 245 246 Mtl* CreateStdMtl(); 247 248 #endif 249