00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _OPENGL_DRIVER_H_
00021 #define _OPENGL_DRIVER_H_
00022
00023 #include <boost\utility.hpp>
00024
00025 #include <windows.h>
00026
00027 #include "OpenglContext.h"
00028 #include "OpenglVertexBuffer.h"
00029 #include "OpenglIndexBuffer.h"
00030 #include "OpenglProgram.h"
00031 #include "OpenglTexture.h"
00032
00033 #include <vector>
00034 #include <map>
00035
00038
00039 namespace TestFrameWork
00040 {
00041
00042 enum OpenglPrimitive
00043 {
00044 Triangles
00045 };
00046
00047 enum OpenglVersion
00048 {
00049 OpenglVersion_2_0,
00050 OpenglVersion_2_1,
00051 OpenglVersion_3_0,
00052 OpenglVersion_3_1,
00053 OpenglVersion_3_2,
00054 };
00055
00056 class OpenglDriver :
00057 boost::noncopyable
00058 {
00059 public:
00060 OpenglDriver(OpenglVersion version, HDC canvasContext, size_t width, size_t height, int depth, int samples);
00061
00062 ~OpenglDriver(void);
00063
00064 void BeginFrame(void);
00065
00066 void EndFrame(void);
00067
00068 size_t CreateVertexBuffer(Vertices vertices, size_t verticesCount);
00069
00070 size_t CreateIndexBuffer(Indices32 indices, size_t indicesCount);
00071
00072 OpenglProgramWeakPtr CreateProgram(const std::vector<ShaderFileDesc>& shaders);
00073
00074 OpenglTextureWeakPtr CreateTexture(TextureData data, OpenglTextureFormat format,
00075 size_t width, OpenglTextureFilter filter,
00076 OpenglTextureEdgeValue edge);
00077
00078 OpenglTextureWeakPtr CreateTexture(TextureData data, OpenglTextureFormat format,
00079 size_t width, size_t height, OpenglTextureFilter filter,
00080 OpenglTextureEdgeValue edge);
00081
00082 OpenglTextureWeakPtr CreateTexture(TextureData data, OpenglTextureFormat format,
00083 size_t width, size_t height, size_t depth,
00084 OpenglTextureFilter filter, OpenglTextureEdgeValue edge);
00085
00086 void SetProgram(OpenglProgramWeakPtr program);
00087
00088 void SetTexture(OpenglTextureWeakPtr texture, int textureUnit);
00089
00090 void DrawIndexedPrimitive(OpenglPrimitive primitive, size_t vertexBufferId, size_t indexBufferId,
00091 size_t primitivesCount = 1);
00092
00093 void GetMaximumTextureSize(OpenglTextureFormat format, size_t& width, size_t& height);
00094
00095 void Draw2DString(const std::string& s, size_t x, size_t y, const Vector3& color);
00096
00097 private:
00098 OpenglVersion m_version;
00099
00100 HDC m_canvasContext;
00101 size_t m_width;
00102 size_t m_height;
00103
00104 OpenglContext m_openglContext;
00105
00106 std::vector<OpenglVertexBufferPtr> m_vertexBuffers;
00107
00108 std::vector<OpenglIndexBuffer32Ptr> m_indexBuffers;
00109
00110 std::vector<OpenglProgramPtr> m_programs;
00111
00112 std::vector<OpenglTexturePtr> m_textures;
00113
00114 OpenglProgramWeakPtr m_currentProgram;
00115
00116 std::map<OpenglTextureWeakPtr, int> m_textureUnits;
00117
00118 void InitializeGlew(void);
00119
00120 void InitializeGlut(void);
00121
00122 void CheckOpenglVersion(OpenglVersion version) const;
00123
00124 void CheckMinRequirements(OpenglVersion version) const;
00125
00126 GLenum Primitive2GlMode(OpenglPrimitive primitive) const;
00127
00128 void SetCurrentProgram(void) const;
00129
00130 void SetCurrentTextures(void) const;
00131
00132 void SetBuffers(OpenglVertexBufferPtr vertexBuffer, OpenglIndexBuffer32Ptr indexBuffer) const;
00133 };
00134
00135 typedef boost::shared_ptr<OpenglDriver> OpenglDriverPtr;
00136 }
00137
00138 #endif