00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef OVR_Render_GL_Device_h
00025 #define OVR_Render_GL_Device_h
00026
00027 #include "../Render/Render_Device.h"
00028
00029 #if defined(OVR_OS_WIN32)
00030 #include <Windows.h>
00031 #endif
00032
00033 #if defined(OVR_OS_MAC)
00034 #include <OpenGL/gl.h>
00035 #include <OpenGL/glext.h>
00036 #else
00037 #define GL_GLEXT_PROTOTYPES
00038 #include <GL/gl.h>
00039 #include <GL/glext.h>
00040 #endif
00041
00042 namespace OVR { namespace Render { namespace GL {
00043
00044 class RenderDevice;
00045
00046 class Buffer : public Render::Buffer
00047 {
00048 public:
00049 RenderDevice* Ren;
00050 size_t Size;
00051 GLenum Use;
00052 GLuint GLBuffer;
00053
00054 public:
00055 Buffer(RenderDevice* r) : Ren(r), Size(0), Use(0), GLBuffer(0) {}
00056 ~Buffer();
00057
00058 GLuint GetBuffer() { return GLBuffer; }
00059
00060 virtual size_t GetSize() { return Size; }
00061 virtual void* Map(size_t start, size_t size, int flags = 0);
00062 virtual bool Unmap(void *m);
00063 virtual bool Data(int use, const void* buffer, size_t size);
00064 };
00065
00066 class Texture : public Render::Texture
00067 {
00068 public:
00069 RenderDevice* Ren;
00070 GLuint TexId;
00071 int Width, Height;
00072
00073 Texture(RenderDevice* r, int w, int h);
00074 ~Texture();
00075
00076 virtual int GetWidth() const { return Width; }
00077 virtual int GetHeight() const { return Height; }
00078
00079 virtual void SetSampleMode(int);
00080
00081 virtual void Set(int slot, ShaderStage stage = Shader_Fragment) const;
00082 };
00083
00084 class Shader : public Render::Shader
00085 {
00086 public:
00087 GLuint GLShader;
00088
00089 Shader(RenderDevice*, ShaderStage st, GLuint s) : Render::Shader(st), GLShader(s) {}
00090 Shader(RenderDevice*, ShaderStage st, const char* src) : Render::Shader(st), GLShader(0)
00091 {
00092 Compile(src);
00093 }
00094 ~Shader()
00095 {
00096 if (GLShader)
00097 glDeleteShader(GLShader);
00098 }
00099 bool Compile(const char* src);
00100
00101 GLenum GLStage() const
00102 {
00103 switch (Stage)
00104 {
00105 default: OVR_ASSERT(0); return GL_NONE;
00106 case Shader_Vertex: return GL_VERTEX_SHADER;
00107 case Shader_Fragment: return GL_FRAGMENT_SHADER;
00108 }
00109 }
00110
00111
00112
00113 };
00114
00115 class ShaderSet : public Render::ShaderSet
00116 {
00117 public:
00118 GLuint Prog;
00119
00120 struct Uniform
00121 {
00122 String Name;
00123 int Location, Size;
00124 int Type;
00125 };
00126 Array<Uniform> UniformInfo;
00127
00128 int ProjLoc, ViewLoc;
00129 int TexLoc[8];
00130 bool UsesLighting;
00131 int LightingVer;
00132
00133 ShaderSet();
00134 ~ShaderSet();
00135
00136 virtual void SetShader(Render::Shader *s)
00137 {
00138 Shaders[s->GetStage()] = s;
00139 Shader* gls = (Shader*)s;
00140 glAttachShader(Prog, gls->GLShader);
00141 if (Shaders[Shader_Vertex] && Shaders[Shader_Fragment])
00142 Link();
00143 }
00144 virtual void UnsetShader(int stage)
00145 {
00146 Shader* gls = (Shader*)(Render::Shader*)Shaders[stage];
00147 if (gls)
00148 glDetachShader(Prog, gls->GLShader);
00149 Shaders[stage] = NULL;
00150 Link();
00151 }
00152
00153 virtual void Set(PrimitiveType prim) const;
00154
00155
00156
00157
00158 virtual bool SetUniform(const char* name, int n, const float* v);
00159 virtual bool SetUniform4x4f(const char* name, const Matrix4f& m);
00160
00161 bool Link();
00162 };
00163
00164 class RBuffer : public RefCountBase<RBuffer>
00165 {
00166 public:
00167 int Width, Height;
00168 GLuint BufId;
00169
00170 RBuffer(GLenum format, GLint w, GLint h);
00171 ~RBuffer();
00172 };
00173
00174 class RenderDevice : public Render::RenderDevice
00175 {
00176 Ptr<Shader> VertexShaders[VShader_Count];
00177 Ptr<Shader> FragShaders[FShader_Count];
00178
00179 Ptr<ShaderFill> DefaultFill;
00180
00181 Matrix4f Proj;
00182
00183 Ptr<Texture> CurRenderTarget;
00184 Array<Ptr<RBuffer> > DepthBuffers;
00185 GLuint CurrentFbo;
00186
00187 const LightingParams* Lighting;
00188
00189 public:
00190 RenderDevice(const RendererParams& p);
00191
00192 virtual void SetRealViewport(const Viewport& vp);
00193
00194
00195
00196 virtual void Clear(float r = 0, float g = 0, float b = 0, float a = 1, float depth = 1);
00197 virtual void Rect(float left, float top, float right, float bottom) { OVR_UNUSED4(left,top,right,bottom); }
00198
00199 virtual void BeginRendering();
00200 virtual void SetDepthMode(bool enable, bool write, CompareFunc func = Compare_Less);
00201 virtual void SetWorldUniforms(const Matrix4f& proj);
00202
00203 RBuffer* GetDepthBuffer(int w, int h, int ms);
00204
00205 virtual void SetRenderTarget(Render::Texture* color,
00206 Render::Texture* depth = NULL, Render::Texture* stencil = NULL);
00207
00208 virtual void SetLighting(const LightingParams* lt);
00209
00210 virtual void Render(const Matrix4f& matrix, Model* model);
00211 virtual void Render(const Fill* fill, Render::Buffer* vertices, Render::Buffer* indices,
00212 const Matrix4f& matrix, int offset, int count, PrimitiveType prim = Prim_Triangles);
00213 virtual void RenderWithAlpha(const Fill* fill, Render::Buffer* vertices, Render::Buffer* indices,
00214 const Matrix4f& matrix, int offset, int count, PrimitiveType prim = Prim_Triangles);
00215
00216 virtual Buffer* CreateBuffer();
00217 virtual Texture* CreateTexture(int format, int width, int height, const void* data, int mipcount=1);
00218 virtual ShaderSet* CreateShaderSet() { return new ShaderSet; }
00219
00220 virtual Fill *CreateSimpleFill(int flags = Fill::F_Solid);
00221
00222 virtual Shader *LoadBuiltinShader(ShaderStage stage, int shader);
00223
00224 void SetTexture(Render::ShaderStage, int slot, const Texture* t);
00225
00226 virtual bool SetFullscreen(DisplayMode fullscreen);
00227 };
00228
00229 }}}
00230
00231 #endif