Home | Namespaces | Hierarchy | Alphabetical List | Class list | Files | Namespace Members | Class members | File members | Tutorials
SMaterial.h
Go to the documentation of this file.
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
2 // This file is part of the "Irrlicht Engine".
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
4 
5 #ifndef __S_MATERIAL_H_INCLUDED__
6 #define __S_MATERIAL_H_INCLUDED__
7 
8 #include "SColor.h"
9 #include "matrix4.h"
10 #include "irrArray.h"
11 #include "irrMath.h"
12 #include "EMaterialTypes.h"
13 #include "EMaterialFlags.h"
14 #include "SMaterialLayer.h"
15 
16 namespace irr
17 {
18 namespace video
19 {
20  class ITexture;
21 
24  {
25  EBF_ZERO = 0,
36  };
37 
40  {
41  EBO_NONE = 0,
51  };
52 
55  {
59  };
60 
63  {
80  };
81 
84  {
96  ECP_RGB=14,
99  };
100 
102 
105  {
112  };
113 
115 
116  inline f32 pack_textureBlendFunc ( const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact, const E_MODULATE_FUNC modulate=EMFN_MODULATE_1X, const u32 alphaSource=EAS_TEXTURE )
117  {
118  const u32 tmp = (alphaSource << 12) | (modulate << 8) | (srcFact << 4) | dstFact;
119  return FR(tmp);
120  }
121 
123 
124  inline void unpack_textureBlendFunc ( E_BLEND_FACTOR &srcFact, E_BLEND_FACTOR &dstFact,
125  E_MODULATE_FUNC &modulo, u32& alphaSource, const f32 param )
126  {
127  const u32 state = IR(param);
128  alphaSource = (state & 0x0000F000) >> 12;
129  modulo = E_MODULATE_FUNC( ( state & 0x00000F00 ) >> 8 );
130  srcFact = E_BLEND_FACTOR ( ( state & 0x000000F0 ) >> 4 );
131  dstFact = E_BLEND_FACTOR ( ( state & 0x0000000F ) );
132  }
133 
135  inline bool textureBlendFunc_hasAlpha ( const E_BLEND_FACTOR factor )
136  {
137  switch ( factor )
138  {
139  case EBF_SRC_ALPHA:
141  case EBF_DST_ALPHA:
144  return true;
145  default:
146  return false;
147  }
148  }
149 
150 
152 
159  {
173 
175  };
176 
178 
185  {
198  };
199 
201 
203  {
205 
208 
211  };
212 
215  {
216  "Back",
217  "Front",
218  0
219  };
220 
221 
224 
226  class SMaterial
227  {
228  public:
231  : MaterialType(EMT_SOLID), AmbientColor(255,255,255,255), DiffuseColor(255,255,255,255),
232  EmissiveColor(0,0,0,0), SpecularColor(255,255,255,255),
233  Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f),
237  Wireframe(false), PointCloud(false), GouraudShading(true),
238  Lighting(true), ZWriteEnable(true), BackfaceCulling(true), FrontfaceCulling(false),
239  FogEnable(false), NormalizeNormals(false), UseMipMaps(true)
240  { }
241 
243 
244  SMaterial(const SMaterial& other)
245  {
246  // These pointers are checked during assignment
247  for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
248  TextureLayer[i].TextureMatrix = 0;
249  *this = other;
250  }
251 
253 
255  {
256  // Check for self-assignment!
257  if (this == &other)
258  return *this;
259 
260  MaterialType = other.MaterialType;
261 
262  AmbientColor = other.AmbientColor;
263  DiffuseColor = other.DiffuseColor;
266  Shininess = other.Shininess;
269  Thickness = other.Thickness;
270  for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
271  {
272  TextureLayer[i] = other.TextureLayer[i];
273  }
274 
275  Wireframe = other.Wireframe;
276  PointCloud = other.PointCloud;
278  Lighting = other.Lighting;
279  ZWriteEnable = other.ZWriteEnable;
282  FogEnable = other.FogEnable;
284  ZBuffer = other.ZBuffer;
285  AntiAliasing = other.AntiAliasing;
286  ColorMask = other.ColorMask;
291  UseMipMaps = other.UseMipMaps;
292 
293  return *this;
294  }
295 
298 
301 
303 
307 
309 
311 
314 
316 
319 
321 
351 
353 
356 
358 
360 
363 
365 
367 
369 
373 
375 
380 
382 
388 
390 
393 
395 
398 
400 
402 
404 
407  bool Wireframe:1;
408 
410  bool PointCloud:1;
411 
414 
416  bool Lighting:1;
417 
419 
422  bool ZWriteEnable:1;
423 
426 
429 
431  bool FogEnable:1;
432 
434 
436 
438 
439  bool UseMipMaps:1;
440 
442 
445  {
446  return TextureLayer[i].getTextureMatrix();
447  }
448 
450 
453  {
454  if (i<MATERIAL_MAX_TEXTURES)
455  return TextureLayer[i].getTextureMatrix();
456  else
457  return core::IdentityMatrix;
458  }
459 
461 
463  void setTextureMatrix(u32 i, const core::matrix4& mat)
464  {
465  if (i>=MATERIAL_MAX_TEXTURES)
466  return;
468  }
469 
471 
474  {
475  return i < MATERIAL_MAX_TEXTURES ? TextureLayer[i].Texture : 0;
476  }
477 
479 
482  void setTexture(u32 i, ITexture* tex)
483  {
484  if (i>=MATERIAL_MAX_TEXTURES)
485  return;
486  TextureLayer[i].Texture = tex;
487  }
488 
490 
492  void setFlag(E_MATERIAL_FLAG flag, bool value)
493  {
494  switch (flag)
495  {
496  case EMF_WIREFRAME:
497  Wireframe = value; break;
498  case EMF_POINTCLOUD:
499  PointCloud = value; break;
500  case EMF_GOURAUD_SHADING:
501  GouraudShading = value; break;
502  case EMF_LIGHTING:
503  Lighting = value; break;
504  case EMF_ZBUFFER:
505  ZBuffer = value; break;
506  case EMF_ZWRITE_ENABLE:
507  ZWriteEnable = value; break;
509  BackfaceCulling = value; break;
511  FrontfaceCulling = value; break;
512  case EMF_BILINEAR_FILTER:
513  {
514  for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
515  TextureLayer[i].BilinearFilter = value;
516  }
517  break;
519  {
520  for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
521  TextureLayer[i].TrilinearFilter = value;
522  }
523  break;
525  {
526  if (value)
527  for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
528  TextureLayer[i].AnisotropicFilter = 0xFF;
529  else
530  for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
531  TextureLayer[i].AnisotropicFilter = 0;
532  }
533  break;
534  case EMF_FOG_ENABLE:
535  FogEnable = value; break;
537  NormalizeNormals = value; break;
538  case EMF_TEXTURE_WRAP:
539  {
540  for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
541  {
544  }
545  }
546  break;
547  case EMF_ANTI_ALIASING:
548  AntiAliasing = value?EAAM_SIMPLE:EAAM_OFF; break;
549  case EMF_COLOR_MASK:
550  ColorMask = value?ECP_ALL:ECP_NONE; break;
551  case EMF_COLOR_MATERIAL:
552  ColorMaterial = value?ECM_DIFFUSE:ECM_NONE; break;
553  case EMF_USE_MIP_MAPS:
554  UseMipMaps = value; break;
555  case EMF_BLEND_OPERATION:
556  BlendOperation = value?EBO_ADD:EBO_NONE; break;
557  case EMF_POLYGON_OFFSET:
558  PolygonOffsetFactor = value?1:0;
560  break;
561  default:
562  break;
563  }
564  }
565 
567 
569  bool getFlag(E_MATERIAL_FLAG flag) const
570  {
571  switch (flag)
572  {
573  case EMF_WIREFRAME:
574  return Wireframe;
575  case EMF_POINTCLOUD:
576  return PointCloud;
577  case EMF_GOURAUD_SHADING:
578  return GouraudShading;
579  case EMF_LIGHTING:
580  return Lighting;
581  case EMF_ZBUFFER:
582  return ZBuffer!=ECFN_NEVER;
583  case EMF_ZWRITE_ENABLE:
584  return ZWriteEnable;
586  return BackfaceCulling;
588  return FrontfaceCulling;
589  case EMF_BILINEAR_FILTER:
590  return TextureLayer[0].BilinearFilter;
592  return TextureLayer[0].TrilinearFilter;
594  return TextureLayer[0].AnisotropicFilter!=0;
595  case EMF_FOG_ENABLE:
596  return FogEnable;
598  return NormalizeNormals;
599  case EMF_TEXTURE_WRAP:
600  return !(TextureLayer[0].TextureWrapU ||
608  case EMF_ANTI_ALIASING:
609  return (AntiAliasing==1);
610  case EMF_COLOR_MASK:
611  return (ColorMask!=ECP_NONE);
612  case EMF_COLOR_MATERIAL:
613  return (ColorMaterial != ECM_NONE);
614  case EMF_USE_MIP_MAPS:
615  return UseMipMaps;
616  case EMF_BLEND_OPERATION:
617  return BlendOperation != EBO_NONE;
618  case EMF_POLYGON_OFFSET:
619  return PolygonOffsetFactor != 0;
620  }
621 
622  return false;
623  }
624 
626 
628  inline bool operator!=(const SMaterial& b) const
629  {
630  bool different =
631  MaterialType != b.MaterialType ||
632  AmbientColor != b.AmbientColor ||
633  DiffuseColor != b.DiffuseColor ||
636  Shininess != b.Shininess ||
639  Thickness != b.Thickness ||
640  Wireframe != b.Wireframe ||
641  PointCloud != b.PointCloud ||
643  Lighting != b.Lighting ||
644  ZBuffer != b.ZBuffer ||
645  ZWriteEnable != b.ZWriteEnable ||
648  FogEnable != b.FogEnable ||
650  AntiAliasing != b.AntiAliasing ||
651  ColorMask != b.ColorMask ||
656  UseMipMaps != b.UseMipMaps;
657  for (u32 i=0; (i<MATERIAL_MAX_TEXTURES) && !different; ++i)
658  {
659  different |= (TextureLayer[i] != b.TextureLayer[i]);
660  }
661  return different;
662  }
663 
665 
667  inline bool operator==(const SMaterial& b) const
668  { return !(b!=*this); }
669 
670  bool isTransparent() const
671  {
676  }
677  };
678 
680  IRRLICHT_API extern SMaterial IdentityMaterial;
681 
682 } // end namespace video
683 } // end namespace irr
684 
685 #endif

The Irrlicht Engine
The Irrlicht Engine Documentation © 2003-2010 by Nikolaus Gebhardt. Generated on Mon May 6 2013 07:46:00 by Doxygen (1.8.1.2)