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 __C_OPENGL_SHADER_LANGUAGE_MATERIAL_RENDERER_H_INCLUDED__ 6 #define __C_OPENGL_SHADER_LANGUAGE_MATERIAL_RENDERER_H_INCLUDED__ 7 8 #include "IrrCompileConfig.h" 9 #ifdef _IRR_COMPILE_WITH_OPENGL_ 10 11 #ifdef _IRR_WINDOWS_API_ 12 #define WIN32_LEAN_AND_MEAN 13 #include <windows.h> 14 #include <GL/gl.h> 15 #include "glext.h" 16 #else 17 #if defined(_IRR_OPENGL_USE_EXTPOINTER_) 18 #define GL_GLEXT_LEGACY 1 19 #else 20 #define GL_GLEXT_PROTOTYPES 1 21 #endif 22 #if defined(_IRR_OSX_PLATFORM_) 23 #include <OpenGL/gl.h> 24 #else 25 #include <GL/gl.h> 26 #endif 27 #if defined(_IRR_OPENGL_USE_EXTPOINTER_) 28 #include "glext.h" 29 #endif 30 #endif 31 32 33 #include "IMaterialRenderer.h" 34 #include "IMaterialRendererServices.h" 35 #include "IGPUProgrammingServices.h" 36 #include "irrArray.h" 37 #include "irrString.h" 38 39 namespace irr 40 { 41 namespace video 42 { 43 44 class COpenGLDriver; 45 class IShaderConstantSetCallBack; 46 47 //! Class for using GLSL shaders with OpenGL 48 //! Please note: This renderer implements its own IMaterialRendererServices 49 class COpenGLSLMaterialRenderer : public IMaterialRenderer, public IMaterialRendererServices 50 { 51 public: 52 53 //! Constructor 54 COpenGLSLMaterialRenderer( 55 COpenGLDriver* driver, 56 s32& outMaterialTypeNr, 57 const c8* vertexShaderProgram = 0, 58 const c8* vertexShaderEntryPointName = 0, 59 E_VERTEX_SHADER_TYPE vsCompileTarget = video::EVST_VS_1_1, 60 const c8* pixelShaderProgram = 0, 61 const c8* pixelShaderEntryPointName = 0, 62 E_PIXEL_SHADER_TYPE psCompileTarget = video::EPST_PS_1_1, 63 const c8* geometryShaderProgram = 0, 64 const c8* geometryShaderEntryPointName = "main", 65 E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0, 66 scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES, 67 scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP, 68 u32 verticesOut = 0, 69 IShaderConstantSetCallBack* callback = 0, 70 IMaterialRenderer* baseMaterial = 0, 71 s32 userData = 0); 72 73 //! Destructor 74 virtual ~COpenGLSLMaterialRenderer(); 75 76 virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, 77 bool resetAllRenderstates, IMaterialRendererServices* services); 78 79 virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype); 80 81 virtual void OnUnsetMaterial(); 82 83 //! Returns if the material is transparent. 84 virtual bool isTransparent() const; 85 86 // implementations for the render services 87 virtual void setBasicRenderStates(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates); 88 virtual bool setVertexShaderConstant(const c8* name, const f32* floats, int count); 89 virtual bool setVertexShaderConstant(const c8* name, const bool* bools, int count); 90 virtual bool setVertexShaderConstant(const c8* name, const s32* ints, int count); 91 virtual void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1); 92 virtual bool setPixelShaderConstant(const c8* name, const f32* floats, int count); 93 virtual bool setPixelShaderConstant(const c8* name, const bool* bools, int count); 94 virtual bool setPixelShaderConstant(const c8* name, const s32* ints, int count); 95 virtual void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1); 96 virtual IVideoDriver* getVideoDriver(); 97 98 protected: 99 100 //! constructor only for use by derived classes who want to 101 //! create a fall back material for example. 102 COpenGLSLMaterialRenderer(COpenGLDriver* driver, 103 IShaderConstantSetCallBack* callback, 104 IMaterialRenderer* baseMaterial, 105 s32 userData=0); 106 107 void init(s32& outMaterialTypeNr, 108 const c8* vertexShaderProgram, 109 const c8* pixelShaderProgram, 110 const c8* geometryShaderProgram, 111 scene::E_PRIMITIVE_TYPE inType=scene::EPT_TRIANGLES, 112 scene::E_PRIMITIVE_TYPE outType=scene::EPT_TRIANGLE_STRIP, 113 u32 verticesOut=0); 114 115 bool createProgram(); 116 bool createShader(GLenum shaderType, const char* shader); 117 bool linkProgram(); 118 119 COpenGLDriver* Driver; 120 IShaderConstantSetCallBack* CallBack; 121 IMaterialRenderer* BaseMaterial; 122 123 struct SUniformInfo 124 { 125 core::stringc name; 126 GLenum type; 127 }; 128 129 GLhandleARB Program; 130 GLuint Program2; 131 core::array<SUniformInfo> UniformInfo; 132 s32 UserData; 133 }; 134 135 136 } // end namespace video 137 } // end namespace irr 138 139 #endif // compile with OpenGL 140 #endif // if included 141 142