OgreRenderSystem.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://www.ogre3d.org
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 #ifndef __RenderSystem_H_
00029 #define __RenderSystem_H_
00030 
00031 // Precompiler options
00032 #include "OgrePrerequisites.h"
00033 
00034 #include "OgreString.h"
00035 
00036 #include "OgreTextureUnitState.h"
00037 #include "OgreCommon.h"
00038 
00039 #include "OgreMaterialManager.h"
00040 #include "OgreRenderOperation.h"
00041 #include "OgreRenderSystemCapabilities.h"
00042 #include "OgreRenderTarget.h"
00043 #include "OgreRenderTexture.h"
00044 #include "OgreFrameListener.h"
00045 #include "OgreConfigOptionMap.h"
00046 #include "OgreGpuProgram.h"
00047 #include "OgrePlane.h"
00048 #include "OgreIteratorWrappers.h"
00049 
00050 namespace Ogre
00051 {
00059     typedef vector<DepthBuffer*>::type DepthBufferVec;
00060     typedef map< uint16, DepthBufferVec >::type DepthBufferMap;
00061     typedef map< String, RenderTarget * >::type RenderTargetMap;
00062     typedef multimap<uchar, RenderTarget * >::type RenderTargetPriorityMap;
00063 
00064     class TextureManager;
00066     enum TexCoordCalcMethod
00067     {
00069         TEXCALC_NONE,
00071         TEXCALC_ENVIRONMENT_MAP,
00073         TEXCALC_ENVIRONMENT_MAP_PLANAR,
00074         TEXCALC_ENVIRONMENT_MAP_REFLECTION,
00075         TEXCALC_ENVIRONMENT_MAP_NORMAL,
00077         TEXCALC_PROJECTIVE_TEXTURE
00078     };
00080     enum StencilOperation
00081     {
00083         SOP_KEEP,
00085         SOP_ZERO,
00087         SOP_REPLACE,
00089         SOP_INCREMENT,
00091         SOP_DECREMENT,
00093         SOP_INCREMENT_WRAP,
00095         SOP_DECREMENT_WRAP,
00097         SOP_INVERT
00098     };
00099 
00100 
00124     class _OgreExport RenderSystem : public RenderSysAlloc
00125     {
00126     public:
00129         RenderSystem();
00130 
00133         virtual ~RenderSystem();
00134 
00137         virtual const String& getName(void) const = 0;
00138 
00160         virtual ConfigOptionMap& getConfigOptions(void) = 0;
00161 
00181         virtual void setConfigOption(const String &name, const String &value) = 0;
00182 
00185         virtual HardwareOcclusionQuery* createHardwareOcclusionQuery(void) = 0;
00186 
00189         virtual void destroyHardwareOcclusionQuery(HardwareOcclusionQuery *hq);
00190 
00195         virtual String validateConfigOptions(void) = 0;
00196 
00213         virtual RenderWindow* _initialise(bool autoCreateWindow, const String& windowTitle = "OGRE Render Window");
00214 
00215 
00217         virtual RenderSystemCapabilities* createRenderSystemCapabilities() const = 0;
00218  
00226         RenderSystemCapabilities* getMutableCapabilities(){ return mCurrentCapabilities; }
00227 
00234         virtual void useCustomRenderSystemCapabilities(RenderSystemCapabilities* capabilities);
00235 
00238         virtual void reinitialise(void) = 0;
00239 
00242         virtual void shutdown(void);
00243 
00244 
00247         virtual void setAmbientLight(float r, float g, float b) = 0;
00248 
00251         virtual void setShadingType(ShadeOptions so) = 0;
00252 
00258         virtual void setLightingEnabled(bool enabled) = 0;
00259 
00266         void setWBufferEnabled(bool enabled);
00267 
00270         bool getWBufferEnabled(void) const;
00271 
00508         virtual RenderWindow* _createRenderWindow(const String &name, unsigned int width, unsigned int height, 
00509             bool fullScreen, const NameValuePairList *miscParams = 0) = 0;
00510 
00526         virtual bool _createRenderWindows(const RenderWindowDescriptionList& renderWindowDescriptions, 
00527             RenderWindowList& createdWindows);
00528 
00529         
00534         virtual MultiRenderTarget * createMultiRenderTarget(const String & name) = 0; 
00535 
00537         virtual void destroyRenderWindow(const String& name);
00539         virtual void destroyRenderTexture(const String& name);
00541         virtual void destroyRenderTarget(const String& name);
00542 
00545         virtual void attachRenderTarget( RenderTarget &target );
00549         virtual RenderTarget * getRenderTarget( const String &name );
00555         virtual RenderTarget * detachRenderTarget( const String &name );
00556 
00558         typedef MapIterator<Ogre::RenderTargetMap> RenderTargetIterator;
00559 
00561         virtual RenderTargetIterator getRenderTargetIterator(void) {
00562             return RenderTargetIterator( mRenderTargets.begin(), mRenderTargets.end() );
00563         }
00566         virtual String getErrorDescription(long errorNumber) const = 0;
00567 
00581         void setWaitForVerticalBlank(bool enabled);
00582 
00585         bool getWaitForVerticalBlank(void) const;
00586 
00589         HardwareVertexBufferSharedPtr getGlobalInstanceVertexBuffer() const;
00592         void setGlobalInstanceVertexBuffer(const HardwareVertexBufferSharedPtr val);
00595         VertexDeclaration* getGlobalInstanceVertexBufferVertexDeclaration() const;
00598         void setGlobalInstanceVertexBufferVertexDeclaration( VertexDeclaration* val);
00601         size_t getGlobalNumberOfInstances() const;
00604         void setGlobalNumberOfInstances(const size_t val);
00605 
00606 #ifdef RTSHADER_SYSTEM_BUILD_CORE_SHADERS
00607 
00609         void setFixedPipelineEnabled(bool enabled);
00610 
00613         bool getFixedPipelineEnabled(void) const;
00614 #endif
00615 
00621         virtual void setDepthBufferFor( RenderTarget *renderTarget );
00622 
00623         // ------------------------------------------------------------------------
00624         //                     Internal Rendering Access
00625         // All methods below here are normally only called by other OGRE classes
00626         // They can be called by library user if required
00627         // ------------------------------------------------------------------------
00628 
00629 
00633         virtual void _useLights(const LightList& lights, unsigned short limit) = 0;
00636         virtual bool areFixedFunctionLightsInViewSpace() const { return false; }
00638         virtual void _setWorldMatrix(const Matrix4 &m) = 0;
00640         virtual void _setWorldMatrices(const Matrix4* m, unsigned short count);
00642         virtual void _setViewMatrix(const Matrix4 &m) = 0;
00644         virtual void _setProjectionMatrix(const Matrix4 &m) = 0;
00650         virtual void _setTextureUnitSettings(size_t texUnit, TextureUnitState& tl);
00652         virtual void _disableTextureUnit(size_t texUnit);
00654         virtual void _disableTextureUnitsFrom(size_t texUnit);
00688         virtual void _setSurfaceParams(const ColourValue &ambient,
00689             const ColourValue &diffuse, const ColourValue &specular,
00690             const ColourValue &emissive, Real shininess,
00691             TrackVertexColourType tracking = TVC_NONE) = 0;
00692 
00698         virtual void _setPointSpritesEnabled(bool enabled) = 0;
00699 
00710         virtual void _setPointParameters(Real size, bool attenuationEnabled, 
00711             Real constant, Real linear, Real quadratic, Real minSize, Real maxSize) = 0;
00712 
00713 
00726         virtual void _setTexture(size_t unit, bool enabled, 
00727             const TexturePtr &texPtr) = 0;
00741         virtual void _setTexture(size_t unit, bool enabled, const String &texname);
00742 
00752         virtual void _setVertexTexture(size_t unit, const TexturePtr& tex);
00753 
00763         virtual void _setTextureCoordSet(size_t unit, size_t index) = 0;
00764 
00772         virtual void _setTextureCoordCalculation(size_t unit, TexCoordCalcMethod m, 
00773             const Frustum* frustum = 0) = 0;
00774 
00781         virtual void _setTextureBlendMode(size_t unit, const LayerBlendModeEx& bm) = 0;
00782 
00789         virtual void _setTextureUnitFiltering(size_t unit, FilterOptions minFilter,
00790             FilterOptions magFilter, FilterOptions mipFilter);
00791 
00797         virtual void _setTextureUnitFiltering(size_t unit, FilterType ftype, FilterOptions filter) = 0;
00798 
00800         virtual void _setTextureLayerAnisotropy(size_t unit, unsigned int maxAnisotropy) = 0;
00801 
00803         virtual void _setTextureAddressingMode(size_t unit, const TextureUnitState::UVWAddressingMode& uvw) = 0;
00804 
00806         virtual void _setTextureBorderColour(size_t unit, const ColourValue& colour) = 0;
00807 
00816         virtual void _setTextureMipmapBias(size_t unit, float bias) = 0;
00817 
00822         virtual void _setTextureMatrix(size_t unit, const Matrix4& xform) = 0;
00823 
00834         virtual void _setSceneBlending(SceneBlendFactor sourceFactor, SceneBlendFactor destFactor, SceneBlendOperation op = SBO_ADD) = 0;
00835 
00848         virtual void _setSeparateSceneBlending(SceneBlendFactor sourceFactor, SceneBlendFactor destFactor, SceneBlendFactor sourceFactorAlpha, 
00849             SceneBlendFactor destFactorAlpha, SceneBlendOperation op = SBO_ADD, SceneBlendOperation alphaOp = SBO_ADD) = 0;
00850 
00857         virtual void _setAlphaRejectSettings(CompareFunction func, unsigned char value, bool alphaToCoverage) = 0;
00858 
00862         virtual void _setTextureProjectionRelativeTo(bool enabled, const Vector3& pos);
00863 
00871         virtual DepthBuffer* _createDepthBufferFor( RenderTarget *renderTarget ) = 0;
00872 
00880         void _cleanupDepthBuffers( bool bCleanManualBuffers=true );
00881 
00886         virtual void _beginFrame(void) = 0;
00887         
00888         //Dummy structure for render system contexts - implementing RenderSystems can extend
00889         //as needed
00890         struct RenderSystemContext { };
00896         virtual RenderSystemContext* _pauseFrame(void);
00903         virtual void _resumeFrame(RenderSystemContext* context);
00904 
00908         virtual void _endFrame(void) = 0;
00916         virtual void _setViewport(Viewport *vp) = 0;
00918         virtual Viewport* _getViewport(void);
00919 
00931         virtual void _setCullingMode(CullingMode mode) = 0;
00932 
00933         virtual CullingMode _getCullingMode(void) const;
00934 
00948         virtual void _setDepthBufferParams(bool depthTest = true, bool depthWrite = true, CompareFunction depthFunction = CMPF_LESS_EQUAL) = 0;
00949 
00954         virtual void _setDepthBufferCheckEnabled(bool enabled = true) = 0;
00959         virtual void _setDepthBufferWriteEnabled(bool enabled = true) = 0;
00967         virtual void _setDepthBufferFunction(CompareFunction func = CMPF_LESS_EQUAL) = 0;
00975         virtual void _setColourBufferWriteEnabled(bool red, bool green, bool blue, bool alpha) = 0;
00998         virtual void _setDepthBias(float constantBias, float slopeScaleBias = 0.0f) = 0;
01010         virtual void _setFog(FogMode mode = FOG_NONE, const ColourValue& colour = ColourValue::White, Real expDensity = 1.0, Real linearStart = 0.0, Real linearEnd = 1.0) = 0;
01011 
01012 
01014         virtual void _beginGeometryCount(void);
01016         virtual unsigned int _getFaceCount(void) const;
01018         virtual unsigned int _getBatchCount(void) const;
01020         virtual unsigned int _getVertexCount(void) const;
01021 
01030         virtual void convertColourValue(const ColourValue& colour, uint32* pDest);
01034         virtual VertexElementType getColourVertexElementType(void) const = 0;
01035 
01042         virtual void _convertProjectionMatrix(const Matrix4& matrix,
01043             Matrix4& dest, bool forGpuProgram = false) = 0;
01044 
01051         virtual void _makeProjectionMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, 
01052             Matrix4& dest, bool forGpuProgram = false) = 0;
01053 
01060         virtual void _makeProjectionMatrix(Real left, Real right, Real bottom, Real top, 
01061             Real nearPlane, Real farPlane, Matrix4& dest, bool forGpuProgram = false) = 0;
01068         virtual void _makeOrthoMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, 
01069             Matrix4& dest, bool forGpuProgram = false) = 0;
01070 
01087         virtual void _applyObliqueDepthProjection(Matrix4& matrix, const Plane& plane, 
01088             bool forGpuProgram) = 0;
01089 
01091         virtual void _setPolygonMode(PolygonMode level) = 0;
01092 
01099         virtual void setStencilCheckEnabled(bool enabled) = 0;
01115         /*virtual bool hasHardwareStencil(void) = 0;*/
01116 
01152         virtual void setStencilBufferParams(CompareFunction func = CMPF_ALWAYS_PASS, 
01153             uint32 refValue = 0, uint32 mask = 0xFFFFFFFF, 
01154             StencilOperation stencilFailOp = SOP_KEEP, 
01155             StencilOperation depthFailOp = SOP_KEEP,
01156             StencilOperation passOp = SOP_KEEP, 
01157             bool twoSidedOperation = false) = 0;
01158 
01159 
01160 
01162         virtual void setVertexDeclaration(VertexDeclaration* decl) = 0;
01164         virtual void setVertexBufferBinding(VertexBufferBinding* binding) = 0;
01165 
01176         virtual void setNormaliseNormals(bool normalise) = 0;
01177 
01190         virtual void _render(const RenderOperation& op);
01191 
01193         const RenderSystemCapabilities* getCapabilities(void) const { return mCurrentCapabilities; }
01194 
01195 
01198         virtual const DriverVersion& getDriverVersion(void) const { return mDriverVersion; }
01199 
01209         virtual const String& _getDefaultViewportMaterialScheme(void) const;
01210 
01215         virtual void bindGpuProgram(GpuProgram* prg);
01216 
01222         virtual void bindGpuProgramParameters(GpuProgramType gptype, 
01223             GpuProgramParametersSharedPtr params, uint16 variabilityMask) = 0;
01224 
01227         virtual void bindGpuProgramPassIterationParameters(GpuProgramType gptype) = 0;
01232         virtual void unbindGpuProgram(GpuProgramType gptype);
01233 
01235         virtual bool isGpuProgramBound(GpuProgramType gptype);
01236 
01239         virtual void setClipPlanes(const PlaneList& clipPlanes);
01240 
01242         virtual void addClipPlane (const Plane &p);
01244         virtual void addClipPlane (Real A, Real B, Real C, Real D);
01245 
01248         virtual void resetClipPlanes();
01249 
01251         virtual void _initRenderTargets(void);
01252 
01256         virtual void _notifyCameraRemoved(const Camera* cam);
01257 
01259         virtual void _updateAllRenderTargets(bool swapBuffers = true);
01262         virtual void _swapAllRenderTargetBuffers(bool waitForVsync = true);
01263 
01266         virtual void setInvertVertexWinding(bool invert);
01267 
01271         virtual bool getInvertVertexWinding(void) const;
01272 
01284         virtual void setScissorTest(bool enabled, size_t left = 0, size_t top = 0, 
01285             size_t right = 800, size_t bottom = 600) = 0;
01286 
01294         virtual void clearFrameBuffer(unsigned int buffers, 
01295             const ColourValue& colour = ColourValue::Black, 
01296             Real depth = 1.0f, unsigned short stencil = 0) = 0;
01306         virtual Real getHorizontalTexelOffset(void) = 0;
01316         virtual Real getVerticalTexelOffset(void) = 0;
01317 
01326         virtual Real getMinimumDepthInputValue(void) = 0;
01335         virtual Real getMaximumDepthInputValue(void) = 0;
01341         virtual void setCurrentPassIterationCount(const size_t count) { mCurrentPassIterationCount = count; }
01342 
01352         virtual void setDeriveDepthBias(bool derive, float baseValue = 0.0f,
01353             float multiplier = 0.0f, float slopeScale = 0.0f)
01354         {
01355             mDerivedDepthBias = derive;
01356             mDerivedDepthBiasBase = baseValue;
01357             mDerivedDepthBiasMultiplier = multiplier;
01358             mDerivedDepthBiasSlopeScale = slopeScale;
01359         }
01360 
01364         virtual void _setRenderTarget(RenderTarget *target) = 0;
01365 
01370         class _OgreExport Listener
01371         {
01372         public:
01373             Listener() {}
01374             virtual ~Listener() {}
01375 
01381             virtual void eventOccurred(const String& eventName, 
01382                 const NameValuePairList* parameters = 0) = 0;
01383         };
01397         virtual void addListener(Listener* l);
01400         virtual void removeListener(Listener* l);
01401 
01406         virtual const StringVector& getRenderSystemEvents(void) const { return mEventNames; }
01407 
01424         virtual void preExtraThreadsStarted() = 0;
01425 
01426         /* Tell the rendersystem to perform any tasks it needs to directly
01427         after other threads which might access the rendering API are registered.
01428         @see RenderSystem::preExtraThreadsStarted
01429         */
01430         virtual void postExtraThreadsStarted() = 0;
01431 
01444         virtual void registerThread() = 0;
01445 
01449         virtual void unregisterThread() = 0;
01450 
01455         virtual unsigned int getDisplayMonitorCount() const = 0;
01456     protected:
01457 
01459         DepthBufferMap  mDepthBufferPool;
01460 
01462         RenderTargetMap mRenderTargets;
01464         RenderTargetPriorityMap mPrioritisedRenderTargets;
01466         RenderTarget * mActiveRenderTarget;
01467 
01469         GpuProgramParametersSharedPtr mActiveVertexGpuProgramParameters;
01470         GpuProgramParametersSharedPtr mActiveGeometryGpuProgramParameters;
01471         GpuProgramParametersSharedPtr mActiveFragmentGpuProgramParameters;
01472 
01473         // Texture manager
01474         // A concrete class of this will be created and
01475         // made available under the TextureManager singleton,
01476         // managed by the RenderSystem
01477         TextureManager* mTextureManager;
01478 
01479         // Active viewport (dest for future rendering operations)
01480         Viewport* mActiveViewport;
01481 
01482         CullingMode mCullingMode;
01483 
01484         bool mVSync;
01485         unsigned int mVSyncInterval;
01486         bool mWBuffer;
01487 
01488         size_t mBatchCount;
01489         size_t mFaceCount;
01490         size_t mVertexCount;
01491 
01493         ColourValue mManualBlendColours[OGRE_MAX_TEXTURE_LAYERS][2];
01494 
01495         bool mInvertVertexWinding;
01496 
01498         size_t mDisabledTexUnitsFrom;
01499 
01501         size_t mCurrentPassIterationCount;
01502         size_t mCurrentPassIterationNum;
01504         bool mDerivedDepthBias;
01505         float mDerivedDepthBiasBase;
01506         float mDerivedDepthBiasMultiplier;
01507         float mDerivedDepthBiasSlopeScale;
01508 
01510         HardwareVertexBufferSharedPtr mGlobalInstanceVertexBuffer;
01512         VertexDeclaration* mGlobalInstanceVertexBufferVertexDeclaration;
01514         size_t mGlobalNumberOfInstances;
01515 
01516 #ifdef RTSHADER_SYSTEM_BUILD_CORE_SHADERS
01518         bool mEnableFixedPipeline;
01519 #endif
01520 
01525         bool updatePassIterationRenderState(void);
01526 
01528         StringVector mEventNames;
01529 
01531         virtual void fireEvent(const String& name, const NameValuePairList* params = 0);
01532 
01533         typedef list<Listener*>::type ListenerList;
01534         ListenerList mEventListeners;
01535 
01536         typedef list<HardwareOcclusionQuery*>::type HardwareOcclusionQueryList;
01537         HardwareOcclusionQueryList mHwOcclusionQueries;
01538 
01539         bool mVertexProgramBound;
01540         bool mGeometryProgramBound;
01541         bool mFragmentProgramBound;
01542 
01543         // Recording user clip planes
01544         PlaneList mClipPlanes;
01545         // Indicator that we need to re-set the clip planes on next render call
01546         bool mClipPlanesDirty;
01547 
01549         RenderSystemCapabilities* mRealCapabilities;
01550         RenderSystemCapabilities* mCurrentCapabilities;
01551         bool mUseCustomCapabilities;
01552 
01554         virtual void setClipPlanesImpl(const PlaneList& clipPlanes) = 0;
01555 
01557         virtual void initialiseFromRenderSystemCapabilities(RenderSystemCapabilities* caps, RenderTarget* primary) = 0;
01558 
01559 
01560         DriverVersion mDriverVersion;
01561 
01562         bool mTexProjRelative;
01563         Vector3 mTexProjRelativeOrigin;
01564 
01565 
01566 
01567     };
01570 }
01571 
01572 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:25 2012