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
1.5.1-p1