Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

OgreGLRenderSystem.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004     (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://ogre.sourceforge.net/
00006 
00007 Copyright © 2000-2002 The OGRE Team
00008 Also see acknowledgements in Readme.html
00009 
00010 This program is free software; you can redistribute it and/or modify it under
00011 the terms of the GNU Lesser General Public License as published by the Free Software
00012 Foundation; either version 2 of the License, or (at your option) any later
00013 version.
00014 
00015 This program is distributed in the hope that it will be useful, but WITHOUT
00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00018 
00019 You should have received a copy of the GNU Lesser General Public License along with
00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00022 http://www.gnu.org/copyleft/lesser.txt.
00023 -----------------------------------------------------------------------------
00024 */
00025 #ifndef __GLRenderSystem_H__
00026 #define __GLRenderSystem_H__
00027 
00028 #include "OgreGLPrerequisites.h"
00029 #include "OgrePlatform.h"
00030 #include "OgreRenderSystem.h"
00031 #include "OgreGLHardwareBufferManager.h"
00032 #include "OgreGLGpuProgramManager.h"
00033 #include "OgreVector4.h"
00034 
00035 
00036 namespace Ogre {
00040     class GLRenderSystem : public RenderSystem
00041     {
00042     public:
00043         virtual void setExternalWindowHandle(void *ptr){mExternalWindowHandle = ptr;};
00044         virtual void resizeRepositionWindow(void*);
00045 
00046     private:
00047         void* mExternalWindowHandle;
00048 
00049         // Rendering loop control
00050         bool mStopRendering;
00051 
00052         // Array of up to 8 lights, indexed as per API
00053         // Note that a null value indicates a free slot
00054         #define MAX_LIGHTS 8
00055         Light* mLights[MAX_LIGHTS];
00056 
00057         // clip planes
00058         typedef std::vector<Vector4> PlaneList2;
00059         PlaneList2 mClipPlanes;
00060         void setGLClipPlanes() const;
00061 
00062 
00063         // view matrix to set world against
00064         Matrix4 mViewMatrix;
00065         Matrix4 mWorldMatrix;
00066         Matrix4 mTextureMatrix;
00067 
00068         // Last min & mip filtering options, so we can combine them
00069         FilterOptions mMinFilter;
00070         FilterOptions mMipFilter;
00071 
00072         // XXX 8 max texture units?
00073         size_t mTextureCoordIndex[OGRE_MAX_TEXTURE_COORD_SETS];
00074 
00076         GLenum mTextureTypes[OGRE_MAX_TEXTURE_LAYERS];
00077 
00078         void initConfigOptions(void);
00079         void initInputDevices(void);
00080         void processInputDevices(void);
00081 
00082         void setGLLight(size_t index, Light* lt);
00083         void makeGLMatrix(GLfloat gl_matrix[16], const Matrix4& m);
00084  
00085         GLint getBlendMode(SceneBlendFactor ogreBlend) const;
00086 
00087         void setLights();
00088 
00089         // Store last depth write state
00090         bool mDepthWrite;
00091         // Store last colour write state
00092         bool mColourWrite[4];
00093 
00094         GLint convertCompareFunction(CompareFunction func) const;
00095         GLint convertStencilOp(StencilOperation op, bool invert = false) const;
00096 
00097         // internal method for anisotrophy validation
00098         GLfloat _getCurrentAnisotropy(size_t unit);
00099         
00101         GLSupport* mGLSupport;
00102         
00104         void setGLLightPositionDirection(Light* lt, size_t lightindex);
00105 
00106         bool mUseAutoTextureMatrix;
00107         GLfloat mAutoTextureMatrix[16];
00108 
00109         // check if the GL system has already been initialized
00110         bool mGLInitialized;
00111         // Initialise GL context
00112         void initGL(void);
00113 
00114         HardwareBufferManager* mHardwareBufferManager;
00115         GLGpuProgramManager* mGpuProgramManager;
00116 
00117         unsigned short mCurrentLights;
00118 
00119         GLuint getCombinedMinMipFilter(void) const;
00120 
00121         GLGpuProgram* mCurrentVertexProgram;
00122         GLGpuProgram* mCurrentFragmentProgram;
00123 
00124     public:
00125         // Default constructor / destructor
00126         GLRenderSystem();
00127         ~GLRenderSystem();
00128 
00129         // ----------------------------------
00130         // Overridden RenderSystem functions
00131         // ----------------------------------
00135         const String& getName(void) const;
00139         ConfigOptionMap& getConfigOptions(void);
00143         void setConfigOption(const String &name, const String &value);
00147         String validateConfigOptions(void);
00151         RenderWindow* initialise(bool autoCreateWindow, const String& windowTitle = "OGRE Render Window");
00155         void reinitialise(void); // Used if settings changed mid-rendering
00159         void shutdown(void);
00160 
00164         void setAmbientLight(float r, float g, float b);
00168         void setShadingType(ShadeOptions so);
00172         void setLightingEnabled(bool enabled);
00176         RenderWindow* createRenderWindow(const String &name, unsigned int width, unsigned int height, unsigned int colourDepth,
00177             bool fullScreen, int left = 0, int top = 0, bool depthBuffer = true,
00178             RenderWindow* parentWindowHandle = 0);
00179 
00180         RenderTexture * createRenderTexture( const String & name, unsigned int width, unsigned int height );
00181 
00185         void destroyRenderWindow(RenderWindow* pWin);
00189         String getErrorDescription(long errorNumber) const;
00190 
00194         void convertColourValue(const ColourValue& colour, unsigned long* pDest);
00198         void setNormaliseNormals(bool normalise);
00199 
00200         // -----------------------------
00201         // Low-level overridden members
00202         // -----------------------------
00206         void _useLights(const LightList& lights, unsigned short limit);
00210         void _setWorldMatrix(const Matrix4 &m);
00214         void _setViewMatrix(const Matrix4 &m);
00218         void _setProjectionMatrix(const Matrix4 &m);
00222         void _setSurfaceParams(const ColourValue &ambient,
00223             const ColourValue &diffuse, const ColourValue &specular,
00224             const ColourValue &emissive, Real shininess);
00228         void _setTexture(size_t unit, bool enabled, const String &texname);
00232         void _setTextureCoordSet(size_t stage, size_t index);
00236         void _setTextureCoordCalculation(size_t stage, TexCoordCalcMethod m, 
00237             const Frustum* frustum = 0);
00241         void _setTextureBlendMode(size_t stage, const LayerBlendModeEx& bm);
00245         void _setTextureAddressingMode(size_t stage, TextureUnitState::TextureAddressingMode tam);
00249         void _setTextureMatrix(size_t stage, const Matrix4& xform);
00253         void _setSceneBlending(SceneBlendFactor sourceFactor, SceneBlendFactor destFactor);
00257         void _setAlphaRejectSettings(CompareFunction func, unsigned char value);
00261         void _setViewport(Viewport *vp);
00265         void _beginFrame(void);
00269         void _endFrame(void);
00273         void _setCullingMode(CullingMode mode);
00277         void _setDepthBufferParams(bool depthTest = true, bool depthWrite = true, CompareFunction depthFunction = CMPF_LESS_EQUAL);
00281         void _setDepthBufferCheckEnabled(bool enabled = true);
00285         void _setDepthBufferWriteEnabled(bool enabled = true);
00289         void _setDepthBufferFunction(CompareFunction func = CMPF_LESS_EQUAL);
00293         void _setDepthBias(ushort bias);
00297         void _setColourBufferWriteEnabled(bool red, bool green, bool blue, bool alpha);
00301         void _setFog(FogMode mode, const ColourValue& colour, Real density, Real start, Real end);
00305         void _makeProjectionMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, 
00306             Matrix4& dest, bool forGpuProgram = false);
00310         void _makeProjectionMatrix(Real left, Real right, Real bottom, Real top, 
00311             Real nearPlane, Real farPlane, Matrix4& dest, bool forGpuProgram = false);
00315         void _makeOrthoMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, 
00316             Matrix4& dest, bool forGpuProgram = false);
00320         void _applyObliqueDepthProjection(Matrix4& matrix, const Plane& plane, 
00321             bool forGpuProgram);
00325         void setClipPlane (ushort index, Real A, Real B, Real C, Real D);
00329         void enableClipPlane (ushort index, bool enable);
00333         void _setRasterisationMode(SceneDetailLevel level);
00337         void setStencilCheckEnabled(bool enabled);
00340         void setStencilBufferParams(CompareFunction func = CMPF_ALWAYS_PASS, 
00341             ulong refValue = 0, ulong mask = 0xFFFFFFFF, 
00342             StencilOperation stencilFailOp = SOP_KEEP, 
00343             StencilOperation depthFailOp = SOP_KEEP,
00344             StencilOperation passOp = SOP_KEEP, 
00345             bool twoSidedOperation = false);
00349         void _setTextureUnitFiltering(size_t unit, FilterType ftype, FilterOptions filter);
00353         void _setTextureLayerAnisotropy(size_t unit, unsigned int maxAnisotropy);
00357         void setVertexDeclaration(VertexDeclaration* decl);
00361         void setVertexBufferBinding(VertexBufferBinding* binding);
00365         void _render(const RenderOperation& op);
00369         void bindGpuProgram(GpuProgram* prg);
00373         void unbindGpuProgram(GpuProgramType gptype);
00377         void bindGpuProgramParameters(GpuProgramType gptype, GpuProgramParametersSharedPtr params);
00381         void setClipPlanes(const PlaneList& clipPlanes);
00385         void setScissorTest(bool enabled, size_t left = 0, size_t top = 0, size_t right = 800, size_t bottom = 600) ;
00386         void clearFrameBuffer(unsigned int buffers, 
00387             const ColourValue& colour = ColourValue::Black, 
00388             Real depth = 1.0f, unsigned short stencil = 0);
00389         HardwareOcclusionQuery* createHardwareOcclusionQuery(void);
00390         Real getHorizontalTexelOffset(void);
00391         Real getVerticalTexelOffset(void);
00392         Real getMinimumDepthInputValue(void);
00393         Real getMaximumDepthInputValue(void);
00394 
00395         // ----------------------------------
00396         // End Overridden members
00397         // ----------------------------------
00398     };
00399 }
00400 #endif
00401 

Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:26 2004