]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CNSOGLManager.mm
Merging r5975 through r6036 from trunk to ogl-es branch.
[irrlicht.git] / source / Irrlicht / CNSOGLManager.mm
1 // Copyright (C) 2014 Patryk Nadrowski\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in Irrlicht.h\r
4 \r
5 #include "CNSOGLManager.h"\r
6 \r
7 #ifdef _IRR_COMPILE_WITH_NSOGL_MANAGER_\r
8 \r
9 #include "os.h"\r
10 \r
11 namespace irr\r
12 {\r
13 namespace video\r
14 {\r
15 \r
16 CNSOGLManager::CNSOGLManager()\r
17         : PrimaryContext(SExposedVideoData(0)), PixelFormat(nil)\r
18 {\r
19 #ifdef _DEBUG\r
20         setDebugName("CNSOGLManager");\r
21 #endif\r
22 }\r
23 \r
24 CNSOGLManager::~CNSOGLManager()\r
25 {\r
26 }\r
27 \r
28 bool CNSOGLManager::initialize(const SIrrlichtCreationParameters& params, const SExposedVideoData& videodata)\r
29 {\r
30         Params = params;\r
31 \r
32     return true;\r
33 }\r
34 \r
35 void CNSOGLManager::terminate()\r
36 {\r
37 }\r
38 \r
39 bool CNSOGLManager::generateSurface()\r
40 {    \r
41         if (Params.DriverType == video::EDT_OPENGL)\r
42         {\r
43         int alphaSize = Params.WithAlphaChannel ? 4 : 0;\r
44         int depthSize = Params.ZBufferBits;\r
45         \r
46         if (Params.WithAlphaChannel && Params.Bits == 32)\r
47             alphaSize = 8;\r
48         \r
49         NSOpenGLPixelFormatAttribute Attribs[] =\r
50         {\r
51             NSOpenGLPFANoRecovery,\r
52             NSOpenGLPFAAccelerated,\r
53             NSOpenGLPFADoubleBuffer,\r
54             NSOpenGLPFADepthSize, static_cast<NSOpenGLPixelFormatAttribute>(depthSize),\r
55             NSOpenGLPFAColorSize, Params.Bits,\r
56             NSOpenGLPFAAlphaSize, static_cast<NSOpenGLPixelFormatAttribute>(alphaSize),\r
57             NSOpenGLPFASampleBuffers, 1,\r
58             NSOpenGLPFASamples, Params.AntiAlias,\r
59             NSOpenGLPFAStencilSize, static_cast<NSOpenGLPixelFormatAttribute>(Params.Stencilbuffer ? 1 : 0),\r
60             //NSOpenGLPFAFullScreen,\r
61             0\r
62         };\r
63 \r
64         u32 Steps = 6;\r
65         \r
66         // Choose the best pixel format.\r
67         do\r
68         {\r
69             switch (Steps)\r
70             {\r
71             case 6: // decrease step.\r
72                 --Steps;\r
73                 break;\r
74             case 5: // samples\r
75                 if (Attribs[12] > 2)\r
76                     --Attribs[12];\r
77                 else\r
78                 {\r
79                     Attribs[10] = 0;\r
80                     Attribs[12] = 0;\r
81                     --Steps;\r
82                 }\r
83                 break;\r
84             case 4: // alpha\r
85                 if (Attribs[8])\r
86                 {\r
87                     Attribs[8] = 0;\r
88                         \r
89                     if (Params.AntiAlias)\r
90                     {\r
91                         Attribs[10] = 1;\r
92                         Attribs[12] = Params.AntiAlias;\r
93                         Steps = 5;\r
94                     }\r
95                 }\r
96                 else\r
97                     --Steps;\r
98                 break;\r
99             case 3: // stencil\r
100                 if (Attribs[14])\r
101                 {\r
102                     Attribs[14] = 0;\r
103                         \r
104                     if (Params.AntiAlias)\r
105                     {\r
106                         Attribs[10] = 1;\r
107                         Attribs[12] = Params.AntiAlias;\r
108                         Steps = 5;\r
109                     }\r
110                 }\r
111                 else\r
112                     --Steps;\r
113                 break;\r
114             case 2: // depth size\r
115                 if (Attribs[4] > 16)\r
116                 {\r
117                     Attribs[4] = Attribs[4] - 8;\r
118                 }\r
119                 else\r
120                     --Steps;\r
121                 break;\r
122             case 1: // buffer size\r
123                 if (Attribs[6] > 16)\r
124                 {\r
125                     Attribs[6] = Attribs[6] - 8;\r
126                 }\r
127                 else\r
128                     --Steps;\r
129                 break;\r
130             default:\r
131                 os::Printer::log("Could not get pixel format.");\r
132                 return false;\r
133             }\r
134             \r
135             PixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:Attribs];\r
136         }\r
137         while (PixelFormat == nil);\r
138         \r
139         if (Params.AntiAlias && !Attribs[10])\r
140             os::Printer::log("No multisampling.");\r
141         \r
142         if (Params.WithAlphaChannel && !Attribs[8])\r
143             os::Printer::log("No alpha.");\r
144         \r
145         if (Params.Stencilbuffer && !Attribs[14])\r
146             os::Printer::log("No stencil buffer.");\r
147         \r
148         if (Params.ZBufferBits > Attribs[4])\r
149             os::Printer::log("No full depth buffer.");\r
150         \r
151         if (Params.Bits > Attribs[6])\r
152             os::Printer::log("No full color buffer.");\r
153         }\r
154 \r
155     return true;\r
156 }\r
157 \r
158 void CNSOGLManager::destroySurface()\r
159 {\r
160     [PixelFormat release];\r
161     PixelFormat = nil;\r
162 }\r
163 \r
164 bool CNSOGLManager::generateContext()\r
165 {\r
166     NSOpenGLContext* Context = [[NSOpenGLContext alloc] initWithFormat:PixelFormat shareContext:nil];\r
167     \r
168     GLint Vsync = Params.Vsync ? 1 : 0;\r
169     [Context setValues:&Vsync forParameter:NSOpenGLCPSwapInterval];\r
170 \r
171         if (Context == nil)\r
172         {\r
173                 os::Printer::log("Could not create OpenGL context.", ELL_ERROR);\r
174                 return false;\r
175         }\r
176 \r
177         // set exposed data\r
178         CurrentContext.OpenGLOSX.Context = Context;\r
179     \r
180         if (!PrimaryContext.OpenGLOSX.Context)\r
181                 PrimaryContext.OpenGLOSX.Context = CurrentContext.OpenGLOSX.Context;\r
182 \r
183         return true;\r
184 }\r
185 \r
186 const SExposedVideoData& CNSOGLManager::getContext() const\r
187 {\r
188         return CurrentContext;\r
189 }\r
190 \r
191 bool CNSOGLManager::activateContext(const SExposedVideoData& videoData)\r
192 {\r
193     if (videoData.OpenGLOSX.Context)\r
194     {\r
195         if ((NSOpenGLContext*)videoData.OpenGLOSX.Context != [NSOpenGLContext currentContext])\r
196         {\r
197             [(NSOpenGLContext*)videoData.OpenGLOSX.Context makeCurrentContext];\r
198             \r
199             CurrentContext = videoData;\r
200         }\r
201     }\r
202     // set back to main context\r
203     else\r
204     {\r
205         if ((NSOpenGLContext*)PrimaryContext.OpenGLOSX.Context != [NSOpenGLContext currentContext])\r
206         {\r
207             [(NSOpenGLContext*)PrimaryContext.OpenGLOSX.Context makeCurrentContext];\r
208             \r
209             CurrentContext = PrimaryContext;\r
210         }\r
211     }\r
212     \r
213         return true;\r
214 }\r
215 \r
216 void CNSOGLManager::destroyContext()\r
217 {\r
218         if (CurrentContext.OpenGLOSX.Context)\r
219         {\r
220         if (PrimaryContext.OpenGLOSX.Context == CurrentContext.OpenGLOSX.Context)\r
221             PrimaryContext.OpenGLOSX.Context = nil;\r
222 \r
223                 [(NSOpenGLContext*)CurrentContext.OpenGLOSX.Context makeCurrentContext];\r
224         [(NSOpenGLContext *)CurrentContext.OpenGLOSX.Context clearDrawable];\r
225         [(NSOpenGLContext *)CurrentContext.OpenGLOSX.Context release];\r
226                 [NSOpenGLContext clearCurrentContext];\r
227         \r
228                 CurrentContext.OpenGLOSX.Context = nil;\r
229         }\r
230 }\r
231 \r
232 bool CNSOGLManager::swapBuffers()\r
233 {\r
234     [(NSOpenGLContext*)CurrentContext.OpenGLOSX.Context flushBuffer];\r
235 \r
236         return true;\r
237 }\r
238 \r
239 }\r
240 }\r
241 \r
242 #endif\r