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}