1// tMaterial.cpp 
2// 
3// This file implements a tScene material. The parameters represent a legacy Blinn-Phong material which more or less 
4// matches the fixed function pipeline of OpenGL. More advanced materials/shader-models are handled by explicitly 
5// setting the ShaderFile member to point to a shader, in which case the Blinn-Phong parameters are ignored. 
6// 
7// Copyright (c) 2006, 2017 Tristan Grimmer. 
8// Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby 
9// granted, provided that the above copyright notice and this permission notice appear in all copies. 
10// 
11// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL 
12// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 
13// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 
14// AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
15// PERFORMANCE OF THIS SOFTWARE. 
16#include "Scene/tMaterial.h" 
17namespace tScene 
18
19 
20 
21void tMaterial::Clear() 
22
23 tObject::Clear(); 
24 Shininess = 0.0f
25 Reflectivity = 0.0f
26 Diffusion = 0.0f
27 TextureDiffuse.Clear(); 
28 TextureNormalMap.Clear(); 
29 TextureA.Clear(); 
30 TextureB.Clear(); 
31 TextureC.Clear(); 
32 TextureD.Clear(); 
33 TextureE.Clear(); 
34 ShaderFile.Clear(); 
35 SpecularColour.MakeBlack(); 
36 ReflectedColour.MakeBlack(); 
37 DiffuseColour.MakeBlack(); 
38 Transparency.MakeBlack(); 
39 AmbientColour.MakeBlack(); 
40 Incandescence.MakeBlack(); 
41 UseDiffuseColour = false
42
43 
44 
45bool tMaterial::IsFunctionallySame(const tMaterial& mat) const 
46
47 // Attributes always must be the same for a true return value. 
48 if (!tObject::IsFunctionallySame(mat)) return false
49 if (!ShaderFile.IsEmpty() && (ShaderFile == mat.ShaderFile)) 
50 return true
51 
52 if (AmbientColour != mat.AmbientColour) return false
53 if (DiffuseColour != mat.DiffuseColour) return false
54 if (SpecularColour != mat.SpecularColour) return false
55 
56 if (Shininess != mat.Shininess) return false
57 if (Reflectivity != mat.Reflectivity) return false
58 if (Diffusion != mat.Diffusion) return false
59 
60 if (ReflectedColour != mat.ReflectedColour) return false
61 if (Transparency != mat.Transparency) return false
62 if (Incandescence != mat.Incandescence) return false
63 if (UseDiffuseColour != mat.UseDiffuseColour) return false
64 
65 if (TextureDiffuse != mat.TextureDiffuse) return false
66 if (TextureNormalMap != mat.TextureNormalMap) return false
67 
68 if (TextureA != mat.TextureA) return false
69 if (TextureB != mat.TextureB) return false
70 if (TextureC != mat.TextureC) return false
71 if (TextureD != mat.TextureD) return false
72 if (TextureE != mat.TextureE) return false
73 
74 return true
75
76 
77 
78void tMaterial::Save(tChunkWriter& chunk) const 
79
80 chunk.Begin(tChunkID::Scene_Material); 
81
82 tObject::Save(chunk); 
83 
84 chunk.Begin(tChunkID::Scene_MaterialProperties); 
85
86 chunk.Write(AmbientColour); 
87 chunk.Write(DiffuseColour); 
88 chunk.Write(SpecularColour); 
89 chunk.Write(Shininess); 
90 chunk.Write(Reflectivity); 
91 chunk.Write(Diffusion); 
92 chunk.Write(ReflectedColour); 
93 chunk.Write(Transparency); 
94 chunk.Write(Incandescence); 
95 chunk.Write(UseDiffuseColour); 
96
97 chunk.End(); 
98 
99 if (!TextureDiffuse.IsEmpty()) 
100
101 chunk.Begin(tChunkID::Scene_MaterialTextureDiffuse); 
102 chunk.Write(TextureDiffuse); 
103 chunk.End(); 
104
105 
106 if (!TextureNormalMap.IsEmpty()) 
107
108 chunk.Begin(tChunkID::Scene_MaterialTextureNormalMap); 
109 chunk.Write(TextureNormalMap); 
110 chunk.End(); 
111
112 
113 if (!TextureA.IsEmpty()) 
114
115 chunk.Begin(tChunkID::Scene_MaterialTextureA); 
116 chunk.Write(TextureA); 
117 chunk.End(); 
118
119 
120 if (!TextureB.IsEmpty()) 
121
122 chunk.Begin(tChunkID::Scene_MaterialTextureB); 
123 chunk.Write(TextureB); 
124 chunk.End(); 
125
126 
127 if (!TextureC.IsEmpty()) 
128
129 chunk.Begin(tChunkID::Scene_MaterialTextureC); 
130 chunk.Write(TextureC); 
131 chunk.End(); 
132
133 
134 if (!TextureD.IsEmpty()) 
135
136 chunk.Begin(tChunkID::Scene_MaterialTextureD); 
137 chunk.Write(TextureD); 
138 chunk.End(); 
139
140 
141 if (!TextureE.IsEmpty()) 
142
143 chunk.Begin(tChunkID::Scene_MaterialTextureE); 
144 chunk.Write(TextureE); 
145 chunk.End(); 
146
147 
148 if (!ShaderFile.IsEmpty()) 
149
150 chunk.Begin(tChunkID::Scene_MaterialShaderFile); 
151 chunk.Write(ShaderFile); 
152 chunk.End(); 
153
154
155 chunk.End(); 
156
157 
158 
159void tMaterial::Load(const tChunk& matChunk
160
161 Clear(); 
162 tAssert(matChunk.ID() == tChunkID::Scene_Material); 
163 
164 for (tChunk chunk = matChunk.First(); chunk.Valid(); chunk = chunk.Next()) 
165
166 switch (chunk.ID()) 
167
168 case tChunkID::Scene_Object
169 tObject::Load(chunk); 
170 break
171 
172 case tChunkID::Scene_MaterialProperties
173 chunk.GetItem(AmbientColour); 
174 chunk.GetItem(DiffuseColour); 
175 chunk.GetItem(SpecularColour); 
176 chunk.GetItem(Shininess); 
177 chunk.GetItem(Reflectivity); 
178 chunk.GetItem(Diffusion); 
179 chunk.GetItem(ReflectedColour); 
180 chunk.GetItem(Transparency); 
181 chunk.GetItem(Incandescence); 
182 chunk.GetItem(UseDiffuseColour); 
183 break
184 
185 case tChunkID::Scene_MaterialTextureDiffuse
186 chunk.GetItem(TextureDiffuse); 
187 break
188 
189 case tChunkID::Scene_MaterialTextureNormalMap
190 chunk.GetItem(TextureNormalMap); 
191 break
192 
193 case tChunkID::Scene_MaterialTextureA
194 chunk.GetItem(TextureA); 
195 break
196 
197 case tChunkID::Scene_MaterialTextureB
198 chunk.GetItem(TextureB); 
199 break
200 
201 case tChunkID::Scene_MaterialTextureC
202 chunk.GetItem(TextureC); 
203 break
204 
205 case tChunkID::Scene_MaterialTextureD
206 chunk.GetItem(TextureD); 
207 break
208 
209 case tChunkID::Scene_MaterialTextureE
210 chunk.GetItem(TextureE); 
211 break
212 
213 case tChunkID::Scene_MaterialShaderFile
214 chunk.GetItem(ShaderFile); 
215 break
216
217
218
219 
220 
221tMaterial& tMaterial::operator=(const tMaterial& src
222
223 if (this == &src
224 return *this
225 
226 tObject::operator=(src); 
227 
228 AmbientColour = src.AmbientColour
229 DiffuseColour = src.DiffuseColour
230 SpecularColour = src.SpecularColour
231 
232 Shininess = src.Shininess
233 Reflectivity = src.Reflectivity
234 Diffusion = src.Diffusion
235 
236 ReflectedColour = src.ReflectedColour
237 Transparency = src.Transparency
238 Incandescence = src.Incandescence
239 UseDiffuseColour = src.UseDiffuseColour
240 
241 TextureDiffuse = src.TextureDiffuse
242 TextureNormalMap = src.TextureNormalMap
243 
244 TextureA = src.TextureA
245 TextureB = src.TextureB
246 TextureC = src.TextureC
247 TextureD = src.TextureD
248 TextureE = src.TextureE
249 
250 ShaderFile = src.ShaderFile
251 return *this
252
253 
254 
255}