#ifndef ASW_GRAPHICS_OGL_H #define ASW_GRAPHICS_OGL_H #include "ASW.h" #include "gl/gl.h" #include "gl/glu.h" #include "gl/glext.h" #include #ifdef WIN32 #pragma comment( lib, "glu32.lib" ) #pragma comment( lib, "opengl32.lib" ) #pragma comment( lib, "cgGL.lib" ) #endif #define ASW_FONT_FIRST_CHARACTER ' ' #define ASW_FONT_LAST_CHARACTER '~' #define ASW_FONT_AMOUNT (ASW_FONT_LAST_CHARACTER - ASW_FONT_FIRST_CHARACTER) #define OGL_CALL(func) do {func; GLenum result = glGetError(); if ( result != GL_NO_ERROR ) throw OpenGLS::Exception(__FILE__, __LINE__, __FUNCTION__, NULL, result);} while (0) #ifdef ASW_DEBUG #define OGL_RUN(func) OGL_CALL(func) #else #define OGL_RUN(func) func #endif /////////////////////////////////////////////////////////////////// // OpenGLS (no support for VBOs) /////////////////////////////////////////////////////////////////// class OpenGLS : public ASW::GraphicsApi { friend class ASW::GraphicsApi; protected: virtual void PrivateDestroy() {} public: struct Exception : public ASW::Exception { const GLenum m_enmError; Exception(const char * File, const unsigned int Line, const char * Function, const char * Detail, const GLenum Error); virtual void Print(UTIL::Output & p_clsOutput); virtual const char * Type(); }; enum Extension { EXT_STENCIL_TEST_TWO_SIDE = 0, EXT_AMOUNT = 1, }; OpenGLS(); static const char * ResultString(const GLenum Result); static const GLenum m_enmMatrixTypes[ASW::Type::MATRIX_COUNT]; static const GLenum m_enmDataTypes[12]; static const GLenum m_enmPrimitiveTypes[ASW::Type::PRIMITIVE_COUNT]; static const GLenum m_enmFlags[ASW::GraphicsApi::PROPERTY_COUNT]; static const GLenum m_enmStencilOps[ASW::GraphicsApi::STENCILOP_COUNT]; static const GLenum m_enmTests[ASW::GraphicsApi::TEST_COUNT]; virtual ~OpenGLS() {Destroy();} bool IsExtensionSupported(const char * Extension); virtual void Bind(const ASW::Material &); virtual void Bind(const ASW::Texture *, const unsigned int); virtual void Bind(const ASW::BufferIndex *); virtual void Bind(const ASW::BufferVertex *); virtual void Bind(const ASW::Shader *, const ASW::Type::Shader); virtual void Blend(const ASW::GraphicsApi::BlendType, const ASW::GraphicsApi::BlendType); virtual void BufferClear(const unsigned int); virtual void BufferEnable(const unsigned int, const bool); virtual void BufferInfo(const ASW::BufferVertex &) {} virtual bool CheckEnable(const ASW::GraphicsApi::PropertyType); virtual void ClearColor(const unsigned char, const unsigned char, const unsigned char, const unsigned char); virtual void ClearDepth(const float); virtual void CullMode(const ASW::GraphicsApi::CullType); virtual void Draw(const ASW::Type::Primitive, const ASW::BufferVertex::Index &); virtual void Draw(const ASW::Type::Primitive, const ASW::BufferIndex::Index &); virtual void DrawIndices(const ASW::Type::Primitive, const ASW::CompositeIndex **, const unsigned int); virtual void DrawVertices(const ASW::Type::Primitive, const ASW::CompositeIndex **, const unsigned int); virtual void DrawStart() {} virtual void Enable(const ASW::GraphicsApi::PropertyType, const bool Enable); virtual void EnableLight(const unsigned int, const bool); virtual void FillMode(const ASW::GraphicsApi::FillType); virtual ASW::Colorf GetAmbience(); virtual void GetDeviceInfo(std::string & Device, std::string & Api); virtual ASW::Point4i GetViewport(ASW::Point2f *); virtual bool Load(ASW::Texture &); virtual void Load(ASW::Buffer &) {} virtual void * Lock(ASW::Buffer &, const unsigned int, const unsigned int, const ASW::Type::HintAccess); virtual bool Load(ASW::Shader &, const char *, const char *); virtual UTIL::D3::Matrix MatrixBuild(const unsigned int, const unsigned int, const float, const float, const float); virtual void MatrixSet(const ASW::Type::Matrix, const UTIL::D3::Matrix &); virtual UTIL::D3::Matrix MatrixGet(const ASW::Type::Matrix); virtual void Print(const ASW::GraphicsApi::DrawTextInfo &); virtual void Resize(const unsigned int, const unsigned int); virtual void Set(ASW::Buffer &, const void *, const unsigned int, const unsigned int); virtual void SetAmbience(const ASW::Colorf &); virtual void SetDepthTest(const ASW::GraphicsApi::Test); virtual void SetLight(const unsigned int, const ASW::Instance::Light &); virtual void SetScissorRectangle(const int, const int, const unsigned int, const unsigned int); virtual void SetStencilWriteMask(const unsigned int, const bool); virtual void SetStencilOp(const ASW::GraphicsApi::StencilOp, const ASW::GraphicsApi::StencilOp, const ASW::GraphicsApi::StencilOp, const bool); virtual void SetStencilTest(const ASW::GraphicsApi::Test, const int, const unsigned int, const bool); virtual void SetStencilParams(const unsigned int, const ASW::GraphicsApi::Test, const ASW::GraphicsApi::StencilOp, const ASW::GraphicsApi::StencilOp, const ASW::GraphicsApi::StencilOp, const int, const unsigned int, const bool); virtual void SetViewport(const ASW::Point4i &, const ASW::Point2f &); virtual void Unload(ASW::Texture &); virtual void Unload(ASW::Buffer &, const bool); virtual void Unlock(ASW::Buffer &) {} }; /////////////////////////////////////////////////////////////////// // OpenGLX (support for VBOs) /////////////////////////////////////////////////////////////////// class OpenGLX : public OpenGLS { friend class ASW::GraphicsApi; public: static const GLenum m_enmVbWriteHint[ASW::Type::WRITE_COUNT]; static const GLenum m_enmVbAccessHint[ASW::Type::ACCESS_COUNT]; virtual void Bind(const ASW::BufferIndex *); virtual void Bind(const ASW::BufferVertex *); virtual void Load(ASW::Buffer &); virtual void * Lock(ASW::Buffer &, const unsigned int, const unsigned int, const ASW::Type::HintAccess); virtual void Set(ASW::Buffer &, const void *, const unsigned int, const unsigned int); virtual void Unload(ASW::Buffer &, const bool); virtual void Unlock(ASW::Buffer &); }; #endif