]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/COpenGLSLMaterialRenderer.h
b6a4f821a2df4ece2869e263c44767b8f7bb3cd1
[irrlicht.git] / source / Irrlicht / COpenGLSLMaterialRenderer.h
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #ifndef __C_OPENGL_SHADER_LANGUAGE_MATERIAL_RENDERER_H_INCLUDED__\r
6 #define __C_OPENGL_SHADER_LANGUAGE_MATERIAL_RENDERER_H_INCLUDED__\r
7 \r
8 #include "IrrCompileConfig.h"\r
9 \r
10 #ifdef _IRR_COMPILE_WITH_OPENGL_\r
11 \r
12 #include "EMaterialTypes.h"\r
13 #include "IMaterialRenderer.h"\r
14 #include "IMaterialRendererServices.h"\r
15 #include "IGPUProgrammingServices.h"\r
16 #include "irrArray.h"\r
17 #include "irrString.h"\r
18 \r
19 #include "COpenGLCommon.h"\r
20 \r
21 namespace irr\r
22 {\r
23 namespace video\r
24 {\r
25 \r
26 class COpenGLDriver;\r
27 class IShaderConstantSetCallBack;\r
28 \r
29 //! Class for using GLSL shaders with OpenGL\r
30 //! Please note: This renderer implements its own IMaterialRendererServices\r
31 class COpenGLSLMaterialRenderer : public IMaterialRenderer, public IMaterialRendererServices\r
32 {\r
33 public:\r
34 \r
35         //! Constructor\r
36         COpenGLSLMaterialRenderer(\r
37                 COpenGLDriver* driver,\r
38                 s32& outMaterialTypeNr,\r
39                 const c8* vertexShaderProgram = 0,\r
40                 const c8* vertexShaderEntryPointName = 0,\r
41                 E_VERTEX_SHADER_TYPE vsCompileTarget = video::EVST_VS_1_1,\r
42                 const c8* pixelShaderProgram = 0,\r
43                 const c8* pixelShaderEntryPointName = 0,\r
44                 E_PIXEL_SHADER_TYPE psCompileTarget = video::EPST_PS_1_1,\r
45                 const c8* geometryShaderProgram = 0,\r
46                 const c8* geometryShaderEntryPointName = "main",\r
47                 E_GEOMETRY_SHADER_TYPE gsCompileTarget = EGST_GS_4_0,\r
48                 scene::E_PRIMITIVE_TYPE inType = scene::EPT_TRIANGLES,\r
49                 scene::E_PRIMITIVE_TYPE outType = scene::EPT_TRIANGLE_STRIP,\r
50                 u32 verticesOut = 0,\r
51                 IShaderConstantSetCallBack* callback = 0,\r
52                 E_MATERIAL_TYPE baseMaterial = EMT_SOLID,\r
53                 s32 userData = 0);\r
54 \r
55         //! Destructor\r
56         virtual ~COpenGLSLMaterialRenderer();\r
57 \r
58         virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,\r
59                 bool resetAllRenderstates, IMaterialRendererServices* services) override;\r
60 \r
61         bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) override;\r
62 \r
63         void OnUnsetMaterial() override;\r
64 \r
65         //! Returns if the material is transparent.\r
66         bool isTransparent() const override;\r
67 \r
68         //! Access the callback provided by the users when creating shader materials\r
69         IShaderConstantSetCallBack* getShaderConstantSetCallBack() const override\r
70         { \r
71                 return CallBack;\r
72         }\r
73 \r
74         // implementations for the render services\r
75         void setBasicRenderStates(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates) override;\r
76         s32 getVertexShaderConstantID(const c8* name) override;\r
77         s32 getPixelShaderConstantID(const c8* name) override;\r
78         void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) override;\r
79         void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) override;\r
80         bool setVertexShaderConstant(s32 index, const f32* floats, int count) override;\r
81         bool setVertexShaderConstant(s32 index, const s32* ints, int count) override;\r
82         bool setVertexShaderConstant(s32 index, const u32* ints, int count) override;\r
83         bool setPixelShaderConstant(s32 index, const f32* floats, int count) override;\r
84         bool setPixelShaderConstant(s32 index, const s32* ints, int count) override;\r
85         bool setPixelShaderConstant(s32 index, const u32* ints, int count) override;\r
86         IVideoDriver* getVideoDriver() override;\r
87 \r
88 protected:\r
89 \r
90         //! constructor only for use by derived classes who want to\r
91         //! create a fall back material for example.\r
92         COpenGLSLMaterialRenderer(COpenGLDriver* driver,\r
93                                         IShaderConstantSetCallBack* callback,\r
94                                         E_MATERIAL_TYPE baseMaterial,\r
95                                         s32 userData=0);\r
96 \r
97         void init(s32& outMaterialTypeNr,\r
98                 const c8* vertexShaderProgram,\r
99                 const c8* pixelShaderProgram,\r
100                 const c8* geometryShaderProgram,\r
101                 scene::E_PRIMITIVE_TYPE inType=scene::EPT_TRIANGLES,\r
102                 scene::E_PRIMITIVE_TYPE outType=scene::EPT_TRIANGLE_STRIP,\r
103                 u32 verticesOut=0);\r
104 \r
105         bool createProgram();\r
106         bool createShader(GLenum shaderType, const char* shader);\r
107         bool linkProgram();\r
108 \r
109         COpenGLDriver* Driver;\r
110         IShaderConstantSetCallBack* CallBack;\r
111 \r
112         bool Alpha;\r
113         bool Blending;\r
114         bool FixedBlending;\r
115         bool AlphaTest;\r
116 \r
117         struct SUniformInfo\r
118         {\r
119                 core::stringc name;\r
120                 GLenum type;\r
121                 GLint location;\r
122         };\r
123 \r
124         GLhandleARB Program;\r
125         GLuint Program2;\r
126         core::array<SUniformInfo> UniformInfo;\r
127         s32 UserData;\r
128 };\r
129 \r
130 \r
131 } // end namespace video\r
132 } // end namespace irr\r
133 \r
134 #endif // compile with OpenGL\r
135 #endif // if included\r
136 \r