1 // Copyright (C) 2002-2012 Nikolaus Gebhardt / Thomas Alten 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 __I_BURNING_SHADER_H_INCLUDED__ 6 #define __I_BURNING_SHADER_H_INCLUDED__ 7 8 #include "SoftwareDriver2_compile_config.h" 9 #include "IReferenceCounted.h" 10 #include "irrMath.h" 11 #include "IImage.h" 12 #include "S2DVertex.h" 13 #include "rect.h" 14 #include "CDepthBuffer.h" 15 #include "S4DVertex.h" 16 #include "irrArray.h" 17 #include "SLight.h" 18 #include "SMaterial.h" 19 #include "os.h" 20 21 22 namespace irr 23 { 24 25 namespace video 26 { 27 28 struct SBurningShaderLight 29 { 30 //SLight org; 31 bool LightIsOn; 32 33 E_LIGHT_TYPE Type; 34 f32 radius; 35 f32 linearAttenuation; 36 f32 constantAttenuation; 37 f32 quadraticAttenuation; 38 sVec4 pos; 39 40 sVec3 AmbientColor; 41 sVec3 DiffuseColor; 42 sVec3 SpecularColor; 43 sVec4 pos_objectspace; 44 }; 45 46 enum eLightFlags 47 { 48 ENABLED = 0x01, 49 POINTLIGHT = 0x02, 50 SPECULAR = 0x04, 51 FOG = 0x08, 52 NORMALIZE = 0x10, 53 VERTEXTRANSFORM = 0x20, 54 }; 55 56 struct SBurningShaderLightSpace 57 { resetSBurningShaderLightSpace58 void reset () 59 { 60 Light.set_used ( 0 ); 61 Global_AmbientLight.set ( 0.f, 0.f, 0.f ); 62 Flags = 0; 63 } 64 core::array<SBurningShaderLight> Light; 65 sVec3 Global_AmbientLight; 66 sVec4 FogColor; 67 sVec4 campos; 68 sVec4 vertex; 69 sVec4 normal; 70 u32 Flags; 71 }; 72 73 struct SBurningShaderMaterial 74 { 75 SMaterial org; 76 77 sVec3 AmbientColor; 78 sVec3 DiffuseColor; 79 sVec3 SpecularColor; 80 sVec3 EmissiveColor; 81 82 }; 83 84 enum EBurningFFShader 85 { 86 ETR_FLAT = 0, 87 ETR_FLAT_WIRE, 88 ETR_GOURAUD, 89 ETR_GOURAUD_WIRE, 90 ETR_TEXTURE_FLAT, 91 ETR_TEXTURE_FLAT_WIRE, 92 ETR_TEXTURE_GOURAUD, 93 ETR_TEXTURE_GOURAUD_WIRE, 94 ETR_TEXTURE_GOURAUD_NOZ, 95 ETR_TEXTURE_GOURAUD_ADD, 96 ETR_TEXTURE_GOURAUD_ADD_NO_Z, 97 98 ETR_TEXTURE_GOURAUD_VERTEX_ALPHA, 99 100 ETR_TEXTURE_GOURAUD_LIGHTMAP_M1, 101 ETR_TEXTURE_GOURAUD_LIGHTMAP_M2, 102 ETR_TEXTURE_GOURAUD_LIGHTMAP_M4, 103 ETR_TEXTURE_LIGHTMAP_M4, 104 105 ETR_TEXTURE_GOURAUD_DETAIL_MAP, 106 ETR_TEXTURE_GOURAUD_LIGHTMAP_ADD, 107 108 ETR_GOURAUD_ALPHA, 109 ETR_GOURAUD_ALPHA_NOZ, 110 111 ETR_TEXTURE_GOURAUD_ALPHA, 112 ETR_TEXTURE_GOURAUD_ALPHA_NOZ, 113 114 ETR_NORMAL_MAP_SOLID, 115 ETR_STENCIL_SHADOW, 116 117 ETR_TEXTURE_BLEND, 118 ETR_REFERENCE, 119 ETR_INVALID, 120 121 ETR2_COUNT 122 }; 123 124 125 class CBurningVideoDriver; 126 class IBurningShader : public virtual IReferenceCounted 127 { 128 public: 129 IBurningShader(CBurningVideoDriver* driver); 130 131 //! destructor 132 virtual ~IBurningShader(); 133 134 //! sets a render target 135 virtual void setRenderTarget(video::IImage* surface, const core::rect<s32>& viewPort); 136 137 //! sets the Texture 138 virtual void setTextureParam( u32 stage, video::CSoftwareTexture2* texture, s32 lodLevel); 139 virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) = 0; drawLine(const s4DVertex * a,const s4DVertex * b)140 virtual void drawLine ( const s4DVertex *a,const s4DVertex *b) {}; 141 setParam(u32 index,f32 value)142 virtual void setParam ( u32 index, f32 value) {}; setZCompareFunc(u32 func)143 virtual void setZCompareFunc ( u32 func) {}; 144 setMaterial(const SBurningShaderMaterial & material)145 virtual void setMaterial ( const SBurningShaderMaterial &material ) {}; 146 147 protected: 148 149 CBurningVideoDriver *Driver; 150 151 video::CImage* RenderTarget; 152 CDepthBuffer* DepthBuffer; 153 CStencilBuffer * Stencil; 154 tVideoSample ColorMask; 155 156 sInternalTexture IT[ BURNING_MATERIAL_MAX_TEXTURES ]; 157 158 static const tFixPointu dithermask[ 4 * 4]; 159 }; 160 161 162 IBurningShader* createTriangleRendererTextureGouraud2(CBurningVideoDriver* driver); 163 IBurningShader* createTriangleRendererTextureLightMap2_M1(CBurningVideoDriver* driver); 164 IBurningShader* createTriangleRendererTextureLightMap2_M2(CBurningVideoDriver* driver); 165 IBurningShader* createTriangleRendererTextureLightMap2_M4(CBurningVideoDriver* driver); 166 IBurningShader* createTriangleRendererGTextureLightMap2_M4(CBurningVideoDriver* driver); 167 IBurningShader* createTriangleRendererTextureLightMap2_Add(CBurningVideoDriver* driver); 168 IBurningShader* createTriangleRendererTextureDetailMap2(CBurningVideoDriver* driver); 169 IBurningShader* createTriangleRendererTextureVertexAlpha2(CBurningVideoDriver* driver); 170 171 172 IBurningShader* createTriangleRendererTextureGouraudWire2(CBurningVideoDriver* driver); 173 IBurningShader* createTriangleRendererGouraud2(CBurningVideoDriver* driver); 174 IBurningShader* createTriangleRendererGouraudAlpha2(CBurningVideoDriver* driver); 175 IBurningShader* createTRGouraudAlphaNoZ2(CBurningVideoDriver* driver); 176 IBurningShader* createTriangleRendererGouraudWire2(CBurningVideoDriver* driver); 177 IBurningShader* createTriangleRendererTextureFlat2(CBurningVideoDriver* driver); 178 IBurningShader* createTriangleRendererTextureFlatWire2(CBurningVideoDriver* driver); 179 IBurningShader* createTRFlat2(CBurningVideoDriver* driver); 180 IBurningShader* createTRFlatWire2(CBurningVideoDriver* driver); 181 IBurningShader* createTRTextureGouraudNoZ2(CBurningVideoDriver* driver); 182 IBurningShader* createTRTextureGouraudAdd2(CBurningVideoDriver* driver); 183 IBurningShader* createTRTextureGouraudAddNoZ2(CBurningVideoDriver* driver); 184 185 IBurningShader* createTRTextureGouraudAlpha(CBurningVideoDriver* driver); 186 IBurningShader* createTRTextureGouraudAlphaNoZ(CBurningVideoDriver* driver); 187 IBurningShader* createTRTextureBlend(CBurningVideoDriver* driver); 188 IBurningShader* createTRTextureInverseAlphaBlend(CBurningVideoDriver* driver); 189 190 IBurningShader* createTRNormalMap(CBurningVideoDriver* driver); 191 IBurningShader* createTRStencilShadow(CBurningVideoDriver* driver); 192 193 IBurningShader* createTriangleRendererReference(CBurningVideoDriver* driver); 194 195 196 197 } // end namespace video 198 } // end namespace irr 199 200 #endif 201 202