00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __RENDERGLMODULE_H__
00013 #define __RENDERGLMODULE_H__
00014
00015 #include <wx/dcclient.h>
00016 #include <deque>
00017 #include "rendermodule.h"
00018 #include "common.h"
00019 #include "geometrynode.h"
00020 #include "geometrytriangles.h"
00021 #include "glgetproc.h"
00022 #include "glwindow.h"
00023
00024 namespace VRUT
00025 {
00027 class RenderGlModule : public RenderModule
00028 {
00029 protected:
00030 WX_DECLARE_STRING_HASH_MAP(GLuint, TextureIDMap);
00031 typedef std::vector<GLuint> GLIDList;
00032
00034 struct ShaderParamID
00035 {
00036 GLuint paramLocation;
00037 GLuint textureID;
00038 ShaderParamID(GLuint pLoc = GL_ID_NONE, GLuint tex = GL_ID_NONE)
00039 {
00040 paramLocation = pLoc;
00041 textureID = tex;
00042 }
00043 };
00045 struct ShaderHandler
00046 {
00047 GLhandleARB program;
00048 GLhandleARB fragmentShader;
00049 GLhandleARB vertexShader;
00050 std::vector<ShaderParamID> paramList;
00051 ShaderHandler() : program(GL_ID_NONE), fragmentShader(GL_ID_NONE), vertexShader(GL_ID_NONE) {}
00052 };
00053 WX_DECLARE_STRING_HASH_MAP(ShaderHandler, ShaderIDMap);
00055 struct VBOID
00056 {
00057 GLuint verticesID;
00058 GLuint indicesID;
00059 GLuint normalsID;
00060 GLuint texCoordsID;
00061 VBOID() : verticesID(GL_ID_NONE), indicesID(GL_ID_NONE), normalsID(GL_ID_NONE), texCoordsID(GL_ID_NONE) {}
00062 };
00063 WX_DECLARE_STRING_HASH_MAP(VBOID, VBOIDMap);
00064 typedef std::vector<VBOID> VBOIDList;
00065
00066
00068 GLIDList dispListIDs;
00070 VBOIDMap vboIDMap;
00072 VBOIDList VBOIDs;
00074 TextureIDMap textureIDMap;
00076 GLIDList textureIDs;
00078 ShaderIDMap shaderIDMap;
00080 bool useVBO;
00082 Parameter::ParameterIdentificator useVBOParamID;
00084 bool vboSupported;
00086 bool shaderSupported;
00088 bool wireframe;
00090 Parameter::ParameterIdentificator wireframeParamID;
00092 bool lighting;
00094 Parameter::ParameterIdentificator lightingParamID;
00096 bool headlight;
00098 Parameter::ParameterIdentificator headlightParamID;
00100 bool initialized;
00102 bool sceneInitialized;
00104 std::vector<bool> resetNodes;
00106 bool reset;
00108 wxMutex paramsMutex;
00110 bool drawBVH;
00112 Parameter::ParameterIdentificator drawBVHParamID;
00114 size_t texturesUsedLast;
00116 bool sceneImportMode;
00119 bool allowRedundantDeletes;
00121 Parameter::ParameterIdentificator allowRedundantDeletesParamID;
00123 bool vboRenderUpdated;
00125 Scene * scene;
00127 PFNGLGENBUFFERSARBPROC glGenBuffersARB;
00128 PFNGLBINDBUFFERARBPROC glBindBufferARB;
00129 PFNGLBUFFERDATAARBPROC glBufferDataARB;
00130 PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
00132 PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
00133 PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
00134 PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
00135 PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
00136 PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
00137 PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
00138 PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
00139 PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
00140 PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
00141 PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
00142 PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
00143 PFNGLUNIFORM1FVARBPROC glUniform1fvARB;
00144 PFNGLUNIFORM2FVARBPROC glUniform2fvARB;
00145 PFNGLUNIFORM3FVARBPROC glUniform3fvARB;
00146 PFNGLUNIFORM4FVARBPROC glUniform4fvARB;
00147 PFNGLUNIFORM1IVARBPROC glUniform1ivARB;
00148 PFNGLUNIFORM2IVARBPROC glUniform2ivARB;
00149 PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
00150 PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
00151 PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB;
00152 PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
00153 PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
00154 PFNGLACTIVETEXTUREPROC glActiveTexture;
00155 PFNGLUNIFORM1IARBPROC glUniform1iARB;
00156
00158 void clearCachedGeometry();
00160 void checkExtSupport();
00162 void drawShader(const GeometryNode * node);
00164 void drawLights() const;
00166 void drawMaterial(const GeometryNode * node);
00168 void buildTexture(const GeometryNode * node);
00170 void drawVBO(const GeometryNode * node);
00172 void drawDispList(const GeometryNode * node);
00174 void ResetNodes();
00176 void drawBVHHierarchy() const;
00178 virtual void processEvent(wxCommandEvent & evt);
00180
00181 public:
00183 RenderGlModule(MODULE_ID _id, const wxString & _name, EventHandler * msgSink);
00185 virtual ~RenderGlModule();
00186
00188 virtual wxString GetDesc() const;
00190 virtual void Draw();
00193 virtual void Deinitialize();
00195 virtual bool Initialize();
00197 static bool IsExtensionSupported(const char * szTargetExtension);
00199 inline static int GetOglPrimitiveType(GeometryTriangles::PRIMITIVE_TYPE primType);
00200 };
00201 };
00202
00203
00204 #endif