00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VRS_OPENGL_ENGINEGL_H
00021 #define VRS_OPENGL_ENGINEGL_H
00022
00023 #include <vrs/opengl/openglconfig.h>
00024 #include <vrs/engine.h>
00025 #include <vrs/callback.h>
00026 #include <vector>
00027 #include <vrs/opengl/gl2/shadertextureunitselector.h>
00028
00029 namespace VRS {
00030
00031 class GLCanvas;
00032 class Light;
00033 class PBufferManagerGL;
00034 class SharedContextGL;
00035 class TextureUnitSelectorPainterGL;
00036 template<typename T> class HashTable;
00037 template<typename T> class IDHashTable;
00038 template<typename T> class Array;
00039
00040 namespace GL2
00041 {
00042 class ShaderTextureUnitSelectorPainter;
00043 }
00044
00045 class VRS_CORE_API EngineGL : public Engine {
00046 public:
00047 EngineGL();
00056 virtual ~EngineGL();
00057
00058 virtual void initialize();
00063 virtual void pushMonoAttribute(const ID& category, MonoAttribute* attr);
00064 virtual void popMonoAttribute(const ID& category);
00065 virtual MonoAttribute* getMonoAttribute(const ID& category) const;
00066
00067 virtual void pushTf(Engine::TFType category = Engine::modelviewMatrix);
00068 virtual void popTf(Engine::TFType category = Engine::modelviewMatrix);
00069 virtual void multTf(const Matrix& matrix, Engine::TFType category = Engine::modelviewMatrix);
00070 virtual void loadTf(const Matrix& matrix, Engine::TFType category = Engine::modelviewMatrix);
00071 virtual Matrix currentTf(Engine::TFType category = Engine::modelviewMatrix) const;
00072
00073
00074 friend class GLCanvas;
00075 virtual Matrix currentNormalizedDeviceCoordsTf() const;
00077 virtual Matrix currentPureProjectionTf() const;
00078 virtual Matrix currentPureProjectionTfInv() const;
00080
00081 PBufferManagerGL* pbufferManager() const;
00091 SharedContextGL* sharedContext() const;
00092 void setSharedContext(SharedContextGL* sctx);
00101 GLuint getDisplayList(SharedObj* obj);
00102 GLuint newDisplayList(SharedObj* obj);
00107 GLuint getTextureObject(SharedObj* obj, GLenum target);
00108 GLuint newTextureObject(SharedObj* obj, GLenum target);
00113 unsigned int maxTextureUnits() const;
00117 unsigned int maxVertexTextureUnits() const;
00121 unsigned int maxFragmentTextureUnits() const;
00125 unsigned int maxCombinedTextureUnits() const;
00129 void cleanUp();
00136 static bool registerHandler(Handler* handler);
00137
00138 enum { GLVersion = 1, GLUVersion = 2, Buffers = 4, BufferBits = 8,
00139 StackDepths = 16, PointLineInfo = 32, MiscInfo = 64, All = 127 };
00140 std::string glInfo(int info) const;
00141
00142 int majorVersion() const;
00143 int minorVersion() const;
00144 int version() const;
00145 bool isVersion(int major, int minor) const;
00149 bool hasExtension(const ID& extensionID) const;
00151 bool disableExtension(const ID& extensionID);
00153 SO<const HashTable<ID> > enabledExtensions() const;
00155 SO<const HashTable<ID> > disabledExtensions() const;
00157
00158 void allowSoftwareEmulation(bool onOff);
00160 bool isSoftwareEmulationAllowed() const;
00162
00163 static std::string ErrorString(GLenum glErrorCode);
00165
00166 virtual GLenum lightNumber(Light*) const;
00172 void registerCleanUpCallback(SO<Callback1<SO<EngineGL> > > callback);
00173 void unregisterCleanUpCallback(SO<Callback1<SO<EngineGL> > > callback);
00178 VRS_TYPEINFO(EngineGL, Engine);
00179
00180 private:
00181 bool initialized_;
00182 bool allowSWEmu_;
00183 int major_;
00184 int minor_;
00185 SO<HashTable<ID> > extensions_;
00186 SO<HashTable<ID> > disabledExtensions_;
00187 SO<SharedContextGL> sharedCtx_;
00188
00189 #ifndef NDEBUG
00190 public:
00191
00192 virtual void push(Attribute* attr);
00193 virtual void push(MonoAttribute* attr);
00194 virtual void push(PolyAttribute* attr);
00195 virtual void push(Handler* hdl);
00196
00197 virtual void pop(Attribute* attr);
00198 virtual void pop(MonoAttribute* attr);
00199 virtual void pop(PolyAttribute* attr);
00200 virtual void pop(Handler* hdl);
00201 virtual void pop(const ID& rid);
00202
00203 virtual void eval(const Shape* shape);
00204 #endif // NDEBUG
00205
00206 private:
00207
00208 friend class TextureUnitSelectorPainterGL;
00209 friend class GL2::ShaderTextureUnitSelectorPainter;
00210 std::vector<SO<IDHashTable<Stack<SO<MonoAttribute> > > > > monoAttributesPerTextureUnit_;
00211 unsigned int maxTextureUnits_;
00212 unsigned int maxVertexTextureUnits_;
00213 unsigned int maxFragmentTextureUnits_;
00214 unsigned int maxCombinedTextureUnits_;
00215
00216 unsigned int activeTextureUnit_;
00217 SO<Array<SO<Callback1<SO<EngineGL> > > > > cleanUpCallbacks_;
00218 Matrix ndcTf_;
00219 mutable Matrix cleanProjectionTf_;
00220 mutable Matrix invCleanProjectionTf_;
00221
00222 void setNDCTf(const Matrix &ndc);
00223
00224 };
00225
00226 }
00227
00228 #endif // VRS_OPENGL_ENGINEGL_H