rev |
line source |
nuclear@0
|
1 /*
|
nuclear@0
|
2 ---------------------------------------------------------------------------
|
nuclear@0
|
3 Open Asset Import Library (assimp)
|
nuclear@0
|
4 ---------------------------------------------------------------------------
|
nuclear@0
|
5
|
nuclear@0
|
6 Copyright (c) 2006-2018, assimp team
|
nuclear@0
|
7
|
nuclear@0
|
8
|
nuclear@0
|
9
|
nuclear@0
|
10 All rights reserved.
|
nuclear@0
|
11
|
nuclear@0
|
12 Redistribution and use of this software in source and binary forms,
|
nuclear@0
|
13 with or without modification, are permitted provided that the following
|
nuclear@0
|
14 conditions are met:
|
nuclear@0
|
15
|
nuclear@0
|
16 * Redistributions of source code must retain the above
|
nuclear@0
|
17 copyright notice, this list of conditions and the
|
nuclear@0
|
18 following disclaimer.
|
nuclear@0
|
19
|
nuclear@0
|
20 * Redistributions in binary form must reproduce the above
|
nuclear@0
|
21 copyright notice, this list of conditions and the
|
nuclear@0
|
22 following disclaimer in the documentation and/or other
|
nuclear@0
|
23 materials provided with the distribution.
|
nuclear@0
|
24
|
nuclear@0
|
25 * Neither the name of the assimp team, nor the names of its
|
nuclear@0
|
26 contributors may be used to endorse or promote products
|
nuclear@0
|
27 derived from this software without specific prior
|
nuclear@0
|
28 written permission of the assimp team.
|
nuclear@0
|
29
|
nuclear@0
|
30 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
nuclear@0
|
31 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
nuclear@0
|
32 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
nuclear@0
|
33 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
nuclear@0
|
34 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
nuclear@0
|
35 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
nuclear@0
|
36 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
nuclear@0
|
37 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
nuclear@0
|
38 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
nuclear@0
|
39 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
nuclear@0
|
40 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
nuclear@0
|
41 ---------------------------------------------------------------------------
|
nuclear@0
|
42 */
|
nuclear@0
|
43
|
nuclear@0
|
44 /** @file material.inl
|
nuclear@0
|
45 * @brief Defines the C++ getters for the material system
|
nuclear@0
|
46 */
|
nuclear@0
|
47
|
nuclear@0
|
48 #pragma once
|
nuclear@0
|
49 #ifndef AI_MATERIAL_INL_INC
|
nuclear@0
|
50 #define AI_MATERIAL_INL_INC
|
nuclear@0
|
51
|
nuclear@0
|
52 // ---------------------------------------------------------------------------
|
nuclear@0
|
53 inline aiPropertyTypeInfo ai_real_to_property_type_info(float)
|
nuclear@0
|
54 {
|
nuclear@0
|
55 return aiPTI_Float;
|
nuclear@0
|
56 }
|
nuclear@0
|
57
|
nuclear@0
|
58 inline aiPropertyTypeInfo ai_real_to_property_type_info(double)
|
nuclear@0
|
59 {
|
nuclear@0
|
60 return aiPTI_Double;
|
nuclear@0
|
61 }
|
nuclear@0
|
62 // ---------------------------------------------------------------------------
|
nuclear@0
|
63
|
nuclear@0
|
64 //! @cond never
|
nuclear@0
|
65
|
nuclear@0
|
66 // ---------------------------------------------------------------------------
|
nuclear@0
|
67 inline aiReturn aiMaterial::GetTexture( aiTextureType type,
|
nuclear@0
|
68 unsigned int index,
|
nuclear@0
|
69 C_STRUCT aiString* path,
|
nuclear@0
|
70 aiTextureMapping* mapping /*= NULL*/,
|
nuclear@0
|
71 unsigned int* uvindex /*= NULL*/,
|
nuclear@0
|
72 ai_real* blend /*= NULL*/,
|
nuclear@0
|
73 aiTextureOp* op /*= NULL*/,
|
nuclear@0
|
74 aiTextureMapMode* mapmode /*= NULL*/) const
|
nuclear@0
|
75 {
|
nuclear@0
|
76 return ::aiGetMaterialTexture(this,type,index,path,mapping,uvindex,blend,op,mapmode);
|
nuclear@0
|
77 }
|
nuclear@0
|
78
|
nuclear@0
|
79 // ---------------------------------------------------------------------------
|
nuclear@0
|
80 inline unsigned int aiMaterial::GetTextureCount(aiTextureType type) const
|
nuclear@0
|
81 {
|
nuclear@0
|
82 return ::aiGetMaterialTextureCount(this,type);
|
nuclear@0
|
83 }
|
nuclear@0
|
84
|
nuclear@0
|
85 // ---------------------------------------------------------------------------
|
nuclear@0
|
86 template <typename Type>
|
nuclear@0
|
87 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
88 unsigned int idx, Type* pOut,
|
nuclear@0
|
89 unsigned int* pMax) const
|
nuclear@0
|
90 {
|
nuclear@0
|
91 unsigned int iNum = pMax ? *pMax : 1;
|
nuclear@0
|
92
|
nuclear@0
|
93 const aiMaterialProperty* prop;
|
nuclear@0
|
94 const aiReturn ret = ::aiGetMaterialProperty(this,pKey,type,idx,
|
nuclear@0
|
95 (const aiMaterialProperty**)&prop);
|
nuclear@0
|
96 if ( AI_SUCCESS == ret ) {
|
nuclear@0
|
97
|
nuclear@0
|
98 if (prop->mDataLength < sizeof(Type)*iNum) {
|
nuclear@0
|
99 return AI_FAILURE;
|
nuclear@0
|
100 }
|
nuclear@0
|
101
|
nuclear@0
|
102 if (prop->mType != aiPTI_Buffer) {
|
nuclear@0
|
103 return AI_FAILURE;
|
nuclear@0
|
104 }
|
nuclear@0
|
105
|
nuclear@0
|
106 iNum = std::min((size_t)iNum,prop->mDataLength / sizeof(Type));
|
nuclear@0
|
107 ::memcpy(pOut,prop->mData,iNum * sizeof(Type));
|
nuclear@0
|
108 if (pMax) {
|
nuclear@0
|
109 *pMax = iNum;
|
nuclear@0
|
110 }
|
nuclear@0
|
111 }
|
nuclear@0
|
112 return ret;
|
nuclear@0
|
113 }
|
nuclear@0
|
114
|
nuclear@0
|
115 // ---------------------------------------------------------------------------
|
nuclear@0
|
116 template <typename Type>
|
nuclear@0
|
117 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
118 unsigned int idx,Type& pOut) const
|
nuclear@0
|
119 {
|
nuclear@0
|
120 const aiMaterialProperty* prop;
|
nuclear@0
|
121 const aiReturn ret = ::aiGetMaterialProperty(this,pKey,type,idx,
|
nuclear@0
|
122 (const aiMaterialProperty**)&prop);
|
nuclear@0
|
123 if ( AI_SUCCESS == ret ) {
|
nuclear@0
|
124
|
nuclear@0
|
125 if (prop->mDataLength < sizeof(Type)) {
|
nuclear@0
|
126 return AI_FAILURE;
|
nuclear@0
|
127 }
|
nuclear@0
|
128
|
nuclear@0
|
129 if (prop->mType != aiPTI_Buffer) {
|
nuclear@0
|
130 return AI_FAILURE;
|
nuclear@0
|
131 }
|
nuclear@0
|
132
|
nuclear@0
|
133 ::memcpy( &pOut, prop->mData, sizeof( Type ) );
|
nuclear@0
|
134 }
|
nuclear@0
|
135 return ret;
|
nuclear@0
|
136 }
|
nuclear@0
|
137
|
nuclear@0
|
138 // ---------------------------------------------------------------------------
|
nuclear@0
|
139 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
140 unsigned int idx,ai_real* pOut,
|
nuclear@0
|
141 unsigned int* pMax) const
|
nuclear@0
|
142 {
|
nuclear@0
|
143 return ::aiGetMaterialFloatArray(this,pKey,type,idx,pOut,pMax);
|
nuclear@0
|
144 }
|
nuclear@0
|
145 // ---------------------------------------------------------------------------
|
nuclear@0
|
146 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
147 unsigned int idx,int* pOut,
|
nuclear@0
|
148 unsigned int* pMax) const
|
nuclear@0
|
149 {
|
nuclear@0
|
150 return ::aiGetMaterialIntegerArray(this,pKey,type,idx,pOut,pMax);
|
nuclear@0
|
151 }
|
nuclear@0
|
152 // ---------------------------------------------------------------------------
|
nuclear@0
|
153 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
154 unsigned int idx,ai_real& pOut) const
|
nuclear@0
|
155 {
|
nuclear@0
|
156 return aiGetMaterialFloat(this,pKey,type,idx,&pOut);
|
nuclear@0
|
157 }
|
nuclear@0
|
158 // ---------------------------------------------------------------------------
|
nuclear@0
|
159 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
160 unsigned int idx,int& pOut) const
|
nuclear@0
|
161 {
|
nuclear@0
|
162 return aiGetMaterialInteger(this,pKey,type,idx,&pOut);
|
nuclear@0
|
163 }
|
nuclear@0
|
164 // ---------------------------------------------------------------------------
|
nuclear@0
|
165 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
166 unsigned int idx,aiColor4D& pOut) const
|
nuclear@0
|
167 {
|
nuclear@0
|
168 return aiGetMaterialColor(this,pKey,type,idx,&pOut);
|
nuclear@0
|
169 }
|
nuclear@0
|
170 // ---------------------------------------------------------------------------
|
nuclear@0
|
171 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
172 unsigned int idx,aiColor3D& pOut) const
|
nuclear@0
|
173 {
|
nuclear@0
|
174 aiColor4D c;
|
nuclear@0
|
175 const aiReturn ret = aiGetMaterialColor(this,pKey,type,idx,&c);
|
nuclear@0
|
176 pOut = aiColor3D(c.r,c.g,c.b);
|
nuclear@0
|
177 return ret;
|
nuclear@0
|
178 }
|
nuclear@0
|
179 // ---------------------------------------------------------------------------
|
nuclear@0
|
180 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
181 unsigned int idx,aiString& pOut) const
|
nuclear@0
|
182 {
|
nuclear@0
|
183 return aiGetMaterialString(this,pKey,type,idx,&pOut);
|
nuclear@0
|
184 }
|
nuclear@0
|
185 // ---------------------------------------------------------------------------
|
nuclear@0
|
186 inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
nuclear@0
|
187 unsigned int idx,aiUVTransform& pOut) const
|
nuclear@0
|
188 {
|
nuclear@0
|
189 return aiGetMaterialUVTransform(this,pKey,type,idx,&pOut);
|
nuclear@0
|
190 }
|
nuclear@0
|
191
|
nuclear@0
|
192
|
nuclear@0
|
193 // ---------------------------------------------------------------------------
|
nuclear@0
|
194 template<class TYPE>
|
nuclear@0
|
195 aiReturn aiMaterial::AddProperty (const TYPE* pInput,
|
nuclear@0
|
196 const unsigned int pNumValues,
|
nuclear@0
|
197 const char* pKey,
|
nuclear@0
|
198 unsigned int type,
|
nuclear@0
|
199 unsigned int index)
|
nuclear@0
|
200 {
|
nuclear@0
|
201 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
202 pNumValues * sizeof(TYPE),
|
nuclear@0
|
203 pKey,type,index,aiPTI_Buffer);
|
nuclear@0
|
204 }
|
nuclear@0
|
205
|
nuclear@0
|
206 // ---------------------------------------------------------------------------
|
nuclear@0
|
207 inline aiReturn aiMaterial::AddProperty(const float* pInput,
|
nuclear@0
|
208 const unsigned int pNumValues,
|
nuclear@0
|
209 const char* pKey,
|
nuclear@0
|
210 unsigned int type,
|
nuclear@0
|
211 unsigned int index)
|
nuclear@0
|
212 {
|
nuclear@0
|
213 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
214 pNumValues * sizeof(float),
|
nuclear@0
|
215 pKey,type,index,aiPTI_Float);
|
nuclear@0
|
216 }
|
nuclear@0
|
217
|
nuclear@0
|
218 // ---------------------------------------------------------------------------
|
nuclear@0
|
219 inline aiReturn aiMaterial::AddProperty(const double* pInput,
|
nuclear@0
|
220 const unsigned int pNumValues,
|
nuclear@0
|
221 const char* pKey,
|
nuclear@0
|
222 unsigned int type,
|
nuclear@0
|
223 unsigned int index)
|
nuclear@0
|
224 {
|
nuclear@0
|
225 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
226 pNumValues * sizeof(double),
|
nuclear@0
|
227 pKey,type,index,aiPTI_Double);
|
nuclear@0
|
228 }
|
nuclear@0
|
229
|
nuclear@0
|
230 // ---------------------------------------------------------------------------
|
nuclear@0
|
231 inline aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput,
|
nuclear@0
|
232 const unsigned int pNumValues,
|
nuclear@0
|
233 const char* pKey,
|
nuclear@0
|
234 unsigned int type,
|
nuclear@0
|
235 unsigned int index)
|
nuclear@0
|
236 {
|
nuclear@0
|
237 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
238 pNumValues * sizeof(aiUVTransform),
|
nuclear@0
|
239 pKey,type,index,ai_real_to_property_type_info(pInput->mRotation));
|
nuclear@0
|
240 }
|
nuclear@0
|
241
|
nuclear@0
|
242 // ---------------------------------------------------------------------------
|
nuclear@0
|
243 inline aiReturn aiMaterial::AddProperty(const aiColor4D* pInput,
|
nuclear@0
|
244 const unsigned int pNumValues,
|
nuclear@0
|
245 const char* pKey,
|
nuclear@0
|
246 unsigned int type,
|
nuclear@0
|
247 unsigned int index)
|
nuclear@0
|
248 {
|
nuclear@0
|
249 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
250 pNumValues * sizeof(aiColor4D),
|
nuclear@0
|
251 pKey,type,index,ai_real_to_property_type_info(pInput->a));
|
nuclear@0
|
252 }
|
nuclear@0
|
253
|
nuclear@0
|
254 // ---------------------------------------------------------------------------
|
nuclear@0
|
255 inline aiReturn aiMaterial::AddProperty(const aiColor3D* pInput,
|
nuclear@0
|
256 const unsigned int pNumValues,
|
nuclear@0
|
257 const char* pKey,
|
nuclear@0
|
258 unsigned int type,
|
nuclear@0
|
259 unsigned int index)
|
nuclear@0
|
260 {
|
nuclear@0
|
261 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
262 pNumValues * sizeof(aiColor3D),
|
nuclear@0
|
263 pKey,type,index,ai_real_to_property_type_info(pInput->b));
|
nuclear@0
|
264 }
|
nuclear@0
|
265
|
nuclear@0
|
266 // ---------------------------------------------------------------------------
|
nuclear@0
|
267 inline aiReturn aiMaterial::AddProperty(const aiVector3D* pInput,
|
nuclear@0
|
268 const unsigned int pNumValues,
|
nuclear@0
|
269 const char* pKey,
|
nuclear@0
|
270 unsigned int type,
|
nuclear@0
|
271 unsigned int index)
|
nuclear@0
|
272 {
|
nuclear@0
|
273 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
274 pNumValues * sizeof(aiVector3D),
|
nuclear@0
|
275 pKey,type,index,ai_real_to_property_type_info(pInput->x));
|
nuclear@0
|
276 }
|
nuclear@0
|
277
|
nuclear@0
|
278 // ---------------------------------------------------------------------------
|
nuclear@0
|
279 inline aiReturn aiMaterial::AddProperty(const int* pInput,
|
nuclear@0
|
280 const unsigned int pNumValues,
|
nuclear@0
|
281 const char* pKey,
|
nuclear@0
|
282 unsigned int type,
|
nuclear@0
|
283 unsigned int index)
|
nuclear@0
|
284 {
|
nuclear@0
|
285 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
286 pNumValues * sizeof(int),
|
nuclear@0
|
287 pKey,type,index,aiPTI_Integer);
|
nuclear@0
|
288 }
|
nuclear@0
|
289
|
nuclear@0
|
290
|
nuclear@0
|
291 // ---------------------------------------------------------------------------
|
nuclear@0
|
292 // The template specializations below are for backwards compatibility.
|
nuclear@0
|
293 // The recommended way to add material properties is using the non-template
|
nuclear@0
|
294 // overloads.
|
nuclear@0
|
295 // ---------------------------------------------------------------------------
|
nuclear@0
|
296
|
nuclear@0
|
297 // ---------------------------------------------------------------------------
|
nuclear@0
|
298 template<>
|
nuclear@0
|
299 inline aiReturn aiMaterial::AddProperty<float>(const float* pInput,
|
nuclear@0
|
300 const unsigned int pNumValues,
|
nuclear@0
|
301 const char* pKey,
|
nuclear@0
|
302 unsigned int type,
|
nuclear@0
|
303 unsigned int index)
|
nuclear@0
|
304 {
|
nuclear@0
|
305 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
306 pNumValues * sizeof(float),
|
nuclear@0
|
307 pKey,type,index,aiPTI_Float);
|
nuclear@0
|
308 }
|
nuclear@0
|
309
|
nuclear@0
|
310 // ---------------------------------------------------------------------------
|
nuclear@0
|
311 template<>
|
nuclear@0
|
312 inline aiReturn aiMaterial::AddProperty<double>(const double* pInput,
|
nuclear@0
|
313 const unsigned int pNumValues,
|
nuclear@0
|
314 const char* pKey,
|
nuclear@0
|
315 unsigned int type,
|
nuclear@0
|
316 unsigned int index)
|
nuclear@0
|
317 {
|
nuclear@0
|
318 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
319 pNumValues * sizeof(double),
|
nuclear@0
|
320 pKey,type,index,aiPTI_Double);
|
nuclear@0
|
321 }
|
nuclear@0
|
322
|
nuclear@0
|
323 // ---------------------------------------------------------------------------
|
nuclear@0
|
324 template<>
|
nuclear@0
|
325 inline aiReturn aiMaterial::AddProperty<aiUVTransform>(const aiUVTransform* pInput,
|
nuclear@0
|
326 const unsigned int pNumValues,
|
nuclear@0
|
327 const char* pKey,
|
nuclear@0
|
328 unsigned int type,
|
nuclear@0
|
329 unsigned int index)
|
nuclear@0
|
330 {
|
nuclear@0
|
331 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
332 pNumValues * sizeof(aiUVTransform),
|
nuclear@0
|
333 pKey,type,index,aiPTI_Float);
|
nuclear@0
|
334 }
|
nuclear@0
|
335
|
nuclear@0
|
336 // ---------------------------------------------------------------------------
|
nuclear@0
|
337 template<>
|
nuclear@0
|
338 inline aiReturn aiMaterial::AddProperty<aiColor4D>(const aiColor4D* pInput,
|
nuclear@0
|
339 const unsigned int pNumValues,
|
nuclear@0
|
340 const char* pKey,
|
nuclear@0
|
341 unsigned int type,
|
nuclear@0
|
342 unsigned int index)
|
nuclear@0
|
343 {
|
nuclear@0
|
344 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
345 pNumValues * sizeof(aiColor4D),
|
nuclear@0
|
346 pKey,type,index,aiPTI_Float);
|
nuclear@0
|
347 }
|
nuclear@0
|
348
|
nuclear@0
|
349 // ---------------------------------------------------------------------------
|
nuclear@0
|
350 template<>
|
nuclear@0
|
351 inline aiReturn aiMaterial::AddProperty<aiColor3D>(const aiColor3D* pInput,
|
nuclear@0
|
352 const unsigned int pNumValues,
|
nuclear@0
|
353 const char* pKey,
|
nuclear@0
|
354 unsigned int type,
|
nuclear@0
|
355 unsigned int index)
|
nuclear@0
|
356 {
|
nuclear@0
|
357 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
358 pNumValues * sizeof(aiColor3D),
|
nuclear@0
|
359 pKey,type,index,aiPTI_Float);
|
nuclear@0
|
360 }
|
nuclear@0
|
361
|
nuclear@0
|
362 // ---------------------------------------------------------------------------
|
nuclear@0
|
363 template<>
|
nuclear@0
|
364 inline aiReturn aiMaterial::AddProperty<aiVector3D>(const aiVector3D* pInput,
|
nuclear@0
|
365 const unsigned int pNumValues,
|
nuclear@0
|
366 const char* pKey,
|
nuclear@0
|
367 unsigned int type,
|
nuclear@0
|
368 unsigned int index)
|
nuclear@0
|
369 {
|
nuclear@0
|
370 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
371 pNumValues * sizeof(aiVector3D),
|
nuclear@0
|
372 pKey,type,index,aiPTI_Float);
|
nuclear@0
|
373 }
|
nuclear@0
|
374
|
nuclear@0
|
375 // ---------------------------------------------------------------------------
|
nuclear@0
|
376 template<>
|
nuclear@0
|
377 inline aiReturn aiMaterial::AddProperty<int>(const int* pInput,
|
nuclear@0
|
378 const unsigned int pNumValues,
|
nuclear@0
|
379 const char* pKey,
|
nuclear@0
|
380 unsigned int type,
|
nuclear@0
|
381 unsigned int index)
|
nuclear@0
|
382 {
|
nuclear@0
|
383 return AddBinaryProperty((const void*)pInput,
|
nuclear@0
|
384 pNumValues * sizeof(int),
|
nuclear@0
|
385 pKey,type,index,aiPTI_Integer);
|
nuclear@0
|
386 }
|
nuclear@0
|
387
|
nuclear@0
|
388 //! @endcond
|
nuclear@0
|
389
|
nuclear@0
|
390 #endif //! AI_MATERIAL_INL_INC
|