// Copyright (C) 2002-2007 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h #ifndef __E_MATERIAL_TYPES_H_INCLUDED__ #define __E_MATERIAL_TYPES_H_INCLUDED__ namespace irr { namespace video { //! Abstracted and easy to use fixed function/programmable pipeline material modes. enum E_MATERIAL_TYPE { //! Standard solid material. Only first texture is used, which is //! supposed to be the diffuse material. EMT_SOLID = 0, //! Solid material with 2 texture layers. The second is blended onto the //! first using the alpha value of the vertex colors. //! This material is currently not implemented in OpenGL, but it //! works with DirectX. EMT_SOLID_2_LAYER, //! Material type with standard lightmap technique: //! There should be 2 textures: The first texture layer is a diffuse map, //! the second is a light map. Vertex light is ignored. EMT_LIGHTMAP, //! Material type with lightmap technique like EMT_LIGHTMAP, but //! lightmap and diffuse texture are not modulated, but added instead. EMT_LIGHTMAP_ADD, //! Material type with standard lightmap technique: //! There should be 2 textures: The first texture layer is a diffuse map, //! the second is a light map. Vertex light is ignored. //! The texture colors are effectively multiplyied by 2 for brightening. //! like known in DirectX as D3DTOP_MODULATE2X. EMT_LIGHTMAP_M2, //! Material type with standard lightmap technique: //! There should be 2 textures: The first texture layer is a diffuse map, //! the second is a light map. Vertex light is ignored. //! The texture colors are effectively multiplyied by 4 for brightening. //! like known in DirectX as D3DTOP_MODULATE4X. EMT_LIGHTMAP_M4, //! Like EMT_LIGHTMAP, but also supports dynamic lighting. EMT_LIGHTMAP_LIGHTING, //! Like EMT_LIGHTMAP_M2, but also supports dynamic lighting. EMT_LIGHTMAP_LIGHTING_M2, //! Like EMT_LIGHTMAP_4, but also supports dynamic lighting. EMT_LIGHTMAP_LIGHTING_M4, //! Detail mapped material. The first texture is diffuse color map, the //! second is added to this and usually displayed with a bigger scale value //! so that it adds more detail. The detail map is added to the diffuse map using //! ADD_SIGNED, so that it is possible to add and substract color from the diffuse //! map. For example a value of (127,127,127) will not change the appearance of //! the diffuse map at all. //! Often used for terrain rendering. EMT_DETAIL_MAP, //! Makes the material look like it was reflection the environment //! around it. To make this possible, a texture called 'sphere map' //! is used, which must be set as Textures[0]. EMT_SPHERE_MAP, //! A reflecting material with an //! optional additional non reflecting texture layer. The reflection //! map should be set as Texture 1. EMT_REFLECTION_2_LAYER, //! A transparent material. Only the first texture is used. //! The new color is calculated by simply adding the source color and //! the dest color. This means if for example a billboard using a texture with //! black background and a red circle on it is drawn with this material, the //! result is that only the red circle will be drawn a little bit transparent, //! and everything which was black is 100% transparent and not visible. //! This material type is useful for e.g. particle effects. EMT_TRANSPARENT_ADD_COLOR, //! Makes the material transparent based on the texture alpha channel. //! The final color is blended together from the destination color and the //! texture color, using the alpha channel value as blend factor. //! Only first texture is used. If you are using this material with small //! textures, it is a good idea to load the texture in 32 bit //! mode (video::IVideoDriver::setTextureCreationFlag()). //! Also, an alpha ref is used, which can be manipulated using SMaterial::MaterialTypeParam. //! If set to 0, the alpha ref gets its default value which is 0.5f and which means //! that pixels with an alpha value >127 will be written, others not. In other, simple //! words: this value controls how sharp the edges become when going from a //! transparent to a solid spot on the texture. EMT_TRANSPARENT_ALPHA_CHANNEL, //! Makes the material transparent based on the texture alpha channel. //! If the alpha channel value is greater than 127, a pixel is written to the //! target, otherwise not. This material does not use alpha blending //! and is a lot faster than EMT_TRANSPARENT_ALPHA_CHANNEL. It //! is ideal for drawing stuff like leafes of plants, because the borders //! are not blurry but sharp. //! Only first texture is used. If you are using this material with small //! textures and 3d object, it is a good idea to load the texture in 32 bit //! mode (video::IVideoDriver::setTextureCreationFlag()). EMT_TRANSPARENT_ALPHA_CHANNEL_REF, //! Makes the material transparent based on the vertex alpha value. EMT_TRANSPARENT_VERTEX_ALPHA, //! A transparent reflecting material with an //! optional additional non reflecting texture layer. The reflection //! map should be set as Texture 1. The transparency depends on the //! alpha value in the vertex colors. A texture which will not reflect //! can be set als Texture 2. //! Please note that this material type is currently not 100% implemented //! in OpenGL. It works in Direct3D. EMT_TRANSPARENT_REFLECTION_2_LAYER, //! A solid normal map renderer. First texture is the color map, the //! second should be the normal map. Note that you should use this material //! only when drawing geometry consisting of vertices of type S3DVertexTangents //! (EVT_TANGENTS). You can convert any mesh into this format using //! IMeshManipulator::createMeshWithTangents() (See SpecialFX2 Tutorial). //! This shader runs on vertex shader 1.1 and pixel shader 1.1 capable hardware and //! falls back on a fixed function lighted material if this hardware is not available. //! Only two lights are supported by this shader, if there are more, the nearest two //! are chosen. Currently, this shader is only implemented for the D3D8 and D3D9 renderers. EMT_NORMAL_MAP_SOLID, //! A transparent normal map renderer. First texture is the color map, the //! second should be the normal map. Note that you should use this material //! only when drawing geometry consisting of vertices of type S3DVertexTangents //! (EVT_TANGENTS). You can convert any mesh into this format using //! IMeshManipulator::createMeshWithTangents() (See SpecialFX2 Tutorial). //! This shader runs on vertex shader 1.1 and pixel shader 1.1 capable hardware and //! falls back on a fixed function lighted material if this hardware is not available. //! Only two lights are supported by this shader, if there are more, the nearest two //! are chosen. Currently, this shader is only implemented for the D3D8 and D3D9 renderers. EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR, //! A transparent (based on the vertex alpha value) normal map renderer. //! First texture is the color map, the //! second should be the normal map. Note that you should use this material //! only when drawing geometry consisting of vertices of type S3DVertexTangents //! (EVT_TANGENTS). You can convert any mesh into this format using //! IMeshManipulator::createMeshWithTangents() (See SpecialFX2 Tutorial). //! This shader runs on vertex shader 1.1 and pixel shader 1.1 capable hardware and //! falls back on a fixed function lighted material if this hardware is not available. //! Only two lights are supported by this shader, if there are more, the nearest two //! are chosen. Currently, this shader is only implemented for the D3D8 and D3D9 renderers. EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA, //! Just like EMT_NORMAL_MAP_SOLID, but uses parallax mapping too, which //! looks a lot more realistic. This only works when the hardware supports at //! least vertex shader 1.1 and pixel shader 1.4. //! First texture is the color map, the second should be the normal map. //! The normal map texture should contain the height value in the //! alpha component. The IVideoDriver::makeNormalMapTexture() method writes //! this value automaticly when creating normal maps from a heightmap when using a 32 bit //! texture. //! The height scale of the material (affecting the bumpiness) is being controlled //! by the SMaterial::MaterialTypeParam member. //! If set to zero, the default value (0.02f) will be applied. Otherwise //! the value set in SMaterial::MaterialTypeParam is taken. This value depends on with which //! scale the texture is mapped on the material. Too high or low values of MaterialTypeParam //! can result in strange artifacts. EMT_PARALLAX_MAP_SOLID, //! A material just like EMT_PARALLAX_MAP_SOLID, but it is transparent, using //! EMT_TRANSPARENT_ADD_COLOR as base material. EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR, //! A material just like EMT_PARALLAX_MAP_SOLID, but it is transparent, using //! EMT_TRANSPARENT_VERTEX_ALPHA as base material. EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA, //! BlendFunc = source * sourceFactor + dest * destFactor ( E_BLEND_FUNC ) //! Using only Textures[0]. generic Blender EMT_ONETEXTURE_BLEND, //! This value is not used. It only forces this enumeration to compile in 32 bit. EMT_FORCE_32BIT = 0x7fffffff }; //! Array holding the built in material type names const char* const sBuiltInMaterialTypeNames[] = { "solid", "solid_2layer", "lightmap", "lightmap_add", "lightmap_m2", "lightmap_m4", "lightmap_light", "lightmap_light_m2", "lightmap_light_m4", "detail_map", "sphere_map", "reflection_2layer", "trans_add", "trans_alphach", "trans_alphach_ref", "trans_vertex_alpha", "trans_reflection_2layer", "normalmap_solid", "normalmap_trans_add", "normalmap_trans_vertexalpha", "parallaxmap_solid", "parallaxmap_trans_add", "parallaxmap_trans_vertexalpha", "onetexture_blend", 0 }; } // end namespace video } // end namespace irr #endif // __E_MATERIAL_TYPES_H_INCLUDED__