KeosRenderSystem.cpp

Go to the documentation of this file.
00001 /*
00002  * This source file is part of KEOS (Free 3D Engine)
00003  * For the latest info, see http://www.keosengine.org/
00004  * E-mails : thierry.vouriot@keosengine.org, yeri@keosengine.org
00005  *
00006  * This program is free software; you can redistribute it and/or modify it under
00007  * the terms of the GNU Lesser General Public License as published by the Free Software
00008  * Foundation; either version 2 of the License, or (at your option) any later
00009  * version.
00010  *
00011  * This program is distributed in the hope that it will be useful, but WITHOUT
00012  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00013  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public License along with
00016  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00017  * Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00018  * http://www.gnu.org/copyleft/lesser.txt.
00019  *
00020  */
00021 #include "KeosRenderSystem.h"
00022 #include "KeosRoot.h"
00023 #include "KeosLogger.h"
00024 #include "KeosPlatformManager.h"
00025 
00026 namespace Keos
00027 {
00028   //=======================================================================
00029   // IRenderSystem implementation
00030   //=======================================================================
00031 
00032   //-----------------------------------------------------------------------
00033   IRenderSystem::IRenderSystem()
00034   {
00035     m_pRenderWindow = NULL;
00036 
00037     m_pCapabilities = new CRenderSystemCapabilities();
00038 
00039     InitConfigOptions();
00040   }
00041 
00042   //-----------------------------------------------------------------------
00043   IRenderSystem::~IRenderSystem()
00044   {
00045     delete m_pCapabilities;
00046   }
00047 
00048   //-----------------------------------------------------------------------
00049   IRenderWindow* IRenderSystem::Initialise(bool bAutoCreateWindow, const String& strWindowTitle)
00050   {
00051     return NULL;
00052   }
00053 
00054   //-----------------------------------------------------------------------
00055   void IRenderSystem::Shutdown(void)
00056   {
00057     CRoot::Instance().StopRendering();
00058 
00059     // Remove all the render targets.
00060     for ( RenderTargetMap::iterator it = m_RenderTargets.begin(); it != m_RenderTargets.end(); ++it )
00061     {
00062       delete it->second;
00063     }
00064     m_RenderTargets.clear();
00065 
00066     ILogger::Log("<-- Shutdown RenderSystem");
00067   }
00068 
00069   //-----------------------------------------------------------------------
00070   void IRenderSystem::DestroyRenderTarget(const String& strName)
00071   {
00072     IRenderTarget* rt = DetachRenderTarget(strName);
00073     delete rt;
00074   }
00075 
00076   //-----------------------------------------------------------------------
00077   IRenderTarget* IRenderSystem::GetRenderTarget( const String &strName )
00078   {
00079     RenderTargetMap::iterator it = m_RenderTargets.find( strName );
00080     IRenderTarget *ret = NULL;
00081 
00082     if ( it != m_RenderTargets.end() )
00083     {
00084       ret = it->second;
00085     }
00086 
00087     return ret;
00088   }
00089 
00090   //-----------------------------------------------------------------------
00091   bool IRenderSystem::SetRenderApp(IRenderApp* pRenderApp, String& strTargetName)
00092   {
00093     RenderTargetMap::iterator it = m_RenderTargets.find( strTargetName );
00094     bool ret = false;
00095     if ( it != m_RenderTargets.end() )
00096     {
00097       ret = true;
00098       it->second->SetRenderApp(pRenderApp);
00099     }
00100     return ret;
00101   }
00102 
00103   //-----------------------------------------------------------------------
00104   void IRenderSystem::AttachRenderTarget( IRenderTarget& target, bool bIsWindow )
00105   {
00106     m_RenderTargets.insert( RenderTargetMap::value_type( target.GetName(), &target ) );
00107     if (bIsWindow)
00108       m_pRenderWindow = (IRenderWindow*)(&target);
00109   }
00110 
00111   //---------------------------------------------------------------------------------------------
00112   IRenderTarget* IRenderSystem::DetachRenderTarget( const String &strName )
00113   {
00114     RenderTargetMap::iterator it = m_RenderTargets.find( strName );
00115     IRenderTarget *ret = NULL;
00116 
00117     if ( it != m_RenderTargets.end() )
00118     {
00119       ret = it->second;
00120 
00121       m_RenderTargets.erase( it );
00122     }
00123 
00124     return ret;
00125   }
00126 
00127   //-----------------------------------------------------------------------
00128   void IRenderSystem::InitAllRenderTargets(void)
00129   {
00130     // Init stats
00131     for (
00132       RenderTargetMap::iterator it = m_RenderTargets.begin();
00133       it != m_RenderTargets.end();
00134       ++it )
00135     {
00136       it->second->ResetStatistics();
00137       it->second->Init();
00138     }
00139   }
00140 
00141   //-----------------------------------------------------------------------
00142   void IRenderSystem::UpdateAllRenderTargets(void)
00143   {
00144     Assert(m_pRenderWindow != NULL);
00145 
00146     // Si on ferme la fenetre on arrete le rendu
00147     // Valide uniquement parcque il ne peut y avoir qu'une fenetre
00148     if (m_pRenderWindow->IsClosed())
00149       CRoot::Instance().StopRendering();
00150 
00151     if ( m_pRenderWindow->IsActive() && m_pRenderWindow->IsAutoUpdated())
00152     {
00153       BeginScene();
00154       m_pRenderWindow->Update();
00155       EndScene();
00156       m_pRenderWindow->SwapBuffers(false);
00157     }
00158 
00159     RenderTargetMap::iterator itarg, itargend;
00160     itargend = m_RenderTargets.end();
00161     for ( itarg = m_RenderTargets.begin(); itarg != itargend; ++itarg )
00162     {
00163       if ( m_pRenderWindow != itarg->second &&
00164            itarg->second->IsActive() && itarg->second->IsAutoUpdated())
00165       {
00166         BeginScene();
00167         itarg->second->Update();
00168         EndScene();
00169       }
00170     }
00171   }
00172 
00173   //-----------------------------------------------------------------------
00174   void IRenderSystem::InitConfigOptions()
00175   {
00176     ConfigOption optVideoMode;
00177     ConfigOption optColorDepth;
00178     ConfigOption optFullScreen;
00179     ConfigOption optVSync;
00180 
00181     optVideoMode.name = "Video Mode";
00182     /*optVideoMode.possibleValues.push_back( "320x200" );
00183           optVideoMode.possibleValues.push_back( "640x480" );
00184           optVideoMode.possibleValues.push_back( "800x600" );
00185           optVideoMode.possibleValues.push_back( "1024x768" );
00186           optVideoMode.possibleValues.push_back( "1280x1024" );
00187           optVideoMode.possibleValues.push_back( "1600x1200" );*/
00188     CPlatformManager::Instance().GetVideoModeList(&(optVideoMode.possibleValues));
00189     optVideoMode.currentValue = optVideoMode.possibleValues.front();
00190     optVideoMode.immutable = false;
00191 
00192     optColorDepth.name = "Color Depth";
00193     optColorDepth.possibleValues.push_back( "16" );
00194     optColorDepth.possibleValues.push_back( "32" );
00195     optColorDepth.currentValue = "32";
00196     optColorDepth.immutable = false;
00197 
00198     optFullScreen.name = "Fullscreen";
00199     optFullScreen.possibleValues.push_back( "yes" );
00200     optFullScreen.possibleValues.push_back( "no" );
00201     optFullScreen.currentValue = "no";
00202     optFullScreen.immutable = false;
00203 
00204     //optVSync.name = "vsync";
00205     //optVSync.immutable = false;
00206     //optVSync.possibleValues.push_back( "yes" );
00207     //optVSync.possibleValues.push_back( "no" );
00208     //optVSync.currentValue = "no";
00209 
00210     m_Options[optVideoMode.name] = optVideoMode;
00211     m_Options[optColorDepth.name] = optColorDepth;
00212     m_Options[optFullScreen.name] = optFullScreen;
00213     //m_Options[optVSync.name] = optVSync;
00214   }
00215 
00216   //-----------------------------------------------------------------------
00217   void IRenderSystem::SetConfigOption(const String& strName, const String& strValue)
00218   {
00219     // Find option
00220     ConfigOptionMap::iterator it = m_Options.find(strName);
00221 
00222     // Update
00223     if ( it != m_Options.end())
00224       it->second.currentValue = strValue;
00225     else
00226     {
00227       ILogger::Log("Option named \"%s\" does not exist !", strName.c_str());
00228     }
00229   }
00230 
00231   //-----------------------------------------------------------------------
00232   CGprofile IRenderSystem::GetShaderProfile(TShaderType Type) const
00233   {
00234     return Type == SHADER_VERTEX ? m_VSProfile : m_PSProfile;
00235   }
00236 
00237   //-----------------------------------------------------------------------
00238   const char* const* IRenderSystem::GetShaderOptions(TShaderType Type) const
00239   {
00240     return Type == SHADER_VERTEX ? m_VSOptions : m_PSOptions;
00241   }
00242 
00243 
00244 } // namespace Keos

Generated on Fri Mar 9 14:29:03 2007 for Keos by  doxygen 1.5.1-p1