<html> <head> <title>OgreProfiler.h Source File - OGRE Documentation</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link type="text/css" rel="stylesheet" href="style.css"> </head> <body> <!-- Generated by Doxygen 1.3.6 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="pages.html">Related Pages</a></div> <h1>OgreProfiler.h</h1><a href="OgreProfiler_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/*</span> 00002 <span class="comment">-----------------------------------------------------------------------------</span> 00003 <span class="comment">This source file is part of OGRE</span> 00004 <span class="comment"> (Object-oriented Graphics Rendering Engine)</span> 00005 <span class="comment">For the latest info, see http://www.ogre3d.org/</span> 00006 <span class="comment"></span> 00007 <span class="comment">Copyright (c) 2000-2005 The OGRE Team</span> 00008 <span class="comment">Also see acknowledgements in Readme.html</span> 00009 <span class="comment"></span> 00010 <span class="comment">This program is free software; you can redistribute it and/or modify it under</span> 00011 <span class="comment">the terms of the GNU Lesser General Public License as published by the Free Software</span> 00012 <span class="comment">Foundation; either version 2 of the License, or (at your option) any later</span> 00013 <span class="comment">version.</span> 00014 <span class="comment"></span> 00015 <span class="comment">This program is distributed in the hope that it will be useful, but WITHOUT</span> 00016 <span class="comment">ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span> 00017 <span class="comment">FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</span> 00018 <span class="comment"></span> 00019 <span class="comment">You should have received a copy of the GNU Lesser General Public License along with</span> 00020 <span class="comment">this program; if not, write to the Free Software Foundation, Inc., 59 Temple</span> 00021 <span class="comment">Place - Suite 330, Boston, MA 02111-1307, USA, or go to</span> 00022 <span class="comment">http://www.gnu.org/copyleft/lesser.txt.</span> 00023 <span class="comment">-----------------------------------------------------------------------------</span> 00024 <span class="comment">*/</span> 00025 <span class="comment">/*</span> 00026 <span class="comment"></span> 00027 <span class="comment"> Although the code is original, many of the ideas for the profiler were borrowed from </span> 00028 <span class="comment">"Real-Time In-Game Profiling" by Steve Rabin which can be found in Game Programming</span> 00029 <span class="comment">Gems 1.</span> 00030 <span class="comment"></span> 00031 <span class="comment"> This code can easily be adapted to your own non-Ogre project. The only code that is </span> 00032 <span class="comment">Ogre-dependent is in the visualization/logging routines and the use of the Timer class.</span> 00033 <span class="comment"></span> 00034 <span class="comment"> Enjoy!</span> 00035 <span class="comment"></span> 00036 <span class="comment">*/</span> 00037 00038 <span class="preprocessor">#ifndef __Profiler_H__</span> 00039 <span class="preprocessor"></span><span class="preprocessor">#define __Profiler_H__</span> 00040 <span class="preprocessor"></span> 00041 <span class="preprocessor">#include "<a class="code" href="OgrePrerequisites_8h.html">OgrePrerequisites.h</a>"</span> 00042 <span class="preprocessor">#include "<a class="code" href="OgreSingleton_8h.html">OgreSingleton.h</a>"</span> 00043 <span class="preprocessor">#include "<a class="code" href="OgreString_8h.html">OgreString.h</a>"</span> 00044 <span class="preprocessor">#include "<a class="code" href="OgreOverlay_8h.html">OgreOverlay.h</a>"</span> 00045 00046 <span class="preprocessor">#if OGRE_PROFILING == 1</span> 00047 <span class="preprocessor"></span><span class="preprocessor"># if OGRE_COMPILER != OGRE_COMPILER_BORL</span> 00048 <span class="preprocessor"></span><span class="preprocessor"># define OgreProfile( a ) Ogre::Profile _OgreProfileInstance( (a) )</span> 00049 <span class="preprocessor"></span><span class="preprocessor"># define OgreProfileBegin( a ) Ogre::Profiler::getSingleton().beginProfile( (a) )</span> 00050 <span class="preprocessor"></span><span class="preprocessor"># define OgreProfileEnd( a ) Ogre::Profiler::getSingleton().endProfile( (a) )</span> 00051 <span class="preprocessor"></span><span class="preprocessor"># else</span> 00052 <span class="preprocessor"></span><span class="preprocessor"># define OgreProfile( a ) Ogre::Profile _OgreProfileInstance( __FUNC__ )</span> 00053 <span class="preprocessor"></span><span class="preprocessor"># define OgreProfileBegin( a ) Ogre::Profiler::getSingleton().beginProfile( __FUNC__ )</span> 00054 <span class="preprocessor"></span><span class="preprocessor"># define OgreProfileEnd( a ) Ogre::Profiler::getSingleton().endProfile( __FUNC__ )</span> 00055 <span class="preprocessor"></span><span class="preprocessor"># endif</span> 00056 <span class="preprocessor"></span><span class="preprocessor">#else</span> <a name="l00057"></a><a class="code" href="OgreProfiler_8h.html#a0">00057</a> <span class="preprocessor"></span><span class="preprocessor"># define OgreProfile( a )</span> <a name="l00058"></a><a class="code" href="OgreProfiler_8h.html#a1">00058</a> <span class="preprocessor"></span><span class="preprocessor"># define OgreProfileBegin( a )</span> <a name="l00059"></a><a class="code" href="OgreProfiler_8h.html#a2">00059</a> <span class="preprocessor"></span><span class="preprocessor"># define OgreProfileEnd( a )</span> 00060 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 00061 <span class="preprocessor"></span> 00062 <span class="keyword">namespace </span>Ogre { 00063 <a name="l00074"></a><a class="code" href="classOgre_1_1Profile.html">00074</a> <span class="keyword">class </span><a class="code" href="OgrePlatform_8h.html#a13">_OgreExport</a> Profile { 00075 00076 <span class="keyword">public</span>: 00077 Profile(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName); 00078 ~Profile(); 00079 00080 <span class="keyword">protected</span>: 00081 <a name="l00083"></a><a class="code" href="classOgre_1_1Profile.html#Ogre_1_1Profilep0">00083</a> <a class="code" href="namespaceOgre.html#a426">String</a> mName; 00084 00085 00086 }; 00087 <a name="l00099"></a><a class="code" href="classOgre_1_1Profiler.html">00099</a> <span class="keyword">class </span><a class="code" href="class__OgreExport.html">_OgreExport</a> Profiler : <span class="keyword">public</span> <a class="code" href="classOgre_1_1Singleton.html">Singleton</a><Profiler> { 00100 00101 <span class="keyword">public</span>: 00102 Profiler(); 00103 ~Profiler(); 00104 00106 <span class="keywordtype">void</span> setTimer(<a class="code" href="classOgre_1_1Timer.html">Timer</a>* t); 00107 00109 <a class="code" href="classOgre_1_1Timer.html">Timer</a>* getTimer(); 00110 00123 <span class="keywordtype">void</span> beginProfile(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName); 00124 00137 <span class="keywordtype">void</span> endProfile(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName); 00138 00144 <span class="keywordtype">void</span> setEnabled(<span class="keywordtype">bool</span> enabled); 00145 00147 <span class="keywordtype">bool</span> getEnabled() <span class="keyword">const</span>; 00148 00153 <span class="keywordtype">void</span> enableProfile(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName); 00154 00159 <span class="keywordtype">void</span> disableProfile(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName); 00160 00166 <span class="keywordtype">bool</span> watchForMax(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName); 00167 00173 <span class="keywordtype">bool</span> watchForMin(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName); 00174 00184 <span class="keywordtype">bool</span> watchForLimit(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& profileName, <a class="code" href="namespaceOgre.html#a420">Real</a> limit, <span class="keywordtype">bool</span> greaterThan = <span class="keyword">true</span>); 00185 00187 <span class="keywordtype">void</span> logResults(); 00188 00190 <span class="keywordtype">void</span> reset(); 00191 00193 <span class="keywordtype">void</span> setUpdateDisplayFrequency(<a class="code" href="namespaceOgre.html#a423">uint</a> freq); 00194 00196 <a class="code" href="namespaceOgre.html#a423">uint</a> getUpdateDisplayFrequency() <span class="keyword">const</span>; 00197 00213 <span class="keyword">static</span> Profiler& getSingleton(<span class="keywordtype">void</span>); 00229 <span class="keyword">static</span> Profiler* getSingletonPtr(<span class="keywordtype">void</span>); 00230 00231 <span class="keyword">protected</span>: 00232 00234 <span class="keywordtype">void</span> initialize(); 00235 00237 <span class="keywordtype">void</span> displayResults(); 00238 00240 <span class="keywordtype">void</span> processFrameStats(); 00241 00243 <span class="keywordtype">void</span> changeEnableState(); 00244 00246 <a class="code" href="classOgre_1_1OverlayContainer.html">OverlayContainer</a>* createContainer(); 00247 00249 <a class="code" href="classOgre_1_1OverlayElement.html">OverlayElement</a>* createTextArea(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& name, <a class="code" href="namespaceOgre.html#a420">Real</a> width, <a class="code" href="namespaceOgre.html#a420">Real</a> height, <a class="code" href="namespaceOgre.html#a420">Real</a> top, <a class="code" href="namespaceOgre.html#a420">Real</a> left, 00250 <a class="code" href="namespaceOgre.html#a423">uint</a> fontSize, <span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& caption, <span class="keywordtype">bool</span> show = <span class="keyword">true</span>); 00251 00253 <a class="code" href="classOgre_1_1OverlayElement.html">OverlayElement</a>* createPanel(<span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& name, <a class="code" href="namespaceOgre.html#a420">Real</a> width, <a class="code" href="namespaceOgre.html#a420">Real</a> height, <a class="code" href="namespaceOgre.html#a420">Real</a> top, <a class="code" href="namespaceOgre.html#a420">Real</a> left, 00254 <span class="keyword">const</span> <a class="code" href="namespaceOgre.html#a426">String</a>& materialName, <span class="keywordtype">bool</span> show = <span class="keyword">true</span>); 00255 <a name="l00257"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileInstance.html">00257</a> <span class="keyword">struct </span><a class="code" href="structOgre_1_1Profiler_1_1ProfileInstance.html">ProfileInstance</a> { 00258 <a name="l00260"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileInstance.html#Ogre_1_1Profiler_1_1ProfileInstanceo0">00260</a> <a class="code" href="namespaceOgre.html#a426">String</a> name; 00261 <a name="l00263"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileInstance.html#Ogre_1_1Profiler_1_1ProfileInstanceo1">00263</a> <a class="code" href="namespaceOgre.html#a426">String</a> parent; 00264 <a name="l00266"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileInstance.html#Ogre_1_1Profiler_1_1ProfileInstanceo2">00266</a> <a class="code" href="namespaceOgre.html#a424">ulong</a> currTime; 00267 <a name="l00270"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileInstance.html#Ogre_1_1Profiler_1_1ProfileInstanceo3">00270</a> <a class="code" href="namespaceOgre.html#a424">ulong</a> accum; 00271 <a name="l00273"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileInstance.html#Ogre_1_1Profiler_1_1ProfileInstanceo4">00273</a> <a class="code" href="namespaceOgre.html#a423">uint</a> hierarchicalLvl; 00274 }; 00275 <a name="l00278"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileFrame.html">00278</a> <span class="keyword">struct </span><a class="code" href="structOgre_1_1Profiler_1_1ProfileFrame.html">ProfileFrame</a> { 00279 <a name="l00281"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileFrame.html#Ogre_1_1Profiler_1_1ProfileFrameo0">00281</a> <a class="code" href="namespaceOgre.html#a426">String</a> name; 00282 <a name="l00284"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileFrame.html#Ogre_1_1Profiler_1_1ProfileFrameo1">00284</a> <a class="code" href="namespaceOgre.html#a424">ulong</a> frameTime; 00285 <a name="l00287"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileFrame.html#Ogre_1_1Profiler_1_1ProfileFrameo2">00287</a> <a class="code" href="namespaceOgre.html#a423">uint</a> calls; 00288 <a name="l00290"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileFrame.html#Ogre_1_1Profiler_1_1ProfileFrameo3">00290</a> <a class="code" href="namespaceOgre.html#a423">uint</a> hierarchicalLvl; 00291 00292 }; 00293 <a name="l00295"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html">00295</a> <span class="keyword">struct </span><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html">ProfileHistory</a> { 00296 <a name="l00298"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo0">00298</a> <a class="code" href="namespaceOgre.html#a426">String</a> name; 00299 <a name="l00301"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo1">00301</a> <a class="code" href="namespaceOgre.html#a420">Real</a> currentTime; <span class="comment">// %</span> 00302 <a name="l00304"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo2">00304</a> <a class="code" href="namespaceOgre.html#a420">Real</a> maxTime; <span class="comment">// %</span> 00305 <a name="l00307"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo3">00307</a> <a class="code" href="namespaceOgre.html#a420">Real</a> minTime; <span class="comment">// %</span> 00308 <a name="l00310"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo4">00310</a> <a class="code" href="namespaceOgre.html#a423">uint</a> numCallsThisFrame; 00311 <a name="l00314"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo5">00314</a> <a class="code" href="namespaceOgre.html#a420">Real</a> totalTime; <span class="comment">// %</span> 00315 <a name="l00318"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo6">00318</a> <a class="code" href="namespaceOgre.html#a424">ulong</a> totalCalls; <span class="comment">// %</span> 00319 <a name="l00321"></a><a class="code" href="structOgre_1_1Profiler_1_1ProfileHistory.html#Ogre_1_1Profiler_1_1ProfileHistoryo7">00321</a> <a class="code" href="namespaceOgre.html#a423">uint</a> hierarchicalLvl; 00322 00323 }; 00324 00325 <a name="l00326"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx0">00326</a> <span class="keyword">typedef</span> std::list<ProfileInstance> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx0">ProfileStack</a>; <a name="l00327"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx1">00327</a> <span class="keyword">typedef</span> std::list<ProfileFrame> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx1">ProfileFrameList</a>; <a name="l00328"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx2">00328</a> <span class="keyword">typedef</span> std::list<ProfileHistory> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx2">ProfileHistoryList</a>; <a name="l00329"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx3">00329</a> <span class="keyword">typedef</span> std::map<String, ProfileHistoryList::iterator> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx3">ProfileHistoryMap</a>; <a name="l00330"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx4">00330</a> <span class="keyword">typedef</span> std::map<String, bool> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx4">DisabledProfileMap</a>; 00331 <a name="l00332"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx5">00332</a> <span class="keyword">typedef</span> std::list<OverlayElement*> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx5">ProfileBarList</a>; 00333 <a name="l00335"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp0">00335</a> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx0">ProfileStack</a> mProfiles; 00336 <a name="l00339"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp1">00339</a> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx1">ProfileFrameList</a> mProfileFrame; 00340 <a name="l00342"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp2">00342</a> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx2">ProfileHistoryList</a> mProfileHistory; 00343 <a name="l00345"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp3">00345</a> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx3">ProfileHistoryMap</a> mProfileHistoryMap; 00346 <a name="l00348"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp4">00348</a> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx4">DisabledProfileMap</a> mDisabledProfiles; 00349 <a name="l00351"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp5">00351</a> <a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerx5">ProfileBarList</a> mProfileBars; 00352 <a name="l00354"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp6">00354</a> <span class="keywordtype">bool</span> mInitialized; 00355 <a name="l00357"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp7">00357</a> <a class="code" href="namespaceOgre.html#a423">uint</a> maxProfiles; 00358 <a name="l00360"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp8">00360</a> <a class="code" href="classOgre_1_1Overlay.html">Overlay</a>* mOverlay; 00361 <a name="l00363"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp9">00363</a> <a class="code" href="classOgre_1_1OverlayContainer.html">OverlayContainer</a>* mProfileGui; 00364 <a name="l00366"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp10">00366</a> <a class="code" href="namespaceOgre.html#a420">Real</a> mBarHeight; 00367 <a name="l00369"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp11">00369</a> <a class="code" href="namespaceOgre.html#a420">Real</a> mGuiHeight; 00370 <a name="l00372"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp12">00372</a> <a class="code" href="namespaceOgre.html#a420">Real</a> mGuiWidth; 00373 <a name="l00375"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp13">00375</a> <a class="code" href="namespaceOgre.html#a420">Real</a> mBarIndent; 00376 <a name="l00378"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp14">00378</a> <a class="code" href="namespaceOgre.html#a420">Real</a> mGuiBorderWidth; 00379 <a name="l00381"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp15">00381</a> <a class="code" href="namespaceOgre.html#a420">Real</a> mBarLineWidth; 00382 <a name="l00385"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp16">00385</a> <a class="code" href="namespaceOgre.html#a423">uint</a> mUpdateDisplayFrequency; 00386 <a name="l00388"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp17">00388</a> <a class="code" href="namespaceOgre.html#a423">uint</a> mCurrentFrame; 00389 <a name="l00391"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp18">00391</a> <a class="code" href="classOgre_1_1Timer.html">Timer</a>* mTimer; 00392 <a name="l00394"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp19">00394</a> <a class="code" href="namespaceOgre.html#a424">ulong</a> mTotalFrameTime; 00395 <a name="l00397"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp20">00397</a> <span class="keywordtype">bool</span> mEnabled; 00398 <a name="l00401"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp21">00401</a> <span class="keywordtype">bool</span> mEnableStateChangePending; 00402 <a name="l00405"></a><a class="code" href="classOgre_1_1Profiler.html#Ogre_1_1Profilerp22">00405</a> <span class="keywordtype">bool</span> mNewEnableState; 00406 00407 }; <span class="comment">// end class</span> 00408 00409 } <span class="comment">// end namespace</span> 00410 00411 <span class="preprocessor">#endif</span> </pre></div><p> Copyright © 2000-2005 by The OGRE Team<br /> Last modified Wed Feb 23 00:19:11 2005 </p> </body> </html>