D:/Programmation/Cpp/SFML/src/SFML/Graphics/GraphicsDevice.cpp

00001 
00002 //
00003 // SFML - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00026 // Headers
00028 #include <SFML/Graphics/GraphicsDevice.hpp>
00029 #include <SFML/Graphics/OpenGL.hpp>
00030 #include <SFML/Graphics/VideoResource.hpp>
00031 #include <algorithm>
00032 
00033 
00034 namespace sf_private
00035 {
00037 // Static member data
00039 sfGraphicsDevice*          sfGraphicsDevice::ourInstance   = NULL;
00040 unsigned int               sfGraphicsDevice::ourReferences = 0;
00041 std::set<sfVideoResource*> sfGraphicsDevice::ourResources;
00042 
00043 
00047 sfGraphicsDevice* sfGraphicsDevice::GetInstance()
00048 {
00049     return ourInstance;
00050 }
00051 
00052 
00057 void sfGraphicsDevice::Initialize()
00058 {
00059     if (ourReferences == 0)
00060     {
00061         // Create the renderer
00062         ourInstance = new sfGraphicsDevice;
00063 
00064         // Notify resources
00065         std::for_each(ourResources.begin(), ourResources.end(), std::mem_fun(&sfVideoResource::InitVideoResources));
00066     }
00067 
00068     ourReferences++;
00069 }
00070 
00071 
00076 void sfGraphicsDevice::Shutdown()
00077 {
00078     ourReferences--;
00079 
00080     if (ourReferences == 0)
00081     {
00082         // Notify resources
00083         std::for_each(ourResources.begin(), ourResources.end(), std::mem_fun(&sfVideoResource::DestroyVideoResources));
00084 
00085         // Delete the renderer
00086         delete ourInstance;
00087         ourInstance = NULL;
00088     }
00089 }
00090 
00091 
00095 void sfGraphicsDevice::AddVideoResource(sfVideoResource* Resource)
00096 {
00097     if (Resource)
00098         ourResources.insert(Resource);
00099 }
00100 
00101 
00105 void sfGraphicsDevice::RemoveVideoResource(sfVideoResource* Resource)
00106 {
00107     ourResources.erase(Resource);
00108 }
00109 
00110 
00114 sfGraphicsDevice::sfGraphicsDevice()
00115 {
00116     // Initialize GLEW
00117     glewInit();
00118 
00119     // Fill capabilities
00120     myCapabilities.FrameBufferObject     = glewIsSupported("GL_EXT_framebuffer_object") != 0;
00121     myCapabilities.NonPowerOfTwoTextures = glewIsSupported("GL_ARB_texture_non_power_of_two") != 0;
00122     myCapabilities.CanDoPostFX           = glewIsSupported("GL_ARB_shading_language_100") &&
00123                                            glewIsSupported("GL_ARB_shader_objects")       &&
00124                                            glewIsSupported("GL_ARB_vertex_shader")        &&
00125                                            glewIsSupported("GL_ARB_fragment_shader");
00126     glGetIntegerv(GL_MAX_TEXTURE_SIZE,       &myCapabilities.MaxTextureSize);
00127     glGetIntegerv(GL_MAX_TEXTURE_COORDS_ARB, &myCapabilities.MaxTextureUnits);
00128 }
00129 
00130 
00134 const sfGraphicsDevice::Capabilities& sfGraphicsDevice::GetCapabilities() const
00135 {
00136     return myCapabilities;
00137 }
00138 
00139 } // namespace sf_private

Generated for SFML by  doxygen 1.5.2