Ignore:
Timestamp:
02/20/06 19:06:03 (19 years ago)
Author:
mattausch
Message:

added ogre dependencies and patched ogre sources

Location:
OGRE/trunk/ogre_changes
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • OGRE/trunk/ogre_changes/OgreMain/include/OgreFrustum.h

    r61 r657  
    445445                /** Disables any custom near clip plane. */ 
    446446                virtual void disableCustomNearClipPlane(void); 
     447                /** Is a custom near clip plane in use? */ 
     448                virtual bool isCustomNearClipPlaneEnabled(void) const  
     449                { return mObliqueDepthProjection; } 
    447450                 
    448451 
  • OGRE/trunk/ogre_changes/OgreMain/include/OgreHardwareOcclusionQuery.h

    r115 r657  
    4646  * 
    4747  * @author Lee Sandberg 
     48  * Updated on 4/8/2005 by Tuan Kuranes email: tuan.kuranes@free.fr 
    4849  */ 
    4950class _OgreExport HardwareOcclusionQuery 
     
    8283          *                             UINT    m_uintNumberOfPixelsVisable; 
    8384          *                             pullOcclusionQuery( &m_dwNumberOfPixelsVisable ); 
    84           *                             You may not get the result directlly after the first pass or frame. 
    85           *                             Objects not visable must be tested every frame, visable objects may be tested less freqvent. 
     85          *                             You may not get the result directly after the first pass or frame. 
     86          *                             Objects not visible must be tested every frame, visible objects may be tested less frequently. 
    8687          *                      
    8788          */ 
     
    112113          *    
    113114          * @Remarks This function allows you to set how often the hardware occlusion really are sent to the driver 
    114           * if you set it to 0 every hw occlusion test is acctually made. If you set it to 1 only the half of your queries are sent  
    115           * for all visable objects. 2 will result in 25% of all queries to acctualy be sent.  
    116           * New and none visable objects will be tested all the time. 
    117           * This functionality is here because this class can keep track on visable and none visable objects for you. 
     115          * if you set it to 0 every hardware occlusion test is actually made. If you set it to 1 only the half of your queries are sent  
     116          * for all visible objects. 2 will result in 25% of all queries to actually be sent.  
     117          * New and none visible objects will be tested all the time. 
     118          * This functionality is here because this class can keep track on visible and none visible objects for you. 
    118119          * Once you you set the SkipRate for any hardware occlusion instance it effects all others. 
    119120          */ 
  • OGRE/trunk/ogre_changes/OgreMain/include/OgreRenderQueueSortingGrouping.h

    r343 r657  
    316316        } 
    317317 
    318         /** Clears this group of renderables.  
    319         @remarks 
    320             Doesn't delete any priority groups, just empties them. Saves on  
     318       /** Clears this group of renderables.  
     319        @param destroy 
     320            If false, doesn't delete any priority groups, just empties them. Saves on  
    321321            memory deallocations since the chances are rougly the same kinds of  
    322             renderables are going to be sent to the queue again next time. 
    323         */ 
    324         void clear(void) 
     322            renderables are going to be sent to the queue again next time. If 
     323                        true, completely destroys. 
     324        */ 
     325        void clear(bool destroy = false) 
    325326        { 
    326327            PriorityMap::iterator i, iend; 
     
    328329            for (i = mPriorityGroups.begin(); i != iend; ++i) 
    329330            { 
    330                 i->second->clear(); 
    331             } 
    332  
    333         } 
     331                                if (destroy) 
     332                                        delete i->second; 
     333                                else 
     334                                        i->second->clear(); 
     335            } 
     336 
     337                        if (destroy) 
     338                                mPriorityGroups.clear(); 
     339 
     340        } 
     341 
    334342#ifdef GTP_VISIBILITY_MODIFIED_OGRE      
    335343                void clear(int passes) 
  • OGRE/trunk/ogre_changes/OgreMain/include/OgreRenderSystem.h

    r316 r657  
    4242#include "OgreGpuProgram.h" 
    4343#include "OgrePlane.h" 
     44#include "OgreIteratorWrappers.h" 
    4445 
    4546namespace Ogre 
     
    173174        virtual void setConfigOption(const String &name, const String &value) = 0; 
    174175 
    175                 virtual HardwareOcclusionQuery* createHardwareOcclusionQuery() = 0; 
     176                /** Create an object for performing hardware occlusion queries.  
     177                */ 
     178                virtual HardwareOcclusionQuery* createHardwareOcclusionQuery(void) = 0; 
     179 
     180                /** Destroy a hardware occlusion query object.  
     181                */ 
     182                virtual void destroyHardwareOcclusionQuery(HardwareOcclusionQuery *hq); 
    176183 
    177184        /** Validates the options set for the rendering system, returning a message if there are problems. 
     
    295302                                Description: External window handle, for embedding the OGRE context 
    296303                                Values: positive integer for W32 (HWND handle) 
    297                                         posint:posint:posint for GLX (display:screen:windowHandle) 
     304                                        poslong:posint:poslong (display*:screen:windowHandle) or 
     305                                        poslong:posint:poslong:poslong (display*:screen:windowHandle:XVisualInfo*) for GLX 
    298306                                Default: 0 (None) 
    299307                                ** 
     
    301309                                Description: Parent window handle, for embedding the OGRE context 
    302310                                Values: positive integer for W32 (HWND handle) 
    303                                         posint:posint:posint for GLX (display:screen:windowHandle) 
     311                                        poslong:posint:poslong for GLX (display*:screen:windowHandle) 
    304312                                Default: 0 (None) 
    305313                                ** 
     
    392400        virtual RenderTarget * detachRenderTarget( const String &name ); 
    393401 
     402                /// Iterator over RenderTargets 
     403                typedef MapIterator<Ogre::RenderTargetMap> RenderTargetIterator; 
     404 
     405                /** Returns a specialised MapIterator over all render targets attached to the RenderSystem. */ 
     406                virtual RenderTargetIterator getRenderTargetIterator(void) { 
     407                        return RenderTargetIterator( mRenderTargets.begin(), mRenderTargets.end() ); 
     408                } 
    394409        /** Returns a description of an error code. 
    395410        */ 
     
    947962        virtual Real getMaximumDepthInputValue(void) = 0; 
    948963 
     964                /** Defines a listener on the custom events that this render system  
     965                        can raise. 
     966                @see RenderSystem::addListener 
     967                */ 
     968                class _OgreExport Listener 
     969                { 
     970                public: 
     971                        Listener() {} 
     972                        virtual ~Listener() {} 
     973 
     974                        /** A rendersystem-specific event occurred. 
     975                        @param eventName The name of the event which has occurred 
     976                        @param parameters A list of parameters that may belong to this event, 
     977                                may be null if there are no parameters 
     978                        */ 
     979                        virtual void eventOccurred(const String& eventName,  
     980                                const NameValuePairList* parameters = 0) = 0; 
     981                }; 
     982                /** Adds a listener to the custom events that this render system can raise. 
     983                @remarks 
     984                        Some render systems have quite specific, internally generated events  
     985                        that the application may wish to be notified of. Many applications 
     986                        don't have to worry about these events, and can just trust OGRE to  
     987                        handle them, but if you want to know, you can add a listener here. 
     988                @par 
     989                        Events are raised very generically by string name. Perhaps the most  
     990                        common example of a render system specific event is the loss and  
     991                        restoration of a device in DirectX; which OGRE deals with, but you  
     992                        may wish to know when it happens.  
     993                @see RenderSystem::getRenderSystemEvents 
     994                */ 
     995                virtual void addListener(Listener* l); 
     996                /** Remove a listener to the custom events that this render system can raise. 
     997                */ 
     998                virtual void removeListener(Listener* l); 
     999 
     1000                /** Gets a list of the rendersystem specific events that this rendersystem 
     1001                        can raise. 
     1002                @see RenderSystem::addListener 
     1003                */ 
     1004                virtual const StringVector& getRenderSystemEvents(void) const { return mEventNames; } 
    9491005    protected: 
    9501006 
     
    9841040 
    9851041        bool mInvertVertexWinding; 
     1042 
     1043                /// List of names of events this rendersystem may raise 
     1044                StringVector mEventNames; 
     1045 
     1046                /// Internal method for firing a rendersystem event 
     1047                virtual void fireEvent(const String& name, const NameValuePairList* params = 0); 
     1048 
     1049                typedef std::list<Listener*> ListenerList; 
     1050                ListenerList mEventListeners; 
     1051 
     1052                typedef std::list<HardwareOcclusionQuery*> HardwareOcclusionQueryList; 
     1053                HardwareOcclusionQueryList mHwOcclusionQueries; 
     1054 
     1055 
    9861056    }; 
    9871057} 
  • OGRE/trunk/ogre_changes/OgreMain/include/OgreSceneManager.h

    r316 r657  
    271271        */ 
    272272        virtual void initRenderQueue(void); 
    273         /** Retrieves the internal render queue. */ 
    274         virtual RenderQueue* getRenderQueue(void); 
    275  
    276273        /** Internal method for setting up the renderstate for a rendering pass. 
    277274            @param 
     
    282279        */ 
    283280        virtual Pass* setPass(Pass* pass); 
    284  
    285281        /// A pass designed to let us render shadow colour on white for texture shadows 
    286282        Pass* mShadowCasterPlainBlackPass; 
     
    429425        virtual void createShadowTextures(unsigned short size, unsigned short count,  
    430426                        PixelFormat fmt); 
     427        /// Internal method for destroying shadow textures (texture-based shadows) 
     428        virtual void destroyShadowTextures(void); 
    431429        /// Internal method for preparing shadow textures ready for use in a regular render 
    432430        virtual void prepareShadowTextures(Camera* cam, Viewport* vp); 
     
    582580 
    583581        /** Removes (and destroys) all cameras from the scene. 
     582            @remarks 
     583                Some cameras are internal created to dealing with texture shadow, 
     584                their aren't supposed to destroy outside. So, while you are using 
     585                texture shadow, don't call this method, or you can set the shadow 
     586                technique other than texture-based, which will destroy all internal 
     587                created shadow cameras and textures. 
    584588        */ 
    585589        virtual void removeAllCameras(void); 
     
    10251029            const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); 
    10261030 
     1031                /** Return whether a key plane is enabled */ 
     1032                virtual bool isSkyPlaneEnabled(void) const { return mSkyPlaneEnabled; } 
     1033 
     1034                /** Get the sky plane node, if enabled. */ 
     1035                virtual SceneNode* getSkyPlaneNode(void) { return mSkyPlaneNode; }               
     1036 
    10271037        /** Enables / disables a 'sky box' i.e. a 6-sided box at constant 
    10281038            distance from the camera representing the sky. 
     
    10701080            bool drawFirst = true, const Quaternion& orientation = Quaternion::IDENTITY, 
    10711081            const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); 
     1082 
     1083                /** Return whether a skybox is enabled */ 
     1084                virtual bool isSkyBoxEnabled(void) const { return mSkyBoxEnabled; } 
     1085 
     1086                /** Get the skybox node, if enabled. */ 
     1087                virtual SceneNode* getSkyBoxNode(void) const { return mSkyBoxNode; } 
    10721088 
    10731089        /** Enables / disables a 'sky dome' i.e. an illusion of a curved sky. 
     
    11321148            int xsegments = 16, int ysegments = 16, int ysegments_keep = -1, 
    11331149            const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); 
     1150 
     1151                /** Return whether a skydome is enabled */ 
     1152                virtual bool isSkyDomeEnabled(void) const { return mSkyDomeEnabled; } 
     1153 
     1154                /** Get the sky dome node, if enabled. */ 
     1155                virtual SceneNode* getSkyDomeNode(void) { return mSkyDomeNode; }                 
    11341156 
    11351157        /** Sets the fogging mode applied to the scene. 
     
    13401362            const Matrix4& worldMatrix, const Matrix4& viewMatrix, const Matrix4& projMatrix,  
    13411363            bool doBeginEndFrame = false) ; 
     1364 
     1365        /** Retrieves the internal render queue, for advanced users only. 
     1366        @remarks 
     1367            The render queue is mainly used internally to manage the scene object  
     1368                        rendering queue, it also exports some methods to allow advanced users  
     1369                        to configure the behavior of rendering process. 
     1370            Most methods provided by RenderQueue are supposed to be used  
     1371                        internally only, you should reference to the RenderQueue API for  
     1372                        more information. Do not access this directly unless you know what  
     1373                        you are doing. 
     1374        */ 
     1375        virtual RenderQueue* getRenderQueue(void); 
    13421376 
    13431377        /** Registers a new RenderQueueListener which will be notified when render queues 
  • OGRE/trunk/ogre_changes/OgreMain/src/OgreRenderSystem.cpp

    r316 r657  
    4040#include "OgreMaterial.h" 
    4141#include "OgreTimer.h" 
     42#include "OgreHardwareOcclusionQuery.h" 
    4243 
    4344namespace Ogre { 
     
    6970    { 
    7071        shutdown(); 
     72                delete mCapabilities; 
     73                mCapabilities = 0; 
    7174    } 
    7275    //----------------------------------------------------------------------- 
     
    324327    void RenderSystem::shutdown(void) 
    325328    { 
     329                // Remove occlusion queries 
     330                for (HardwareOcclusionQueryList::iterator i = mHwOcclusionQueries.begin(); 
     331                        i != mHwOcclusionQueries.end(); ++i) 
     332                { 
     333                        delete *i; 
     334                } 
     335                mHwOcclusionQueries.clear(); 
     336 
    326337        // Remove all the render targets. 
    327338                // (destroy primary target last since others may depend on it) 
     
    416427        } 
    417428    } 
     429        //----------------------------------------------------------------------- 
     430        void RenderSystem::addListener(Listener* l) 
     431        { 
     432                mEventListeners.push_back(l); 
     433        } 
     434        //----------------------------------------------------------------------- 
     435        void RenderSystem::removeListener(Listener* l) 
     436        { 
     437                mEventListeners.remove(l); 
     438        } 
     439        //----------------------------------------------------------------------- 
     440        void RenderSystem::fireEvent(const String& name, const NameValuePairList* params) 
     441        { 
     442                for(ListenerList::iterator i = mEventListeners.begin();  
     443                        i != mEventListeners.end(); ++i) 
     444                { 
     445                        (*i)->eventOccurred(name, params); 
     446                } 
     447        } 
     448        //----------------------------------------------------------------------- 
     449        void RenderSystem::destroyHardwareOcclusionQuery( HardwareOcclusionQuery *hq) 
     450        { 
     451                for (HardwareOcclusionQueryList::iterator i = mHwOcclusionQueries.begin(); 
     452                        i != mHwOcclusionQueries.end(); ++i) 
     453                { 
     454                        if (*i == hq) 
     455                        { 
     456                                delete *i; 
     457                                mHwOcclusionQueries.erase(i); 
     458                                break; 
     459                        } 
     460                } 
     461        } 
     462 
    418463} 
    419464 
  • OGRE/trunk/ogre_changes/OgreMain/src/OgreSceneManager.cpp

    r343 r657  
    375375    // Subclasses could do something smarter 
    376376    destList.clear(); 
    377     Real squaredRadius = radius * radius; 
    378377 
    379378    SceneLightList::iterator i, iend; 
     
    396395                // only add in-range lights 
    397396                Real range = lt->getAttenuationRange(); 
    398                 if ((lt->tempSquareDist - squaredRadius) <= (range * range)) 
     397                Real maxDist = range + radius; 
     398                if (lt->tempSquareDist <= Math::Sqr(maxDist)) 
    399399                { 
    400400                    destList.push_back(lt); 
     
    554554    mSkyBoxEnabled = mSkyPlaneEnabled = mSkyDomeEnabled = false;  
    555555 
     556        // Clear render queue, empty completely 
     557        if (mRenderQueue) 
     558                mRenderQueue->clear(true); 
     559 
    556560} 
    557561//----------------------------------------------------------------------- 
     
    593597    AutoTrackingSceneNodes::iterator ai, aiend; 
    594598    aiend = mAutoTrackingSceneNodes.end(); 
    595     for (ai = mAutoTrackingSceneNodes.begin(); ai != aiend; ++ai) 
    596     { 
    597         SceneNode* n = *ai; 
     599    for (ai = mAutoTrackingSceneNodes.begin(); ai != aiend; ) 
     600    { 
     601                // Pre-increment incase we delete 
     602                AutoTrackingSceneNodes::iterator curri = ai++; 
     603        SceneNode* n = *curri; 
    598604        // Tracking this node 
    599605        if (n->getAutoTrackTarget() == i->second) 
     
    601607            // turn off, this will notify SceneManager to remove 
    602608            n->setAutoTracking(false); 
    603             // no need to reset iterator since set erase does not invalidate 
    604609        } 
    605610        // node is itself a tracker 
    606611        else if (n == i->second) 
    607612        { 
    608             mAutoTrackingSceneNodes.erase(ai); 
     613            mAutoTrackingSceneNodes.erase(curri); 
    609614        } 
    610615    } 
     
    814819    if (thisFrameNumber != lastFrameNumber) 
    815820    { 
     821        // Update controllers  
     822        ControllerManager::getSingleton().updateAllControllers(); 
    816823        // Update animations 
    817824        _applySceneAnimations(); 
    818         // Update controllers  
    819         ControllerManager::getSingleton().updateAllControllers(); 
    820825        lastFrameNumber = thisFrameNumber; 
    821826    } 
     
    868873    } 
    869874 
     875    // Tell params about viewport 
     876    mAutoParamDataSource.setCurrentViewport(vp); 
    870877    // Set the viewport 
    871878    setViewport(vp); 
     
    14091416            { 
    14101417                // Someone requested we skip this queue 
    1411                 continue; 
     1418                break; 
    14121419            } 
    14131420 
     
    17131720            mShadowReceiverPass->_load(); 
    17141721 
    1715             if (l->getCastShadows() && pGroup->getShadowsEnabled()) 
     1722            if (l->getCastShadows()) 
    17161723            { 
    17171724                renderTextureShadowReceiverQueueGroupObjects(pGroup); 
     
    18761883        { 
    18771884            // Ordinary pass 
     1885            if (pGroup->getShadowsEnabled()) 
    18781886            renderModulativeTextureShadowedQueueGroupObjects(pGroup); 
     1887                        else 
     1888                                renderBasicQueueGroupObjects(pGroup); 
    18791889        } 
    18801890    } 
     
    21182128{ 
    21192129    mAmbientLight = colour; 
    2120     mDestRenderSystem->setAmbientLight(colour.r, colour.g, colour.b); 
    21212130} 
    21222131//----------------------------------------------------------------------- 
     
    26562665    { 
    26572666        createShadowTextures(mShadowTextureSize, mShadowTextureCount, mShadowTextureFormat); 
     2667    } 
     2668    else 
     2669    { 
     2670        // Destroy shadow textures to optimise resource usage 
     2671        destroyShadowTextures(); 
    26582672    } 
    26592673 
     
    27642778        const Vector3* corners = camera->getWorldSpaceCorners(); 
    27652779        Vector3 min, max; 
    2766         Vector3 extrude = light->getDirection() * -mShadowDirLightExtrudeDist; 
     2780        Vector3 extrude = light->getDerivedDirection() * -mShadowDirLightExtrudeDist; 
    27672781        // do first corner 
    27682782        min = max = corners[0]; 
     
    27922806    else 
    27932807    { 
    2794         Sphere s(light->getPosition(), light->getAttenuationRange()); 
     2808        Sphere s(light->getDerivedPosition(), light->getAttenuationRange()); 
    27952809        // eliminate early if camera cannot see light sphere 
    27962810        if (camera->isVisible(s)) 
     
    28752889        { 
    28762890            mShadowDebugPass = matDebug->getTechnique(0)->getPass(0); 
     2891 
     2892            if (mDestRenderSystem->getCapabilities()->hasCapability(RSC_VERTEX_PROGRAM)) 
     2893            { 
     2894                mInfiniteExtrusionParams = mShadowDebugPass->getVertexProgramParameters(); 
     2895            } 
    28772896        } 
    28782897    } 
     
    29152934        { 
    29162935            mShadowStencilPass = matStencil->getTechnique(0)->getPass(0); 
     2936 
     2937            if (mDestRenderSystem->getCapabilities()->hasCapability(RSC_VERTEX_PROGRAM)) 
     2938            { 
     2939                mFiniteExtrusionParams = mShadowStencilPass->getVertexProgramParameters(); 
     2940            } 
    29172941        } 
    29182942    } 
     
    30293053Pass* SceneManager::deriveShadowCasterPass(Pass* pass) 
    30303054{ 
     3055        Pass* retPass = 0; 
    30313056    switch (mShadowTechnique) 
    30323057    { 
    30333058    case SHADOWTYPE_TEXTURE_MODULATIVE: 
    3034                 if (mShadowTextureCustomCasterPass) 
     3059                retPass = mShadowTextureCustomCasterPass ?  
     3060                        mShadowTextureCustomCasterPass : mShadowCasterPlainBlackPass; 
     3061 
     3062 
     3063                // Special case alpha-blended passes 
     3064                if ((pass->getSourceBlendFactor() == SBF_SOURCE_ALPHA &&  
     3065                        pass->getDestBlendFactor() == SBF_ONE_MINUS_SOURCE_ALPHA)  
     3066                        || pass->getAlphaRejectFunction() != CMPF_ALWAYS_PASS) 
    30353067                { 
    3036                         // Caster pass has been customised 
     3068                        // Alpha blended passes must retain their transparency 
     3069                        retPass->setAlphaRejectSettings(pass->getAlphaRejectFunction(),  
     3070                                pass->getAlphaRejectValue()); 
     3071                        retPass->setSceneBlending(pass->getSourceBlendFactor(), pass->getDestBlendFactor()); 
     3072                        retPass->getParent()->getParent()->setTransparencyCastsShadows(true); 
     3073 
     3074                        // So we allow the texture units, but override the colour functions 
     3075                        // Copy texture state, shift up one since 0 is shadow texture 
     3076                        size_t origPassTUCount = pass->getNumTextureUnitStates(); 
     3077                        for (size_t t = 0; t < origPassTUCount; ++t) 
     3078                        { 
     3079                                TextureUnitState* tex; 
     3080                                if (retPass->getNumTextureUnitStates() <= t) 
     3081                                { 
     3082                                        tex = retPass->createTextureUnitState(); 
     3083                                } 
     3084                                else 
     3085                                { 
     3086                                        tex = retPass->getTextureUnitState(t); 
     3087                                } 
     3088                                // copy base state 
     3089                                (*tex) = *(pass->getTextureUnitState(t)); 
     3090                                // override colour function 
     3091                                tex->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, 
     3092                                        mShadowColour); 
     3093 
     3094                        } 
     3095                        // Remove any extras 
     3096                        while (retPass->getNumTextureUnitStates() > origPassTUCount) 
     3097                        { 
     3098                                retPass->removeTextureUnitState(origPassTUCount); 
     3099                        } 
     3100 
     3101                } 
     3102                else 
     3103                { 
     3104                        // reset 
     3105                        retPass->setSceneBlending(SBF_ONE, SBF_ZERO); 
     3106                        retPass->setAlphaRejectFunction(CMPF_ALWAYS_PASS); 
     3107                        while (retPass->getNumTextureUnitStates() > 0) 
     3108                        { 
     3109                                retPass->removeTextureUnitState(0); 
     3110                        } 
     3111                } 
     3112 
     3113                // Propagate culling modes 
     3114                retPass->setCullingMode(pass->getCullingMode()); 
     3115                retPass->setManualCullingMode(pass->getManualCullingMode()); 
     3116 
    30373117 
    30383118                        if (!pass->getShadowCasterVertexProgramName().empty()) 
    30393119                        { 
    30403120                                // Have to merge the shadow caster vertex program in 
    3041                                 mShadowTextureCustomCasterPass->setVertexProgram( 
     3121                        retPass->setVertexProgram( 
    30423122                                        pass->getShadowCasterVertexProgramName()); 
    3043                                 const GpuProgramPtr& prg = mShadowTextureCustomCasterPass->getVertexProgram(); 
     3123                        const GpuProgramPtr& prg = retPass->getVertexProgram(); 
    30443124                                // Load this program if not done already 
    30453125                                if (!prg->isLoaded()) 
    30463126                                        prg->load(); 
    30473127                                // Copy params 
    3048                                 mShadowTextureCustomCasterPass->setVertexProgramParameters( 
     3128                        retPass->setVertexProgramParameters( 
    30493129                                        pass->getShadowCasterVertexProgramParameters()); 
     3130                        if (retPass == mShadowTextureCustomCasterPass) 
     3131                        { 
    30503132                                // mark that we've overridden the standard 
    30513133                                mShadowTextureCasterVPDirty = true; 
     3134                        } 
    30523135                                // Also have to hack the light autoparams, that is done later 
    30533136                        } 
    3054                         else if (mShadowTextureCasterVPDirty) 
     3137                else  
     3138                { 
     3139                        retPass->setVertexProgram(StringUtil::BLANK); 
     3140                        if (mShadowTextureCasterVPDirty) 
    30553141                        { 
    30563142                                // reset 
     
    30653151                                mShadowTextureCasterVPDirty = false; 
    30663152                        } 
    3067                         return mShadowTextureCustomCasterPass; 
    30683153                } 
    3069                 else 
    3070                 { 
    3071                         // Standard pass 
    3072                         if (pass->hasVertexProgram()) 
    3073                         { 
    3074                                 // Have to merge the shadow caster vertex program in 
    3075                                 // This may in fact be blank, in which case it falls back on  
    3076                                 // fixed function 
    3077                                 mShadowCasterPlainBlackPass->setVertexProgram( 
    3078                                         pass->getShadowCasterVertexProgramName()); 
    3079                                 // Did this result in a new vertex program? 
    3080                                 if (mShadowCasterPlainBlackPass->hasVertexProgram()) 
    3081                                 { 
    3082                                         const GpuProgramPtr& prg = mShadowCasterPlainBlackPass->getVertexProgram(); 
    3083                                         // Load this program if not done already 
    3084                                         if (!prg->isLoaded()) 
    3085                                                 prg->load(); 
    3086                                         // Copy params 
    3087                                         mShadowCasterPlainBlackPass->setVertexProgramParameters( 
    3088                                                 pass->getShadowCasterVertexProgramParameters()); 
    3089                                 } 
    3090                                 // Also have to hack the light autoparams, that is done later 
    3091                         } 
    3092                         else if (mShadowCasterPlainBlackPass->hasVertexProgram()) 
    3093                         { 
    3094                                 // reset 
    3095                                 mShadowCasterPlainBlackPass->setVertexProgram(""); 
    3096                         } 
    3097                         return mShadowCasterPlainBlackPass; 
    3098                 } 
     3154                return retPass; 
    30993155    default: 
    31003156        return pass; 
     
    33013357        { 
    33023358        ShadowCaster* caster = *si; 
    3303                 bool zfailAlgo = false; 
     3359                bool zfailAlgo = camera->isCustomNearClipPlaneEnabled(); 
    33043360                unsigned long flags = 0; 
    33053361 
     
    37053761 
    37063762    // destroy existing 
    3707     ShadowTextureList::iterator i, iend; 
    3708     iend = mShadowTextures.end(); 
    3709     for (i = mShadowTextures.begin(); i != iend; ++i) 
    3710     { 
    3711         RenderTexture* r = *i; 
    3712         // remove camera and destroy texture 
    3713         removeCamera(r->getViewport(0)->getCamera()); 
    3714         mDestRenderSystem->destroyRenderTexture(r->getName()); 
    3715     } 
    3716     mShadowTextures.clear(); 
     3763        destroyShadowTextures(); 
    37173764 
    37183765    // Recreate shadow textures 
     
    37623809 
    37633810    } 
     3811} 
     3812//--------------------------------------------------------------------- 
     3813void SceneManager::destroyShadowTextures(void) 
     3814{ 
     3815    ShadowTextureList::iterator i, iend; 
     3816    iend = mShadowTextures.end(); 
     3817    for (i = mShadowTextures.begin(); i != iend; ++i) 
     3818    { 
     3819        RenderTexture* r = *i; 
     3820        // remove camera and destroy texture 
     3821        removeCamera(r->getViewport(0)->getCamera()); 
     3822        mDestRenderSystem->destroyRenderTexture(r->getName()); 
     3823    } 
     3824    mShadowTextures.clear(); 
    37643825} 
    37653826//--------------------------------------------------------------------- 
  • OGRE/trunk/ogre_changes/OgreMain/src/OgreSceneNode.cpp

    r158 r657  
    296296            { 
    297297                SceneNode* sceneChild = static_cast<SceneNode*>(child->second); 
    298                 sceneChild->_findVisibleObjects(cam, queue, includeChildren, displayNodes); 
     298                sceneChild->_findVisibleObjects(cam, queue, includeChildren,  
     299                                        displayNodes, onlyShadowCasters); 
    299300            } 
    300301        } 
     
    391392        ChildNodeMap::iterator i, iend; 
    392393        iend = mChildren.end(); 
    393         for (i = mChildren.begin(); i != iend; ++i) 
     394        for (i = mChildren.begin(); i != iend;) 
    394395        { 
    395396            SceneNode* sn = static_cast<SceneNode*>(i->second); 
     397                        // increment iterator before destroying (iterator invalidated by  
     398                        // SceneManager::destroySceneNode because it causes removal from parent) 
     399                        ++i; 
    396400            sn->removeAndDestroyAllChildren(); 
    397401            sn->getCreator()->destroySceneNode(sn->getName()); 
     
    482486        if (vec == Vector3::ZERO) return; 
    483487 
    484         // Adjust vector so that it is relative to local Z 
    485         Vector3 zAdjustVec; 
    486         if (localDirectionVector == Vector3::NEGATIVE_UNIT_Z) 
    487         { 
    488             zAdjustVec = -vec; 
    489         } 
    490         else 
    491         { 
    492             Quaternion localToUnitZ = localDirectionVector.getRotationTo(Vector3::UNIT_Z); 
    493             zAdjustVec = localToUnitZ * vec; 
    494         } 
    495         zAdjustVec.normalise(); 
    496  
     488        // The direction we want the local direction point to 
     489        Vector3 targetDir = vec.normalisedCopy(); 
     490 
     491        // Transform target direction to world space 
     492        switch (relativeTo) 
     493        { 
     494        case TS_PARENT: 
     495            if (mParent) 
     496                targetDir = mParent->_getDerivedOrientation() * targetDir; 
     497            break; 
     498        case TS_LOCAL: 
     499            targetDir = _getDerivedOrientation() * targetDir; 
     500            break; 
     501        } 
     502 
     503        // Calculate target orientation relative to world space 
    497504        Quaternion targetOrientation; 
    498505        if( mYawFixed ) 
    499506        { 
    500             Vector3 xVec = mYawFixedAxis.crossProduct( zAdjustVec ); 
     507            // Calculate the quaternion for rotate local Z to target direction 
     508            Vector3 xVec = mYawFixedAxis.crossProduct(targetDir); 
    501509            xVec.normalise(); 
    502  
    503             Vector3 yVec = zAdjustVec.crossProduct( xVec ); 
     510            Vector3 yVec = targetDir.crossProduct(xVec); 
    504511            yVec.normalise(); 
     512            Quaternion unitZToTarget = Quaternion(xVec, yVec, targetDir); 
    505513             
    506             targetOrientation.FromAxes( xVec, yVec, zAdjustVec ); 
     514            if (localDirectionVector == Vector3::NEGATIVE_UNIT_Z) 
     515            { 
     516                // Specail case for avoid calculate 180 degree turn 
     517                targetOrientation = 
     518                    Quaternion(-unitZToTarget.y, -unitZToTarget.z, unitZToTarget.w, unitZToTarget.x); 
    507519        } 
    508520        else 
    509521        { 
    510  
    511             // Get axes from current quaternion 
    512             Vector3 axes[3]; 
    513             _getDerivedOrientation().ToAxes(axes); 
    514             Quaternion rotQuat; 
    515             if ( (axes[2]+zAdjustVec).squaredLength() <  0.00005f) 
     522                // Calculate the quaternion for rotate local direction to target direction 
     523                Quaternion localToUnitZ = localDirectionVector.getRotationTo(Vector3::UNIT_Z); 
     524                targetOrientation = unitZToTarget * localToUnitZ; 
     525            } 
     526            } 
     527            else 
    516528            { 
     529            const Quaternion& currentOrient = _getDerivedOrientation(); 
     530 
     531            // Get current local direction relative to world space 
     532            Vector3 currentDir = currentOrient * localDirectionVector; 
     533 
     534            if ((currentDir+targetDir).squaredLength() < 0.00005f) 
     535        { 
    517536                // Oops, a 180 degree turn (infinite possible rotation axes) 
    518537                // Default to yaw i.e. use current UP 
    519                 rotQuat.FromAngleAxis(Radian(Math::PI), axes[1]); 
    520             } 
    521             else 
    522             { 
     538                targetOrientation = 
     539                    Quaternion(-currentOrient.y, -currentOrient.z, currentOrient.w, currentOrient.x); 
     540        } 
     541        else 
     542        { 
    523543                // Derive shortest arc to new direction 
    524                 rotQuat = axes[2].getRotationTo(zAdjustVec); 
    525  
    526             } 
    527             targetOrientation = rotQuat * mOrientation; 
    528         } 
    529  
    530         if (relativeTo == TS_LOCAL || !mParent) 
    531         { 
     544                Quaternion rotQuat = currentDir.getRotationTo(targetDir); 
     545                targetOrientation = rotQuat * currentOrient; 
     546            } 
     547        } 
     548 
     549        // Set target orientation, transformed to parent space 
     550        if (mParent) 
     551            setOrientation(mParent->_getDerivedOrientation().UnitInverse() * targetOrientation); 
     552        else 
    532553            setOrientation(targetOrientation); 
    533         } 
    534         else 
    535         { 
    536             if (relativeTo == TS_PARENT) 
    537             { 
    538                 setOrientation(targetOrientation * mParent->getOrientation().Inverse()); 
    539             } 
    540             else if (relativeTo == TS_WORLD) 
    541             { 
    542                 setOrientation(targetOrientation * mParent->_getDerivedOrientation().Inverse()); 
    543             } 
    544         } 
    545  
    546  
    547554    } 
    548555    //----------------------------------------------------------------------- 
     
    550557        const Vector3& localDirectionVector) 
    551558    { 
    552         this->setDirection(targetPoint - _getDerivedPosition(), relativeTo,  
    553             localDirectionVector); 
     559        // Calculate ourself origin relative to the given transform space 
     560        Vector3 origin; 
     561        switch (relativeTo) 
     562        { 
     563        default:    // Just in case 
     564        case TS_WORLD: 
     565            origin = _getDerivedPosition(); 
     566            break; 
     567        case TS_PARENT: 
     568            origin = mPosition; 
     569            break; 
     570        case TS_LOCAL: 
     571            origin = Vector3::ZERO; 
     572            break; 
     573        } 
     574 
     575        setDirection(targetPoint - origin, relativeTo, localDirectionVector); 
    554576    } 
    555577    //----------------------------------------------------------------------- 
  • OGRE/trunk/ogre_changes/Plugins/OctreeSceneManager/include/OgreTerrainRenderable.h

    r316 r657  
    290290 
    291291        /** Overridden from MovableObject */ 
    292         Real getBoundingRadius(void) const { return 0; /* not needed */ } 
     292        Real getBoundingRadius(void) const { return mBoundingRadius; } 
    293293 
    294294        /** @copydoc Renderable::getLights */ 
     
    383383        /// Connection to tiles four neighbours 
    384384        TerrainRenderable *mNeighbors [ 4 ]; 
     385        /// Whether light list need to re-calculate 
     386        mutable bool mLightListDirty; 
     387        /// Cached light list 
     388        mutable LightList mLightList; 
     389        /// The bounding radius of this tile 
     390        Real mBoundingRadius; 
    385391        /// Bounding box of this tile 
    386392        AxisAlignedBox mBounds; 
  • OGRE/trunk/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeSceneManager.cpp

    r318 r657  
    536536SceneNode * OctreeSceneManager::createSceneNode( const String &name ) 
    537537{ 
     538    // Check name not used 
     539    if (mSceneNodes.find(name) != mSceneNodes.end()) 
     540    { 
     541        OGRE_EXCEPT( 
     542            Exception::ERR_DUPLICATE_ITEM, 
     543            "A scene node with the name " + name + " already exists", 
     544            "OctreeSceneManager::createSceneNode" ); 
     545    } 
    538546    OctreeNode * on = new OctreeNode( this, name ); 
    539547    mSceneNodes[ on->getName() ] = on; 
     
    548556void OctreeSceneManager::_alertVisibleObjects( void ) 
    549557{ 
     558    OGRE_EXCEPT( Exception::UNIMPLEMENTED_FEATURE, 
     559        "Function doesn't do as advertised", 
     560        "OctreeSceneManager::_alertVisibleObjects" ); 
     561 
    550562    NodeList::iterator it = mVisible.begin(); 
    551563 
     
    570582 
    571583        if ( c != 0 ) 
    572             cam = getCamera( "CullCamera" ); 
     584            cam = c; 
    573585    } 
    574586 
     
    680692        } 
    681693 
    682         if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 ) 
    683             walkOctree( camera, queue, octant -> mChildren[ 0 ][ 0 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
    684  
    685         if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 ) 
    686             walkOctree( camera, queue, octant -> mChildren[ 1 ][ 0 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
    687  
    688         if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 ) 
    689             walkOctree( camera, queue, octant -> mChildren[ 0 ][ 1 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
    690  
    691         if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 ) 
    692             walkOctree( camera, queue, octant -> mChildren[ 1 ][ 1 ][ 0 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
    693  
    694         if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 ) 
    695             walkOctree( camera, queue, octant -> mChildren[ 0 ][ 0 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
    696  
    697         if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 ) 
    698             walkOctree( camera, queue, octant -> mChildren[ 1 ][ 0 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
    699  
    700         if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 ) 
    701             walkOctree( camera, queue, octant -> mChildren[ 0 ][ 1 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
    702  
    703         if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 ) 
    704             walkOctree( camera, queue, octant -> mChildren[ 1 ][ 1 ][ 1 ], ( v == OctreeCamera::FULL ), onlyShadowCasters ); 
     694        Octree* child; 
     695        bool childfoundvisible = (v == OctreeCamera::FULL); 
     696        if ( (child = octant -> mChildren[ 0 ][ 0 ][ 0 ]) != 0 ) 
     697            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
     698 
     699        if ( (child = octant -> mChildren[ 1 ][ 0 ][ 0 ]) != 0 ) 
     700            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
     701 
     702        if ( (child = octant -> mChildren[ 0 ][ 1 ][ 0 ]) != 0 ) 
     703            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
     704 
     705        if ( (child = octant -> mChildren[ 1 ][ 1 ][ 0 ]) != 0 ) 
     706            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
     707 
     708        if ( (child = octant -> mChildren[ 0 ][ 0 ][ 1 ]) != 0 ) 
     709            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
     710 
     711        if ( (child = octant -> mChildren[ 1 ][ 0 ][ 1 ]) != 0 ) 
     712            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
     713 
     714        if ( (child = octant -> mChildren[ 0 ][ 1 ][ 1 ]) != 0 ) 
     715            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
     716 
     717        if ( (child = octant -> mChildren[ 1 ][ 1 ][ 1 ]) != 0 ) 
     718            walkOctree( camera, queue, child, childfoundvisible, onlyShadowCasters ); 
    705719 
    706720    } 
     
    754768        } 
    755769 
    756  
    757  
    758         if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 ) 
    759                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] ); 
    760  
    761         if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 ) 
    762                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] ); 
    763  
    764         if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 ) 
    765                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] ); 
    766  
    767         if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 ) 
    768                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] ); 
    769  
    770         if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 ) 
    771                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] ); 
    772  
    773         if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 ) 
    774                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] ); 
    775  
    776         if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 ) 
    777                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] ); 
    778  
    779         if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 ) 
    780                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] ); 
     770        Octree* child; 
     771 
     772        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 0 ]) != 0 ) 
     773                _findNodes( t, list, exclude, full, child ); 
     774 
     775        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 0 ]) != 0 ) 
     776                _findNodes( t, list, exclude, full, child ); 
     777 
     778        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 0 ]) != 0 ) 
     779                _findNodes( t, list, exclude, full, child ); 
     780 
     781        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 0 ]) != 0 ) 
     782                _findNodes( t, list, exclude, full, child ); 
     783 
     784        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 1 ]) != 0 ) 
     785                _findNodes( t, list, exclude, full, child ); 
     786 
     787        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 1 ]) != 0 ) 
     788                _findNodes( t, list, exclude, full, child ); 
     789 
     790        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 1 ]) != 0 ) 
     791                _findNodes( t, list, exclude, full, child ); 
     792 
     793        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 1 ]) != 0 ) 
     794                _findNodes( t, list, exclude, full, child ); 
    781795 
    782796} 
     
    827841        } 
    828842 
    829  
    830  
    831         if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 ) 
    832                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] ); 
    833  
    834         if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 ) 
    835                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] ); 
    836  
    837         if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 ) 
    838                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] ); 
    839  
    840         if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 ) 
    841                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] ); 
    842  
    843         if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 ) 
    844                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] ); 
    845  
    846         if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 ) 
    847                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] ); 
    848  
    849         if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 ) 
    850                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] ); 
    851  
    852         if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 ) 
    853                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] ); 
     843        Octree* child; 
     844 
     845        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 0 ]) != 0 ) 
     846                _findNodes( t, list, exclude, full, child ); 
     847 
     848        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 0 ]) != 0 ) 
     849                _findNodes( t, list, exclude, full, child ); 
     850 
     851        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 0 ]) != 0 ) 
     852                _findNodes( t, list, exclude, full, child ); 
     853 
     854        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 0 ]) != 0 ) 
     855                _findNodes( t, list, exclude, full, child ); 
     856 
     857        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 1 ]) != 0 ) 
     858                _findNodes( t, list, exclude, full, child ); 
     859 
     860        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 1 ]) != 0 ) 
     861                _findNodes( t, list, exclude, full, child ); 
     862 
     863        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 1 ]) != 0 ) 
     864                _findNodes( t, list, exclude, full, child ); 
     865 
     866        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 1 ]) != 0 ) 
     867                _findNodes( t, list, exclude, full, child ); 
    854868 
    855869} 
     
    901915        } 
    902916 
    903  
    904  
    905         if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 ) 
    906                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] ); 
    907  
    908         if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 ) 
    909                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] ); 
    910  
    911         if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 ) 
    912                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] ); 
    913  
    914         if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 ) 
    915                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] ); 
    916  
    917         if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 ) 
    918                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] ); 
    919  
    920         if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 ) 
    921                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] ); 
    922  
    923         if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 ) 
    924                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] ); 
    925  
    926         if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 ) 
    927                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] ); 
     917        Octree* child; 
     918 
     919        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 0 ]) != 0 ) 
     920                _findNodes( t, list, exclude, full, child ); 
     921 
     922        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 0 ]) != 0 ) 
     923                _findNodes( t, list, exclude, full, child ); 
     924 
     925        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 0 ]) != 0 ) 
     926                _findNodes( t, list, exclude, full, child ); 
     927 
     928        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 0 ]) != 0 ) 
     929                _findNodes( t, list, exclude, full, child ); 
     930 
     931        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 1 ]) != 0 ) 
     932                _findNodes( t, list, exclude, full, child ); 
     933 
     934        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 1 ]) != 0 ) 
     935                _findNodes( t, list, exclude, full, child ); 
     936 
     937        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 1 ]) != 0 ) 
     938                _findNodes( t, list, exclude, full, child ); 
     939 
     940        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 1 ]) != 0 ) 
     941                _findNodes( t, list, exclude, full, child ); 
    928942 
    929943} 
     
    974988        } 
    975989 
    976  
    977  
    978         if ( octant -> mChildren[ 0 ][ 0 ][ 0 ] != 0 ) 
    979                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 0 ] ); 
    980  
    981         if ( octant -> mChildren[ 1 ][ 0 ][ 0 ] != 0 ) 
    982                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 0 ] ); 
    983  
    984         if ( octant -> mChildren[ 0 ][ 1 ][ 0 ] != 0 ) 
    985                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 0 ] ); 
    986  
    987         if ( octant -> mChildren[ 1 ][ 1 ][ 0 ] != 0 ) 
    988                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 0 ] ); 
    989  
    990         if ( octant -> mChildren[ 0 ][ 0 ][ 1 ] != 0 ) 
    991                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 0 ][ 1 ] ); 
    992  
    993         if ( octant -> mChildren[ 1 ][ 0 ][ 1 ] != 0 ) 
    994                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 0 ][ 1 ] ); 
    995  
    996         if ( octant -> mChildren[ 0 ][ 1 ][ 1 ] != 0 ) 
    997                 _findNodes( t, list, exclude, full, octant -> mChildren[ 0 ][ 1 ][ 1 ] ); 
    998  
    999         if ( octant -> mChildren[ 1 ][ 1 ][ 1 ] != 0 ) 
    1000                 _findNodes( t, list, exclude, full, octant -> mChildren[ 1 ][ 1 ][ 1 ] ); 
     990        Octree* child; 
     991 
     992        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 0 ]) != 0 ) 
     993                _findNodes( t, list, exclude, full, child ); 
     994 
     995        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 0 ]) != 0 ) 
     996                _findNodes( t, list, exclude, full, child ); 
     997 
     998        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 0 ]) != 0 ) 
     999                _findNodes( t, list, exclude, full, child ); 
     1000 
     1001        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 0 ]) != 0 ) 
     1002                _findNodes( t, list, exclude, full, child ); 
     1003 
     1004        if ( (child=octant -> mChildren[ 0 ][ 0 ][ 1 ]) != 0 ) 
     1005                _findNodes( t, list, exclude, full, child ); 
     1006 
     1007        if ( (child=octant -> mChildren[ 1 ][ 0 ][ 1 ]) != 0 ) 
     1008                _findNodes( t, list, exclude, full, child ); 
     1009 
     1010        if ( (child=octant -> mChildren[ 0 ][ 1 ][ 1 ]) != 0 ) 
     1011                _findNodes( t, list, exclude, full, child ); 
     1012 
     1013        if ( (child=octant -> mChildren[ 1 ][ 1 ][ 1 ]) != 0 ) 
     1014                _findNodes( t, list, exclude, full, child ); 
    10011015 
    10021016} 
     
    10381052 
    10391053    mOctree->mBox = box; 
     1054 
     1055        const Vector3 min = box.getMinimum(); 
     1056        const Vector3 max = box.getMaximum(); 
     1057        mOctree->mHalfSize = ( max - min ) * 0.5f; 
    10401058 
    10411059    it = nodes.begin(); 
  • OGRE/trunk/ogre_changes/Plugins/OctreeSceneManager/src/OgreTerrainRenderable.cpp

    r193 r657  
    7777 
    7878        mInit = false; 
     79        mLightListDirty = true; 
    7980                MovableObject::mCastShadows = false; 
    8081 
     
    251252            ( startz * msOptions->scale.z + (endz - 1) * msOptions->scale.z ) / 2 ); 
    252253 
     254        mBoundingRadius = 
     255            std::max(max - min, 
     256                std::max((endx - 1 - startx) * msOptions->scale.x, 
     257                         (endz - 1 - startz) * msOptions->scale.z)) / 2; 
     258 
    253259        // Create delta buffer list if required to morph 
    254260        if (msOptions->lodMorph) 
     
    344350 
    345351                Vector3 cpos = cam -> getDerivedPosition(); 
    346         Vector3 diff = mCenter - cpos; 
     352        const AxisAlignedBox& aabb = getWorldBoundingBox(true); 
     353        Vector3 diff(0, 0, 0); 
     354        diff.makeFloor(cpos - aabb.getMinimum()); 
     355        diff.makeCeil(cpos - aabb.getMaximum()); 
    347356 
    348357        Real L = diff.squaredLength(); 
     
    443452    void TerrainRenderable::_updateRenderQueue( RenderQueue* queue ) 
    444453    { 
     454        // Notify need to calculate light list when our sending to render queue 
     455        mLightListDirty = true; 
     456 
    445457        queue->addRenderable( this ); 
    446458    } 
     
    9941006    const LightList& TerrainRenderable::getLights(void) const 
    9951007    { 
    996         return getParentSceneNode()->findLights(this->getBoundingRadius()); 
     1008        if (mLightListDirty) 
     1009        { 
     1010            getParentSceneNode()->getCreator()->_populateLightList( 
     1011                mCenter, this->getBoundingRadius(), mLightList); 
     1012            mLightListDirty = false; 
     1013        } 
     1014        return mLightList; 
    9971015    } 
    9981016    //----------------------------------------------------------------------- 
  • OGRE/trunk/ogre_changes/RenderSystems/Direct3D7/include/OgreD3D7RenderWindow.h

    r153 r657  
    119119        */ 
    120120        void writeContentsToFile(const String& filename); 
    121  
     121        // DirectDraw Methods 
     122                void createDDSurfaces(void); 
     123                void releaseDDSurfaces(void); 
     124                void restoreDDSurfaces(void); 
     125                void createDepthBuffer(void); 
    122126#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    123127                uchar *getBufferContents(int &dimx, int &dimy); 
     
    159163        LPDIRECT3DDEVICE7 mlpD3DDevice; 
    160164 
    161         // DirectDraw Methods 
    162         void createDDSurfaces(void); 
    163         void releaseDDSurfaces(void); 
    164         void restoreDDSurfaces(void); 
    165         void createDepthBuffer(void); 
    166165 
    167166        // Method for dealing with resize / move & 3d library 
  • OGRE/trunk/ogre_changes/RenderSystems/Direct3D7/include/OgreD3D7Texture.h

    r154 r657  
    5353        LPDIRECTDRAWSURFACE7 getDDSurface(void); 
    5454 
    55         /// @copydoc Texture::createInternalResources 
    56         void createInternalResources(void); 
    57  
    5855                /// @copydoc Texture::getBuffer 
    5956                HardwarePixelBufferSharedPtr getBuffer(size_t face, size_t mipmap); 
     
    6360                static PixelFormat closestD3DXFormat( PixelFormat format ); 
    6461                static bool OgreFormat_to_DDPixelFormat( PixelFormat format, DDPIXELFORMAT & out ); 
     62 
     63                /// Restore this texture from a lost device 
     64                void restoreFromLostDevice(void); 
     65 
    6566    protected: 
    6667        IDirect3DDevice7 * mD3DDevice;       ///< A pointer to the Direct3D device. 
     
    7172                typedef std::vector<HardwarePixelBufferSharedPtr> SurfaceList; 
    7273                SurfaceList                                             mSurfaceList; 
     74                /// Are we restoring from a lost device? 
     75                bool mRestoring; 
     76 
    7377         
    7478 
    7579        /// @copydoc Resource::loadImpl 
    7680        void loadImpl(void); 
    77         /// @copydoc Resource::unloadImpl 
    78         void unloadImpl(void); 
     81                /// @copydoc Texture::createInternalResourcesImpl 
     82                void createInternalResourcesImpl(void); 
     83        /// @copydoc Resource::freeInternalResourcesImpl 
     84        void freeInternalResourcesImpl(void); 
    7985                 
    8086                void createSurface2D(void); 
  • OGRE/trunk/ogre_changes/RenderSystems/Direct3D7/src/OgreD3D7RenderWindow.cpp

    r153 r657  
    9696                break; 
    9797 
    98             case WM_MOVE: 
    99                 // Move messages need to be tracked to update the screen rects 
    100                 // used for blitting the backbuffer to the primary. 
    101                 if(win->mActive && win->mReady) 
    102                     win->windowMovedOrResized(); 
    103                 break; 
    104  
    10598            case WM_ENTERSIZEMOVE: 
    10699                // Prevent rendering while moving / sizing 
     
    113106                break; 
    114107 
     108            case WM_MOVE: 
    115109            case WM_SIZE: 
    116110                // Check to see if we are losing or gaining our window. Set the 
     
    391385    void D3D7RenderWindow::swapBuffers(bool waitForVSync) 
    392386    { 
     387                if (!mlpDDSFront) 
     388                        return; 
     389 
    393390        HRESULT hr; 
    394391        DWORD flags; 
     
    423420            { 
    424421                // Restore surfaces 
    425                 restoreDDSurfaces(); 
     422                //restoreDDSurfaces(); 
    426423            } 
    427424            else if (FAILED(hr)) 
     
    539536        ddscaps.dwCaps = DDSCAPS_ZBUFFER; 
    540537 
     538                if (!mlpDDSBack->IsLost()) 
     539                { 
    541540        LPDIRECTDRAWSURFACE7 zBufSurface; 
    542541 
     
    546545        zBufSurface->Release(); 
    547546        zBufSurface->Release(); 
     547                } 
    548548 
    549549        // Release std buffers 
     
    563563 
    564564            if( FAILED( hr ) ) 
     565                        { 
     566                                if (hr == DDERR_WRONGMODE) 
     567                                { 
     568                                        // Fullscreen exclusive mode problem 
     569                                        // Need to release & recreate 
     570                                        releaseDDSurfaces(); 
     571                                        createDDSurfaces(); 
     572                                        createDepthBuffer(); 
     573                                        return; 
     574                                } 
     575                                else 
     576                                { 
     577                                        char szBuffer[512]; 
     578                                        D3DXGetErrorString( hr, 512, szBuffer ); 
    565579                OGRE_EXCEPT(  
    566580                    Exception::ERR_INTERNAL_ERROR,  
    567                     "Error restoring lost primary surface.",  
     581                                                "Error restoring lost primary surface." + String(szBuffer),  
    568582                    "D3D7RenderWindow - restoreDDSurfaces" ); 
    569583        } 
     584                        } 
     585        } 
    570586 
    571587        if( mlpDDSBack->IsLost() ) 
     
    574590 
    575591            if( FAILED( hr ) ) 
     592                        { 
     593                                char szBuffer[512]; 
     594                                D3DXGetErrorString( hr, 512, szBuffer ); 
    576595                OGRE_EXCEPT(  
    577596                    Exception::ERR_INTERNAL_ERROR,  
    578                     "Error restoring lost back buffer surface.",  
     597                    "Error restoring lost back buffer surface." + String(szBuffer),  
    579598                    "D3D7RenderWindow - restoreDDSurfaces" ); 
    580599        } 
     600    } 
    581601    } 
    582602 
     
    592612        ClientToScreen( mHWnd, (POINT*)&rcCheck.left ); 
    593613        ClientToScreen( mHWnd, (POINT*)&rcCheck.right ); 
     614 
     615                if ((rcCheck.right - rcCheck.left) == 0 || 
     616                        (rcCheck.bottom - rcCheck.top) == 0) 
     617                { 
     618                        return; 
     619                } 
    594620 
    595621        // Has the window resized? If so, we need to recreate surfaces 
  • OGRE/trunk/ogre_changes/RenderSystems/Direct3D9/include/OgreD3D9HardwareOcclusionQuery.h

    r115 r657  
    3434 
    3535// If you use multiple rendering passes you can test only the first pass and all other passes don't have to be rendered  
    36         // if the first pass resultet has too few pixels visible. 
     36        // if the first pass results has too few pixels visible. 
    3737 
    38 // Be sure to render all occlluder first and whats out so the RenderQue don't switch places on  
     38        // Be sure to render all occluder first and whats out so the RenderQue don't switch places on  
    3939// the occluding objects and the tested objects because it thinks it's more effective.. 
    4040 
     
    4646        * 
    4747        * Updated on 12/7/2004 by Chris McGuirk 
     48        * Updated on 4/8/2005 by Tuan Kuranes email: tuan.kuranes@free.fr 
    4849  */ 
    4950class D3D9HardwareOcclusionQuery : public HardwareOcclusionQuery 
     
    7374                bool pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag = HWOCCLUSIONQUERY_FLUSH); 
    7475                unsigned int getLastQuerysPixelcount() { return mPixelCount; } 
     76        bool isStillOutstanding(void); 
    7577 
    7678                // These functions are optional, it's a simple filter that simply skips some hardware occlusion tests on visible objects only 
     
    8284          *    
    8385                * Remarks This function allows you to set how often the hardware occlusion query is sent to the driver 
    84           * if you set it to 0 every hw occlusion test is acctually made. If you set it to 1 only the half of your queries are sent  
    85                 * 2 will result in 25% of all queries to acctualy be sent.  
     86                * if you set it to 0 every hardware occlusion test is actually made. If you set it to 1 only the half of your queries are sent  
     87                * 2 will result in 25% of all queries to factually be sent.  
    8688                * This functionality is here because this class can keep track on visible and none visible objects for you. 
    8789          * Once you you set the SkipRate for any hardware occlusion instance it effects all others. 
    8890          */ 
    8991 
    90                 void setSkipRate( int skip ) { mSkipInterval = skip; }                  // Using 2 only 50 % of the tests are actully made and 3 results in only 33% of the tests. So on. 
     92                void setSkipRate( int skip ) { mSkipInterval = skip; }                  // Using 2 only 50 % of the tests are actually made and 3 results in only 33% of the tests. So on. 
    9193                int      getSkipRate() { return mSkipInterval; }  
    9294 
     
    105107                int                                     mSkipInterval; 
    106108                bool                            mHasOcclusionSupport; 
     109                bool                            mIsQueryResultStillOutstanding; 
    107110}; 
    108111 
  • OGRE/trunk/ogre_changes/RenderSystems/Direct3D9/include/OgreD3D9Texture.h

    r193 r657  
    6868                /// device capabilities pointer 
    6969                D3DCAPS9                                                mDevCaps; 
    70         // Auto-generated mipmaps? 
    71         bool                            mAutoGenMipmaps; 
    7270                // Dynamic textures? 
    7371                bool                            mDynamicTextures; 
     
    9593                D3DFORMAT _chooseD3DFormat(); 
    9694 
    97                 /// internal method, free D3D9 resources 
    98                 void _freeResources(); 
     95                /// @copydoc Texture::createInternalResourcesImpl 
     96                void createInternalResourcesImpl(void); 
     97                /// free internal resources 
     98                void freeInternalResourcesImpl(void); 
    9999                /// internal method, set Texture class source image protected attributes 
    100100                void _setSrcAttributes(unsigned long width, unsigned long height, unsigned long depth, PixelFormat format); 
     
    116116                /// internal method, create D3D9HardwarePixelBuffers for every face and 
    117117                /// mipmap level. This method must be called after the D3D texture object was created 
    118                 void _createSurfaceList(bool updateOldList=false); 
     118                void _createSurfaceList(void); 
    119119 
    120120        /// overriden from Resource 
    121121        void loadImpl(); 
    122         /// overriden from Resource 
    123         void unloadImpl(); 
    124122        public: 
    125123                /// constructor  
     
    135133                void loadImage( const Image &img ); 
    136134 
    137         /// @copydoc Texture::createInternalResources 
    138         void createInternalResources(void); 
    139135 
    140136                /// @copydoc Texture::getBuffer 
  • OGRE/trunk/ogre_changes/RenderSystems/Direct3D9/src/OgreD3D9HardwareOcclusionQuery.cpp

    r193 r657  
    113113        // This version of pullOcclusionQuery causes the DX9 API/Driver to not flush all commands to the 3D card 
    114114// to allow a fast result from the query, but the batching of API calls to the card will be normal.  
    115         // But the query wont be processed until the card recives the query in the next batch. 
     115        // But the query wont be processed until the card receives the query in the next batch. 
    116116// Note: OpenGL dosn't use this flag at all so the application running OpenGL won't display any different behaviour. 
    117117//-- 
  • OGRE/trunk/ogre_changes/RenderSystems/Direct3D9/src/OgreD3D9RenderWindow.cpp

    r193 r657  
    110110        D3D9RenderWindow::~D3D9RenderWindow() 
    111111        { 
    112                 // access and update device through driver, realse only primary 
    113                 if (!mIsSwapChain)  
    114                 { 
    115                         LPDIRECT3DDEVICE9 mpD3DDevice = mDriver->getD3DDevice(); 
    116                         SAFE_RELEASE( mpD3DDevice ); 
    117                         mDriver->setD3DDevice( NULL ); 
    118                 } 
     112                destroyD3DResources(); 
    119113        } 
    120114 
     
    342336                md3dpp.BackBufferHeight                 = mHeight; 
    343337 
    344 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    345         //md3dpp.Flags |= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; 
    346 #endif 
    347338                if (mVSync) 
    348339                        md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; 
     
    493484                        // ignore depth buffer, access device through driver 
    494485                        mpRenderZBuffer = 0; 
    495                         LPDIRECT3DDEVICE9 mpD3DDevice = mDriver->getD3DDevice(); 
    496                         SAFE_RELEASE(mpD3DDevice); 
    497                         mDriver->setD3DDevice(NULL); 
    498486                } 
    499487        } 
     
    727715                } 
    728716 
    729                 if (!mIsFullScreen) 
    730                 { 
    731                         POINT pt={0, 0}; 
     717                D3DLOCKED_RECT lockedRect; 
     718                if(mIsFullScreen) 
     719                { 
     720                        if (FAILED(hr = pTempSurf->LockRect(&lockedRect, NULL,  
     721                        D3DLOCK_READONLY | D3DLOCK_NOSYSLOCK))) 
     722                        { 
     723                                OGRE_EXCEPT(hr, "can't lock rect!", "D3D9RenderWindow::writeContentsToFile"); 
     724                        }  
     725                } 
     726                else 
     727                { 
    732728                        RECT srcRect; 
    733729                        GetWindowRect(mHWnd, &srcRect); 
     
    735731                        desc.Width = srcRect.right - srcRect.left; 
    736732                        desc.Height = srcRect.bottom - srcRect.top; 
    737                         desc.Format = D3DFMT_A8R8G8B8;         // this is what we get from the screen, so stick with it 
    738  
    739                         // NB we can't lock the back buffer direct because it's no created that way 
    740                         // and to do so hits performance, so copy to another surface 
    741                         // Must be the same format as the source surface 
    742                         if (FAILED(hr = mpD3DDevice->CreateOffscreenPlainSurface( 
    743                                                         desc.Width,  
    744                                                         desc.Height,  
    745                                                         desc.Format,  
    746                                                         D3DPOOL_DEFAULT,  
    747                                                         &pSurf, 
    748                                                         NULL))) 
    749                         { 
    750                                 SAFE_RELEASE(pSurf); 
    751                                 OGRE_EXCEPT(hr, "Cannot create offscreen buffer 2!", "D3D9RenderWindow::writeContentsToFile"); 
    752                         } 
    753  
    754                         // Copy 
    755                         if (FAILED(hr = mpD3DDevice->UpdateSurface(pTempSurf, &srcRect, pSurf, &pt))) 
    756                         { 
    757                                 SAFE_RELEASE(pTempSurf); 
    758                                 SAFE_RELEASE(pSurf); 
    759                                 OGRE_EXCEPT(hr, "Cannot update surface!", "D3D9RenderWindow::writeContentsToFile"); 
    760                         } 
    761  
    762                         SAFE_RELEASE(pTempSurf); 
    763                         pTempSurf = pSurf; 
    764                         pSurf = NULL; 
    765                 } 
    766  
    767                 D3DLOCKED_RECT lockedRect; 
    768                 if (FAILED(hr = pTempSurf->LockRect(&lockedRect, NULL,  
     733 
     734                        if (FAILED(hr = pTempSurf->LockRect(&lockedRect, &srcRect,  
     735 
    769736                        D3DLOCK_READONLY | D3DLOCK_NOSYSLOCK))) 
    770737                { 
    771738                        OGRE_EXCEPT(hr, "can't lock rect!", "D3D9RenderWindow::writeContentsToFile"); 
    772739                }  
     740                } 
    773741 
    774742        ImageCodec::ImageData *imgData = new ImageCodec::ImageData(); 
  • OGRE/trunk/ogre_changes/RenderSystems/GL/include/OgreGLHardwareOcclusionQuery.h

    r343 r657  
    5353 
    5454// If you use multiple rendering passes you can test only the first pass and all other passes don't have to be rendered  
    55 // if the first pass resultet has too few pixels visable. 
     55// if the first pass result has too few pixels visible. 
    5656 
    57 // Be sure to render all occlluder first and whats out so the RenderQue don't switch places on  
     57// Be sure to render all occluder first and whats out so the RenderQue don't switch places on  
    5858// the occluding objects and the tested objects because it thinks it's more effective.. 
    5959 
     
    6464  * 
    6565  * @author Lee Sandberg email: lee@abcmedia.se 
     66  * Updated on 4/8/2005 by Tuan Kuranes email: tuan.kuranes@free.fr 
    6667  */ 
    6768 
     
    9192        unsigned int getLastQuerysPixelcount() { return mPixelCount; } 
    9293 
    93         // This functions are optional, it's a simple filter that simply skipps some hardware occlusion tests on visable objects only 
    94         // It's easy to use if you don't have to keep track on which objects are visable (can be skipped) and what objects arn't visable.. 
    95         // (None visable objects and object you introduce for the first time have allways to be tested allthough the cheepest possible  
    96         // LOD (Level Of Detail) mesh and material wize).  
     94        // This functions are optional, it's a simple filter that simply skips some hardware occlusion tests on visible objects only 
     95        // It's easy to use if you don't have to keep track on which objects are visible (can be skipped) and what objects arn't visible.. 
     96        // (None visible objects and object you introduce for the first time have always to be tested although the cheapest possible  
     97        // LOD (Level Of Detail) mesh and material wise).  
    9798 
    9899        /** 
    99100          *    
    100101          * Remarks This function allows you to set how often the hardware occlusion really sent to the driver 
    101           * if you set it to 0 every hw occlusion test is acctually made. If you set it to 2 only 50% of your queries are sent.  
    102           * for all visable objects. 3 will result in 33% of all queries to acctualy be sent and so on.  
    103           * New and none visable objects will be tested all the time. 
    104           * This functionality is here because this class can keep track on visable and none visable objects for you. 
     102          * if you set it to 0 every hardware occlusion test is actually made. If you set it to 2 only 50% of your queries are sent.  
     103          * for all visible objects. 3 will result in 33% of all queries to actually be sent and so on.  
     104          * New and none visible objects will be tested all the time. 
     105          * This functionality is here because this class can keep track on visible and none visible objects for you. 
    105106          * Once you you set the SkipRate for any hardware occlusion instance it effects all others. 
    106107          */ 
    107108 
    108         void setSkipRate( int skip ) { mSkipInterval = skip; }          // Using 2 only 50 % of the tests are actully made and 3 results in only 33% of the tests. So on. 
     109        void setSkipRate( int skip ) { mSkipInterval = skip; }          // Using 2 only 50 % of the tests are actually made and 3 results in only 33% of the tests. So on. 
    109110        int      getSkipRate() { return mSkipInterval; }  
    110111 
  • OGRE/trunk/ogre_changes/RenderSystems/GL/include/OgreGLTexture.h

    r153 r657  
    4646        virtual ~GLTexture();       
    4747 
    48         /// @copydoc Texture::createInternalResources 
    49         void createInternalResources(void); 
    5048                void loadImage( const Image& img ); 
    5149        void createRenderTexture(); 
     
    6159 
    6260    protected: 
     61                /// @copydoc Texture::createInternalResourcesImpl 
     62                void createInternalResourcesImpl(void); 
    6363        /// @copydoc Resource::loadImpl 
    6464        void loadImpl(void); 
    65         /// @copydoc Resource::unloadImpl 
    66         void unloadImpl(void); 
     65        /// @copydoc Resource::freeInternalResourcesImpl 
     66        void freeInternalResourcesImpl(void); 
    6767 
    6868                /** internal method, create GLHardwarePixelBuffers for every face and 
  • OGRE/trunk/ogre_changes/RenderSystems/GL/src/OgreGLHardwareOcclusionQuery.cpp

    r343 r657  
    3838  * Updated on 12/7/2004 by Chris McGuirk 
    3939  * - Implemented ARB_occlusion_query 
     40  * Updated on 4/8/2005 by Tuan Kuranes email: tuan.kuranes@free.fr 
    4041  */ 
    4142 
     
    154155#endif // GTP_VIBILITY_MODIFIED_OGRE 
    155156} 
     157 
     158 
  • OGRE/trunk/ogre_changes/RenderSystems/GL/src/OgreGLRenderSystem.cpp

    r350 r657  
    257257            delete mTextureManager; 
    258258 
    259         delete mCapabilities; 
    260259        delete mGLSupport; 
    261260    } 
     
    894893            case Light::LT_SPOTLIGHT: 
    895894                glLightf( gl_index, GL_SPOT_CUTOFF, 0.5f * lt->getSpotlightOuterAngle().valueDegrees() ); 
     895                glLightf(gl_index, GL_SPOT_EXPONENT, lt->getSpotlightFalloff()); 
    896896                break; 
    897897            default: 
     
    10901090                        if(!tex.isNull()) 
    10911091                                glBindTexture( mTextureTypes[stage], tex->getGLID() ); 
    1092  
     1092                        else 
     1093                                glBindTexture( mTextureTypes[stage], static_cast<GLTextureManager*>(mTextureManager)->getWarningTextureID() ); 
    10931094        } 
    10941095        else 
     
    12381239 
    12391240            // Set scale and translation matrix for projective textures 
    1240             projectionBias = Matrix4::ZERO; 
    1241             projectionBias[0][0] = 0.5; projectionBias[1][1] = -0.5;  
    1242             projectionBias[2][2] = 1.0; projectionBias[0][3] = 0.5;  
    1243             projectionBias[1][3] = 0.5; projectionBias[3][3] = 1.0; 
     1241            projectionBias = Matrix4::CLIPSPACE2DTOIMAGESPACE; 
    12441242 
    12451243            projectionBias = projectionBias * frustum->getProjectionMatrix(); 
     
    12601258        switch(tam) 
    12611259        { 
     1260        default: 
    12621261        case TextureUnitState::TAM_WRAP: 
    12631262            type = GL_REPEAT; 
     
    12951294                        mat[12] = mat[8]; 
    12961295                        mat[13] = mat[9]; 
     1296            mat[8] = 0; 
     1297            mat[9] = 0; 
    12971298                } 
    12981299//        mat[14] = mat[10]; 
     
    13121313        glMatrixMode(GL_TEXTURE); 
    13131314 
     1315        // Load this matrix in 
     1316        glLoadMatrixf(mat); 
     1317 
    13141318        if (mUseAutoTextureMatrix) 
    13151319        { 
    1316             // Load auto matrix in 
    1317             glLoadMatrixf(mAutoTextureMatrix); 
    1318             // Concat new matrix 
    1319             glMultMatrixf(mat); 
    1320  
    1321         } 
    1322         else 
    1323         { 
    1324             // Just load this matrix 
    1325             glLoadMatrixf(mat); 
     1320            // Concat auto matrix 
     1321            glMultMatrixf(mAutoTextureMatrix); 
    13261322        } 
    13271323 
     
    14031399              h = vp->getActualHeight(); 
    14041400              x = vp->getActualLeft(); 
    1405               y = target->getHeight() - vp->getActualTop() - h; 
    1406    
     1401              y = vp->getActualTop(); 
     1402              if (!target->requiresTextureFlipping()) 
     1403              { 
     1404                  // Convert "upper-left" corner to "lower-left" 
     1405                  y = target->getHeight() - h - y; 
     1406              } 
    14071407              glViewport(x, y, w, h); 
    14081408   
     
    23442344            glDisableVertexAttribArrayARB_ptr(1); // disable weights 
    23452345        } 
    2346  
     2346        glColor4f(1,1,1,1); 
    23472347        glSecondaryColor3fEXT_ptr(0.0f, 0.0f, 0.0f); 
    23482348 
     
    24152415            const Plane& plane = clipPlanes[i]; 
    24162416 
    2417             if (i >= GL_MAX_CLIP_PLANES) 
     2417            if (i >= 6/*GL_MAX_CLIP_PLANES*/) 
    24182418            { 
    24192419                OGRE_EXCEPT(0, "Unable to set clip plane",  
     
    24242424            clipPlane[1] = plane.normal.y; 
    24252425            clipPlane[2] = plane.normal.z; 
    2426             clipPlane[3] = -plane.d; 
     2426            clipPlane[3] = plane.d; 
    24272427 
    24282428            glClipPlane(clipPlaneId, clipPlane); 
     
    24402440        size_t top, size_t right, size_t bottom) 
    24412441    { 
     2442        // If request texture flipping, use "upper-left", otherwise use "lower-left" 
     2443        bool flipping = mActiveRenderTarget->requiresTextureFlipping(); 
    24422444        //  GL measures from the bottom, not the top 
    24432445        size_t targetHeight = mActiveRenderTarget->getHeight(); 
     
    24502452            // NB GL uses width / height rather than right / bottom 
    24512453            x = left; 
     2454            if (flipping) 
     2455                y = top; 
     2456            else 
    24522457            y = targetHeight - bottom; 
    24532458            w = right - left; 
     
    24622467            h = mActiveViewport->getActualHeight(); 
    24632468            x = mActiveViewport->getActualLeft(); 
     2469            if (flipping) 
     2470                y = mActiveViewport->getActualTop(); 
     2471            else 
    24642472            y = targetHeight - mActiveViewport->getActualTop() - h; 
    24652473            glScissor(x, y, w, h); 
     
    25752583    HardwareOcclusionQuery* GLRenderSystem::createHardwareOcclusionQuery(void) 
    25762584    { 
    2577         return new GLHardwareOcclusionQuery();  
     2585        GLHardwareOcclusionQuery* ret = new GLHardwareOcclusionQuery();  
     2586                mHwOcclusionQueries.push_back(ret); 
     2587                return ret; 
    25782588    } 
    25792589    //--------------------------------------------------------------------- 
     
    26392649    } 
    26402650    //--------------------------------------------------------------------- 
     2651    void GLRenderSystem::_switchContext(GLContext *context) 
     2652    { 
     2653        // Unbind GPU programs and rebind to new context later, because 
     2654        // scene manager treat render system as ONE 'context' ONLY, and it 
     2655        // cached the GPU programs using state. 
     2656        if (mCurrentVertexProgram) 
     2657            mCurrentVertexProgram->unbindProgram(); 
     2658        if (mCurrentFragmentProgram) 
     2659            mCurrentFragmentProgram->unbindProgram(); 
     2660 
     2661        // It's ready to switching 
     2662            mCurrentContext->endCurrent(); 
     2663        mCurrentContext = context; 
     2664        mCurrentContext->setCurrent(); 
     2665         
     2666            // Check if the context has already done one-time initialisation 
     2667        if(!mCurrentContext->getInitialized())  
     2668        { 
     2669               _oneTimeContextInitialization(); 
     2670               mCurrentContext->setInitialized(); 
     2671            } 
     2672 
     2673        // Rebind GPU programs to new context 
     2674        if (mCurrentVertexProgram) 
     2675            mCurrentVertexProgram->bindProgram(); 
     2676        if (mCurrentFragmentProgram) 
     2677            mCurrentFragmentProgram->bindProgram(); 
     2678 
     2679        // Must reset depth/colour write mask to according with user desired, otherwise, 
     2680        // clearFrameBuffer would be wrong because the value we are recorded may be 
     2681        // difference with the really state stored in GL context. 
     2682        glDepthMask(mDepthWrite); 
     2683        glColorMask(mColourWrite[0], mColourWrite[1], mColourWrite[2], mColourWrite[3]); 
     2684 
     2685    } 
     2686    //--------------------------------------------------------------------- 
    26412687    void GLRenderSystem::_setRenderTarget(RenderTarget *target) 
    26422688    { 
     
    26452691        ContextMap::iterator i = mContextMap.find(target); 
    26462692        if(i != mContextMap.end() && mCurrentContext != i->second) { 
    2647             mCurrentContext->endCurrent(); 
    2648             mCurrentContext = i->second; 
    2649             // Check if the context has already done one-time initialisation 
    2650             if(!mCurrentContext->getInitialized()) { 
    2651                _oneTimeContextInitialization(); 
    2652                mCurrentContext->setInitialized(); 
    2653             } 
    2654             mCurrentContext->setCurrent(); 
     2693            _switchContext(i->second); 
    26552694        } 
    26562695    } 
     
    26692708            // we set the main context to 0. 
    26702709            if(mCurrentContext != mMainContext) { 
    2671                 mCurrentContext->endCurrent(); 
    2672                 mCurrentContext = mMainContext; 
    2673                 mCurrentContext->setCurrent(); 
     2710                _switchContext(mMainContext); 
    26742711            } else { 
    26752712                mMainContext = 0; 
  • OGRE/trunk/ogre_changes/RenderSystems/GL/src/OgreGLTexture.cpp

    r193 r657  
    6969        // have to call this here reather than in Resource destructor 
    7070        // since calling virtual methods in base destructors causes crash 
     71                if (mIsLoaded) 
     72                { 
    7173        unload();  
     74    } 
     75                else 
     76                { 
     77                        freeInternalResources(); 
     78                } 
    7279    } 
    7380 
     
    9097 
    9198        //* Creation / loading methods ******************************************** 
    92         void GLTexture::createInternalResources(void) 
     99        void GLTexture::createInternalResourcesImpl(void) 
    93100    { 
    94101                // Adjust requested parameters to capabilities 
     
    131138                // Zero means create mip levels until 1x1 
    132139                size_t maxMips = GLPixelUtil::getMaxMipmaps(mWidth, mHeight, mDepth, mFormat); 
     140                mNumMipmaps = mNumRequestedMipmaps; 
    133141                if(mNumMipmaps>maxMips) 
    134142                        mNumMipmaps = maxMips; 
     
    144152                 
    145153                // If we can do automip generation and the user desires this, do so 
     154                mMipmapsHardwareGenerated =  
     155                        Root::getSingleton().getRenderSystem()->getCapabilities()->hasCapability(RSC_AUTOMIPMAP); 
    146156                if((mUsage & TU_AUTOMIPMAP) && 
    147                     mNumMipmaps && 
    148                         Root::getSingleton().getRenderSystem()->getCapabilities()->hasCapability(RSC_AUTOMIPMAP)) 
     157                    mNumRequestedMipmaps && mMipmapsHardwareGenerated) 
    149158        { 
    150159            glTexParameteri( getGLTextureTarget(), GL_GENERATE_MIPMAP, GL_TRUE ); 
     
    242251                // Get final internal format 
    243252                mFormat = getBuffer(0,0)->getFormat(); 
    244                 mIsLoaded = true; 
    245253        } 
    246254         
     
    326334        //************************************************************************* 
    327335     
    328     void GLTexture::unloadImpl() 
     336    void GLTexture::freeInternalResourcesImpl() 
    329337    { 
    330338                mSurfaceList.clear(); 
     
    337345        { 
    338346                mSurfaceList.clear(); 
    339                 // Make our understanding of the number of mips matches the GL one 
    340                 glBindTexture( getGLTextureTarget(), mTextureID ); 
    341                 GLint value; 
    342                 glGetTexParameteriv( getGLTextureTarget(), GL_TEXTURE_MAX_LEVEL, &value ); 
    343                 mNumMipmaps = value; 
    344347                 
    345348                // For all faces and mipmaps, store surfaces as HardwarePixelBufferSharedPtr 
    346349                bool wantGeneratedMips = (mUsage & TU_AUTOMIPMAP)!=0; 
    347                 bool canMip = Root::getSingleton().getRenderSystem()->getCapabilities()->hasCapability(RSC_AUTOMIPMAP); 
    348350                 
    349351                // Do mipmapping in software? (uses GLU) For some cards, this is still needed. Of course, 
    350352                // only when mipmap generation is desired. 
    351                 bool doSoftware = wantGeneratedMips && !canMip && getNumMipmaps();  
     353                bool doSoftware = wantGeneratedMips && !mMipmapsHardwareGenerated && getNumMipmaps();  
    352354                 
    353355                for(int face=0; face<getNumFaces(); face++) 
  • OGRE/trunk/ogre_changes/RenderSystems/GL/src/OgreWin32Window.cpp

    r193 r657  
    226226                    } 
    227227 
     228                HDC old_hdc = wglGetCurrentDC(); 
     229                HGLRC old_context = wglGetCurrentContext(); 
     230 
    228231                        RECT rc; 
    229232                // top and left represent outer window position 
     
    255258                 
    256259                wglSwapIntervalEXT(vsync? 1 : 0); 
     260 
     261        if (old_context) 
     262        { 
     263            // Restore old context 
     264                    if (!wglMakeCurrent(old_hdc, old_context)) 
     265                            OGRE_EXCEPT(0, "wglMakeCurrent() failed", "Win32Window::create"); 
     266 
     267            // Share lists with old context 
     268                    if (!wglShareLists(old_context, mGlrc)) 
     269                            OGRE_EXCEPT(0, "wglShareLists() failed", " Win32Window::create"); 
     270        } 
    257271 
    258272        // Create RenderSystem context 
Note: See TracChangeset for help on using the changeset viewer.