00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00026
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
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
00062 ourInstance = new sfGraphicsDevice;
00063
00064
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
00083 std::for_each(ourResources.begin(), ourResources.end(), std::mem_fun(&sfVideoResource::DestroyVideoResources));
00084
00085
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
00117 glewInit();
00118
00119
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 }