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